盒图
一、盒图是什么?
盒图是在1977年由美国的统计学家约翰·图基(John Tukey)发明的。它由五个数值点组成:最小值(min),下四分位数(Q1),中位数(median),上四分位数(Q3),最大值(max)。也可以往盒图里面加入平均值(mean)。如上图。下四分位数、中位数、上四分位数组成一个“带有隔间的盒子”。上四分位数到最大值之间建立一条延伸线,这个延伸线成为“胡须(whisker)”。
由于现实数据中总是存在各式各样地“脏数据”,也成为“离群点”,于是为了不因这些少数的离群数据导致整体特征的偏移,将这些离群点单独汇出,而盒图中的胡须的两级修改成最小观测值与最大观测值。这里有个经验,就是最大(最小)观测值设置为与四分位数值间距离为1.5个IQR(中间四分位数极差)。即
- IQR = Q3-Q1,即上四分位数与下四分位数之间的差,也就是盒子的长度。
- 最小观测值为min = Q1 - 1.5*IQR,如果存在离群点小于最小观测值,则胡须下限为最小观测值,离群点单独以点汇出。如果没有比最小观测值小的数,则胡须下限为最小值。
- 最大观测值为max = Q3 -1.5*IQR,如果存在离群点大于最大观测值,则胡须上限为最大观测值,离群点单独以点汇出。如果没有比最大观测值大的数,则胡须上限为最大值。
二、简单盒图外观
1.jupyter
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
hu_data=[np.random.normal(0,std,100) for std in range(1,4)]
fig=plt.figure(figsize=(8,6))
plt.boxplot(hu_data,notch=False,sym='s',vert=True)
plt.xticks([y+1 for y in range(len(hu_data))],['x1','x2','x3'])
plt.xlabel('x')
plt.title('box plot')
2.pycharm
import numpy as np
import matplotlib.pyplot as plt
hu_data=[np.random.normal(0,std,100) for std in range(1,4)]
fig=plt.figure(figsize=(8,6))
#sym为离群点的默认标记符号,s为正方形,vert设置图的方向true为竖的,notch设置图的形状
plt.boxplot(hu_data,notch=False,sym='s',vert=True)
plt.xticks([y+1 for y in range(len(hu_data))],['x1','x2','x3'])
plt.xlabel('x')
plt.title('box plot')
plt.show()
三、盒图细节设置
1.jupyter
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
hu_data=[np.random.normal(0,std,100) for std in range(1,4)]
fig=plt.figure(figsize=(8,6))
bplot=plt.boxplot(hu_data,notch=False,sym='s',vert=True)
plt.xticks([y+1 for y in range(len(hu_data))],['x1','x2','x3'])
plt.xlabel('x')
plt.title('box plot')
for components in bplot.keys():
for line in bplot[components]:
line.set_color('b')
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
hu_data=[np.random.normal(0,std,100) for std in range(1,4)]
fig=plt.figure(figsize=(8,6))
#vert设置图的方向,notch设置形状的不同
bplot=plt.boxplot(hu_data,notch=True,sym='s',vert=False)
plt.yticks([y+1 for y in range(len(hu_data))],['y1','y2','y3'])
plt.ylabel('y')
plt.title('box plot')
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
hu_data=[np.random.normal(0,std,100) for std in range(1,4)]
fig=plt.figure(figsize=(8,6))
#vert设置图的方向,notch设置形状的不同,patch_artist为可对图的颜色进行填充
bplot=plt.boxplot(hu_data,notch=False,sym='s',vert=True,patch_artist=True)
#设置x轴上的参数
plt.xticks([y+1 for y in range(len(hu_data))],['x1','x2','x3'])
plt.xlabel('x')
plt.title('box plot')
colors=['pink','lightblue','lightgreen']
for pathch,color in zip(bplot['boxes'],colors):
pathch.set_facecolor(color)
2.pycharm
import numpy as np
import matplotlib.pyplot as plt
hu_data=[np.random.normal(0,std,100) for std in range(1,4)]
fig=plt.figure(figsize=(8,6))
bplot=plt.boxplot(hu_data,notch=False,sym='s',vert=True)
plt.xticks([y+1 for y in range(len(hu_data))],['x1','x2','x3'])
plt.xlabel('x')
plt.title('box plot')
for components in bplot.keys():
for line in bplot[components]:
line.set_color('b')
plt.show()
import numpy as np
import matplotlib.pyplot as plt
hu_data=[np.random.normal(0,std,100) for std in range(1,4)]
fig=plt.figure(figsize=(8,6))
#vert设置图的方向,notch设置形状的不同
bplot=plt.boxplot(hu_data,notch=True,sym='s',vert=False)
plt.yticks([y+1 for y in range(len(hu_data))],['y1','y2','y3'])
plt.ylabel('y')
plt.title('box plot')
plt.show()
import numpy as np
import matplotlib.pyplot as plt
hu_data=[np.random.normal(0,std,100) for std in range(1,4)]
fig=plt.figure(figsize=(8,6))
#vert设置图的方向,notch设置形状的不同,patch_artist为可对图的颜色进行填充
bplot=plt.boxplot(hu_data,notch=False,sym='s',vert=True,patch_artist=True)
#设置x轴上的参数
plt.xticks([y+1 for y in range(len(hu_data))],['x1','x2','x3'])
plt.xlabel('x')
plt.title('box plot')
colors=['pink','lightblue','lightgreen']
for pathch,color in zip(bplot['boxes'],colors):
pathch.set_facecolor(color)
plt.show()
四、小提琴图
1.jupyter
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(12,5))
hu_data=[np.random.normal(0,std,100) for std in range(6,10)]
axes[0].violinplot(hu_data,showmeans=False,showmedians=True)
axes[0].set_title('violin plot')
axes[1].boxplot(hu_data)
axes[1].set_title('box plot')
for ax in axes:
ax.yaxis.grid('True')
ax.set_xticks([y+1 for y in range(len(hu_data))])
plt.setp(axes,xticks=[y+1 for y in range(len(hu_data))],xticklabels=['x1','x2','x3','x4'])