一个箱图的主要组成原件 线图用来展现数据的分布,能直观的展示数据的关键指标 (如下四分位数、上四分位数、中位数、最大值、最小值、离散点/异常值点);箱线图可直观展示不同组数据的差异 ;下面详细介绍python中matplotlib及seaborn库绘制箱图。 1、数据集准备及箱图简介 还是使用鸢尾花数据集iris,iris详细介绍请戳: Python可视化|matplotlib10-绘制散点图scatter
import matplotlib.pyplot as pltimport numpy as npimport pandas as pdfrom pandas import Series,DataFrameimport seaborn as snsimport palettablefrom sklearn import datasets plt.rcParams['font.sans-serif' ]=['SimHei' ] # 用于显示中文 plt.rcParams['axes.unicode_minus' ] = False # 用于显示中文 iris=datasets.load_iris() x, y = iris.data, iris.target pd_iris = pd.DataFrame(np.hstack((x, y.reshape(150 , 1 ))),columns=['sepal length(cm)' ,'sepal width(cm)'
,'petal length(cm)' ,'petal width(cm)' ,'class' ] )
查看数据集样子? pd_iris["sepal width(cm)"]简单统计,后文主要使用该列数据集绘图 。
pd_iris["sepal width(cm)" ].describe()#以上各个值其实都可以使用describe函数查看
count 150.000000 mean 3.054000 std 0.433594 min 2.000000 25% 2.800000(下四分位数,25% 的数据小于等于此值。) 50% 3.000000(中位数,50% 的数据小于等于此值。) 75% 3.300000(上四分位数,75% 的数据小于等于此值。) max 4.400000 Name: sepal width(cm), dtype: float64
上面注释部分很好的解释了下面箱图中四分位数的含义
2、seaborn.boxplot箱图外观设置 plt.figure(dpi=100 ) sns.boxplot(y=pd_iris["sepal width(cm)" ],#传入一组数据 orient='v' #箱子垂直显示,默认为'h'水平显示 ) plt.show()
异常值关闭显示 plt.figure(dpi=100 ) sns.boxplot(y=pd_iris["sepal width(cm)" ], showfliers=False ,#异常值关闭显示 ) plt.show()
异常值marker大小设置 plt.figure(dpi=100 ) sns.boxplot(y=pd_iris["sepal width(cm)" ], orient='v' , fliersize=15 ,#设置离散值marker大小,默认为5 ) plt.show()
异常值marker形状、填充色、轮廓设置 plt.figure(dpi=100 ) sns.boxplot(y=pd_iris["sepal width(cm)" ], orient='v' , flierprops = {'marker' :'o' ,#异常值形状
'markerfacecolor' :'red' ,#形状填充色 'color' :'black' ,#形状外廓颜色 }, ) plt.show()
上下横线关闭 plt.figure(dpi=100 ) sns.boxplot(y=pd_iris["sepal width(cm)" ], showcaps=False ,#上下横线关闭 ) plt.show()
上下横线颜色、线型、线宽等设置 plt.figure(dpi=100 ) sns.boxplot(y=pd_iris["sepal width(cm)" ], capprops={'linestyle' :'--' ,'color' :'red' },#设置上下横线属性 ) plt.show()
plt.figure(dpi=100 ) sns.boxplot(y=pd_iris["sepal width(cm)" ], whiskerprops={'linestyle' :'--' ,'color' :'red' },#设置上下须属性 ) plt.show()
箱子设置缺口 plt.figure(dpi=100 ) sns.boxplot(y=pd_iris["sepal width(cm)" ], orient='v' , notch=True ,#箱子设置缺口 ) plt.show()
箱子不填充颜色
plt.figure(dpi=100 ) sns.boxplot(y=pd_iris["sepal width(cm)" ], orient='v' , color='white' ,#箱子不填充 ) plt.show()
箱子外框、内部填充色 plt.figure(dpi=100 ) sns.boxplot(y=pd_iris["sepal width(cm)" ], boxprops = {'color' :'red' ,#箱子外框 'facecolor' :'pink' #箱子填充色 },#设置箱子属性 ) plt.show()
plt.figure(dpi=100 ) sns.boxplot(y=pd_iris["sepal width(cm)" ], medianprops = {'linestyle' :'--' ,'color' :'red' },#设置中位数线线型及颜色 ) plt.show()
均值使用点显示、设置点形状、填充色 plt.figure(dpi=100 ) sns.boxplot(y=pd_iris["sepal width(cm)" ], showmeans=True ,#箱图显示均值, meanprops = {'marker' :'D' ,'markerfacecolor' :'red' },#设置均值属性 ) plt.show()
均值使用线显示 、线型、颜色设置 plt.figure(dpi=100 ) sns.boxplot(y=pd_iris["sepal width(cm)" ], showmeans=True ,#箱图显示均值, meanline=True ,#显示均值线 meanprops = {'linestyle' :'--' ,'color' :'red' },#设置均值线属性 ) plt.show()
plt.figure(dpi=100 ) sns.boxplot(y=pd_iris["sepal width(cm)" ], orient='v' , linewidth=8 #设置箱子等线的宽度 ) plt.show()
3、seaborn.boxplot分组 箱图 plt.figure(dpi=100 ) class_name=[iris.target_names[0 ] if i==0.0 else iris.target_names[1 ] if i==1.0 else iris.target_names[2 ] for i in pd_iris['class' ]] sns.boxplot(x=class_name,#按照pd_iris["sepal width(cm)"]分组,即按照每种鸢尾花('setosa', 'versicolor', 'virginica')分组绘图 y=pd_iris["sepal width(cm)" ],#绘图数据 orient='v' ) plt.show()
plt.figure(dpi=100 ) sns.boxplot(x='class' , y='sepal width(cm)' , data=pd_iris,#data的作用就是x,y每次不需要输入pd_iris orient='v' ) plt.show()
设置箱子颜色 import palettable plt.figure(dpi=100 ) sns.boxplot(x='class' , y='sepal width(cm)' , data=pd_iris, orient='v' , palette=palettable.tableau.TrafficLight_9.mpl_colors,#设置每个箱子颜色 ) plt.show()
设置箱子颜色饱和度 import palettable plt.figure(dpi=100 ) sns.boxplot(x='class' , y='sepal width(cm)' , data=pd_iris, orient='v' , palette=palettable.tableau.TrafficLight_9.mpl_colors, saturation=0.3 ,#设置颜色饱和度 ) plt.show()
import palettable plt.figure(dpi=100 ) sns.boxplot(x='class' , y='sepal width(cm)' , data=pd_iris, orient='v' , palette=palettable.tableau.TrafficLight_9.mpl_colors, saturation=0.3 ,#设置颜色饱和度 width=1.0 ,#设置箱子之间距离,为1时,每个箱子之间距离为0 ) plt.show()
plt.figure(dpi=100 ) class_name=[iris.target_names[0 ] if i==0.0 else iris.target_names[1 ] if i==1.0 else iris.target_names[2 ] for i in pd_iris['class' ]] sns.boxplot(x=class_name, y=pd_iris['sepal width(cm)' ], hue=pd_iris['petal width(cm)' ],#每类按照子类分组:上图三类再按照'sepal width(cm)'分组绘图 orient='v' ) plt.show()
plt.figure(dpi=100 ) class_name=[iris.target_names[0 ] if i==0.0 else iris.target_names[1 ] if i==1.0 else iris.target_names[2 ] for i in
pd_iris['class' ]] sns.boxplot(x=class_name, y=pd_iris["sepal width(cm)" ], hue=pd_iris['petal width(cm)' ], order=["virginica" , "versicolor" , "setosa" ],#设置箱子的显示顺序 hue_order=sorted(list(pd_iris['petal width(cm)' ].unique())),#设置每个子类中箱子的显示顺序,此处设置从小到大排序 orient='v' ) plt.show()
4、参考资料 https://matplotlib.org/api/_as_gen/matplotlib.pyplot.boxplot.html?highlight=boxplot#matplotlib.pyplot.boxplot http://seaborn.pydata.org/generated/seaborn.boxplot.html#seaborn.boxplot