本文主要是介绍Matplotlib:可视化箱线图boxplot,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
箱线图统计学知识
- 上限值:Q1-1.5×IQR
- 上相邻值:距离上限值最近的值
- 须线:上下分位数各自与上下相邻值的距离
- 上四分位数(Q1):一组数据按顺序排列,从小至大第25%位置的数值
- 中位数:一组数据按顺序排列,从小至大第50%位置的数值
- 中位线(IQR):Q3-Q1上四分位数至下四分位数的距离
- 下四分位数(Q3):一组数据按顺序排列,从小至大第75%位置的数值
- 下相邻值:距离下限值最近的值
- 下限值:Q3+1.5×IQR
- 离群值(异常值):一组数据中超过上下限的真实值
对照正态分布图来参考:
如果中位线往右偏移,那么数据呈左偏分布;
如果中位线往左偏移,那么数据呈右偏分布
箱形图又称为盒须图,盒式图或箱线图。是一种用作显示一组数据分散情况资料的统计图。
plt.boxplot( x, notch=None, sym=None,vert=None, whis=None, positions=None, widths=None, patch_artist=None, meanline=None, showmeans=None, showcaps=None, showbox=None, showfliers=None, boxprops=None, labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None, whiskerprops=None)
x
:指定要绘制箱线图的数据;- notch:是否是凹口的形式展现箱线图,默认非凹口;
sym
:指定异常点的形状,默认为+号显示;- vert:是否需要将箱线图垂直摆放,默认垂直摆放;
whis
:指定上下须与上下四分位的距离,默认为1.5倍的四分位差;- positions:指定箱线图的位置,默认为[0,1,2…];
- widths:指定箱线图的宽度,默认为0.5;
patch_artist
:是否填充箱体的颜色;- meanline:是否用线的形式表示均值,默认用点来表示;
- showmeans:是否显示均值,默认不显示;
- showcaps:是否显示箱线图顶端和末端的两条线,默认显示;
- showbox:是否显示箱线图的箱体,默认显示;
- showfliers:是否显示异常值,默认显示;
- boxprops:设置箱体的属性,如边框色,填充色等;
- labels:为箱线图添加标签,类似于图例的作用;
- filerprops:设置异常值的属性,如异常点的形状、大小、填充色等;
- medianprops:设置中位数的属性,如线的类型、粗细等;
- meanprops:设置均值的属性,如点的大小、颜色等;
- capprops:设置箱线图顶端和末端线条的属性,如颜色、粗细等;
- whiskerprops:设置须的属性,如颜色、粗细、线的类型等;
import numpy as np
import matplotlib.pyplot as pltnp.random.seed(100)# 生成一组随机数,数量为1000
data = np.random.normal(size=(1000,), loc=0, scale=1)# sym 调整好异常值的点的形状
# whis 默认是1.5, 通过调整它的竖直来设置异常值显示的数量,
# 如果想显示尽可能多的异常值,whis设置很小,否则很大,也可以分别设定上下限whis=[5, 95]
plt.boxplot(data, sym="o", whis=1.5)
# plt.boxplot(data, sym ="o", whis = 0.01)
# plt.boxplot(data, sym ="o", whis = 999)
plt.show()
创建多组箱形图
# 在同一张图中显示多组箱形图import numpy as np
import matplotlib.pyplot as pltnp.random.seed(100)
# 用来设置每一组的名字
labels = ["A", "B", "C", "D", "E"]# 创建5组,每一组有1000个数
data = np.random.normal(size = (1000, 5), loc= 0, scale= 1)plt.boxplot(data, labels = labels, sym = "o")
plt.show()
patch_artist
:是否填充箱体的颜色;True or False
利用 numpy 库生成三组正态分布随机数:
import matplotlib.pyplot as plt
import numpy as npall_data=[np.random.normal(0,std,100) for std in range(1,4)]
plt.boxplot(all_data,patch_artist = False) #False #描点上色
plt.show()
Note:默认 patch_artist=False,所以我们需要指定其参数值为 True,即可自动填充颜色。
notch=True
, 切口形状 ,vert=True是否需要将箱线图垂直摆放,默认垂直摆放
缺口表示50%分位点的置信区间,缺口太大表示分布太分散了
all_data=[np.random.normal(0,std,100) for std in range(1,4)]
#首先有图(fig),然后有轴(ax)
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(9,4))bplot1=axes[0].boxplot(all_data,vert=True,patch_artist=True)#axes[0]表示在第一张图的轴上描点画图
#vert=True表示boxplot图是竖着放的
#patch_artist=True 表示填充颜色bplot2 = axes[1].boxplot(all_data,notch=True, # 切口形状vert=True,patch_artist=True)
plt.show()
美化图形
箱线图对象的类型:
type(bplot1)
#dict
返回字典字典类型
填充颜色基本遵循以下步骤:
- 指定箱线图中每个箱子的填充颜色,如:red、green、blue、pink 等 构造字典存放箱子配色 ——
{箱线图中每个箱子patch:对应的配色color}
- 重新上色 ——
patch.set_facecolor(color)
import matplotlib.pyplot as plt
import numpy as npall_data=[np.random.normal(0,std,100) for std in range(1,4)]
#首先有图(fig),然后有轴(ax)
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(9,4))
bplot1=axes[0].boxplot(all_data,vert=True,patch_artist=True)bplot2 = axes[1].boxplot(all_data,notch=True,vert=True,patch_artist=True)# 颜色填充
colors = ['pink', 'lightblue', 'lightgreen']
for bplot in (bplot1, bplot2):for patch, color in zip(bplot['boxes'], colors):patch.set_facecolor(color)plt.show()
添加网格线
- 指定在x轴上添加网格线(ax.xaxis.grid(True)),或者在y轴上添加网格线(ax.yaxis.grid(True))
- 指定 x 轴和 y 轴上的刻度个数(ax.set_xticks([1,2,3]),ax.set_yticks([1,2,3,4,5,6,7,8]))
- 设置 x 轴名称(ax.set_xlabel(“xlabel”))
- 设置 y 轴名称(ax.set_xlabel(“ylabel”))
import matplotlib.pyplot as plt
import numpy as npall_data=[np.random.normal(0,std,100) for std in range(1,4)]#首先有图(fig),然后有轴(ax)
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(9,4))bplot1=axes[0].boxplot(all_data,vert=True,patch_artist=True)bplot2 = axes[1].boxplot(all_data,notch=True,vert=True, patch_artist=True)#颜色填充
colors = ['pink', 'lightblue', 'lightgreen']
for bplot in (bplot1, bplot2):for patch, color in zip(bplot['boxes'], colors):patch.set_facecolor(color)# 加水平网格线
for ax in axes:ax.yaxis.grid(True) #在y轴上添加网格线ax.set_xticks([y+1 for y in range(len(all_data))] ) #指定x轴的轴刻度个数## [y+1 for y in range(len(all_data))]运行结果是[1,2,3]ax.set_xlabel('xlabel') #设置x轴名称ax.set_ylabel('ylabel') #设置y轴名称# 添加刻度
# 添加刻度名称,我们需要使用 plt.setp() 函数:# 加刻度名称
plt.setp(axes, xticks=[1,2,3],xticklabels=['x1', 'x2', 'x3'])
# 我们的刻度数是哪些,以及我们想要它添加的刻度标签是什么。plt.show()
import matplotlib.pyplot as plt# 其他参数
# 在图上标记出均值线fig,axes=plt.subplots(1,2,figsize=(9,5))
axes[0].boxplot(data,labels=labels,showmeans=True,meanline=False)
axes[0].set_title("默认 meanline=False",fontsize=15)
axes[1].boxplot(data,labels=labels,showmeans=True,meanline=True)
axes[1].set_title("meanline=True",fontsize=15)
plt.show()# Note:# meanline=False,那么均值位置会在图中用小三角表示出来# meanline=True,那么均值位置会在图中用虚线表示出来
# 默认 showfliers=True,那么图中会显示出离群值# showfliers=False,那么图中会去除离群值
这篇关于Matplotlib:可视化箱线图boxplot的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!