绘制箱线图
什么是箱线图
箱线图,是一种用作显示一组数据分散情况资料的统计图。因型状如箱子而得名。在各种领域也经常被使用,常见于品质管理。不过作法相对较繁琐。
主要包含六个数据节点,将一组数据从大到小排列,分别计算出他的上边缘(数据最大值),上四分位数Q3,中位数Q2,下四分位数Q1,下边缘(数据最小值),还有一个异常值。
什么是分位数,分位数是将总体的全部数据按大小顺序排列后,处于各等分位置的变量值。如果将全部数据分成相等的两部分,它就是中位数;如果分成四等分,就是四分位数;八等分就是八分位数等。
- 第一四分位数 (Q1),又称“较小四分位数”,等于该样本中所有数值由小到大排列后**第25%**的数字。Q1的位置= (n+1) × 0.25
- 第二四分位数 (Q2),又称“中位数”,等于该样本中所有数值由小到大排列后**第50%**的数字。Q2的位置= (n+1) × 0.5
- 第三四分位数 (Q3),又称“较大四分位数”,等于该样本中所有数值由小到大排列后**第75%**的数字。Q3的位置= (n+1) × 0.75
举两个例子:
-
求数据的6, 47, 49, 15, 42, 41, 7, 39, 43, 40, 36(未排序)的Q1、Q2、Q3
首先排顺序,由小到大排列的结果: 6, 7, 15, 36, 39, 40, 41, 42, 43, 47, 49
-
位置计算:
Q1 的位置=(11+1)× 0.25=3,
Q2 的位置=(11+1)× 0.5 =6,
Q3 的位置=(11+1)× 0.75=9,
-
因此:Q1 = 15,Q2 = 40,Q3 = 43
-
求数据: 7, 15, 36, 39, 40, 41(已排序)的Q1、Q2、Q3
一共6项,数列项为偶数项时,四分位数Q2为该组数列的中数;
-
(n+1)/4= 7/4 =1.75,Q1在第一与第二个数字之间;
-
(n+1)/4= 21/4 =5.25, Q3在第五与第六个数字之间;
位置x含有小数时计算方法,下图
int(x)
表示取整:数a×(1−x的小数部分)+数b×x的小数部分数a\\times(1-x的小数部分)+数b\\times x的小数部分数a×(1−x的小数部分)+数b×x的小数部分
-
Q1=0.75×15+0.25×7=13Q1 = 0.75\\times15+0.25\\times7 = 13Q1=0.75×15+0.25×7=13,
Q2=(36+39)/2=37.5Q2 = (36+39) / 2= 37.5Q2=(36+39)/2=37.5,
Q3=0.25×41+0.75×40=40.25Q3 = 0.25\\times41+0.75\\times40 = 40.25Q3=0.25×41+0.75×40=40.25
最后要提醒一点,一个箱线图就包含了一组数据,而不是一个数据,不然接下来绘图时还觉得自己弄了一组很长的数,结果只给你画了一个\”箱子\”(暂且这样称呼它了?)
matplotlib绘制箱线图
绘制最简单的箱线图:
plt.boxplot()
x = np.array([1,2,3,4,7,8,9])plt.boxplot(x)plt.show()
使用
np.info(plt.boxplot)
查看函数参数:
boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None,widths=None, patch_artist=None, bootstrap=None, usermedians=None,conf_intervals=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, manage_ticks=True, autorange=False, zorder=None)
看到这堆参数感觉要怀疑人生了吗?,其实比较常用的就几个。
这几个参数是:x,vert,widths,labels,patch_artist,boxprops=dict()
-
x:表示传入的数据,可以是一维数组(绘制一个\”箱子\”,如上面的图),或者二维数组(每一列数据绘制一个\”箱子\”),下面看下二维数组的例子:
x = np.random.rand(5,3) #表示产生一个5行3列的二维数组,3列就绘制3个箱子plt.boxplot(x)plt.show()
-
vert:表示绘出的图是否垂直,默认为True,看个 False的例子:
x = np.random.rand(5,3)plt.boxplot(x,vert=False)plt.show()
-
widths:箱子宽度,传入一个值表示所有箱子宽度都是这个值,传入一个列表表示不同箱子有其各自的宽度,看下面两个例子:
传入一个值
x = np.random.rand(5,3)plt.boxplot(x,widths=0.6) #所有箱子宽度同时改变plt.show()
-
传入一个列表:
x = np.random.rand(5,3)plt.boxplot(x,widths=[0.2,0.4,0.6]) #所有箱子宽度同时改变plt.show()
-
labels:每个箱子的标签,长度要与x的列数一致
x = np.random.rand(5,3)plt.boxplot(x,labels=[\'1234\',\'5678\',\'91011\']) #所有箱子宽度同时改变plt.xticks(rotation=-45,fontsize=15) #刻度标记可以按角度旋转plt.show()
-
boxprops:可设置箱体边框色
color
和 箱体颜色
facecolor
,不过在此前还要设置参数
patch_artist=True
,否则不能设置 facecolor,
x = np.random.randint(20,100,(100,3)) #产生范围20~100的共100行3列的数据plt.boxplot(x,patch_artist = True,boxprops=dict(color=\'b\',facecolor=\'pink\'))plt.show()