箱型图
使用数据为鸢尾花数据集(http://archive.ics.uci.edu/ml/datasets/Iris)
数据包含5列,分别是花萼长度、花萼宽度、花瓣长度、花瓣宽度、鸢尾花种类。
鸢尾花属种类包含三种:iris-setosa, iris-versicolour, iris-virginica
可以应用pandas自带的describe()或者numpy的percentile()统计上下四分位数和中位数
1.利用Matplotlib绘制 boxplot ()
matplotlib.pyplot.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_xticks=True, autorange=False, zorder=None, hold=None, data=None)
参数 | 说明 | 参数 | 说明 |
---|---|---|---|
x | 指定要绘制箱型图数据 | showcaps | 是否显示箱型图顶端和末端的两条线 |
notch | 是否是凹凸的形式展现箱型图 | showbox | 是否显示箱型图的箱体 |
sym | 指定异常点的形状 | showfilters | 是否显示异常值 |
vert | 是否需要将箱型图垂直摆放 | boxprops | 设置箱体的属性,如边框色,填充色等 |
whis | 指定上下须与上下四分位的距离 | labels | 为箱型图添加标签 |
positions | 指定箱型图的位置 | flierprops | 设置异常值的属性 |
widths | 指定箱型图的宽度 | medianprops | 设置中位数属性 |
patch_artist | 是否填充箱体的颜色 | meanprops | 设置均值的属性 |
meanline | 是否用线的形式表示均值 | capprops | 设置箱型图顶端和末端线条的属性 |
showmeans | 是否显示均值 | whiskerprops | 设置须的属性 |
详见参考文档:https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.boxplot
基本用法
import matplotlib.pyplot as plt
#不显示警告信息
import warnings
warnings.filterwarnings('ignore')
import matplotlib as mpl
# 中文和负号的正常显示
mpl.rcParams['font.sans-serif'] = ['Times New Roman']
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False
box_1=data[data['label']=="Iris-setosa"]['sepal_len']
box_2=data[data['label']=="Iris-versicolor"]['sepal_len']
box_3=data[data['label']=="Iris-virginica"]['sepal_len']
plt.figure(figsize=(10,5))
labels = 'sepal_len','Iris-versicolor','sepal_len'
plt.boxplot([box_1, box_2, box_3], labels = labels)#grid=False:代表不显示背景中的网格线
plt.title('Sepal_len',fontsize=14)
plt.xlabel('鸢尾花种类',fontsize =12)
plt.ylabel('花萼长度',fontsize =12)
plt.show
加上均值信息
showmeans=True代表显示均值(默认是小三角形)
meanline=True代表以线的形式显示均值
plt.boxplot([box_1, box_2, box_3], labels = labels,showmeans=True)
plt.boxplot([box_1, box_2, box_3], labels = labels,showmeans=True,meanline=True)
改变箱型图颜色
patch_artist = True代表填充箱体颜色
要配合boxprops使用(设置箱体属性,如边框色color,填充色facecolor)
plt.boxplot([box_1, box_2, box_3], labels = labels,showmeans=True,meanline=True,
patch_artist = True, boxprops = {'color':'orangered','facecolor':'pink'})
绘制水平箱型图
vert=False代表绘制水平的箱型图,默认为True
(注意此时x,y轴的标题要跟绘制垂直图时互换xy轴调整)
plt.boxplot([box_1, box_2, box_3], labels = labels,showmeans=True,meanline=True,
patch_artist = True, boxprops = {'color':'orangered','facecolor':'pink'},vert=False)
2.利用dataframe绘制
DataFrame.boxplot(column=None, by=None, ax=None,showmeans=False, fontsize=None, rot=0, grid=True, figsize=None, layout=None, return_type=None, …)
参数 | 说明 | 参数 | 说明 |
---|---|---|---|
column | 根据哪一列绘图 | by | 根据哪几列分组 |
ax | 绘图所用ax | fontsize | 字体大小 |
grid | 是否显示网格 | figsize | 图板大小,tuple |
layout | (3,5)代表3行5列 | return_type | {“axes”,“dict”,“both”} or None,默认axes |
rot | 代表分组的标签偏移角度(度为单位) | **kwargs | 跟matplotlib.pyplot.boxplot()一致的参数 |
基本用法
fig,ax= plt.subplots(1,1,figsize=(10,6))
data.boxplot(column=['sepal_len'],by=['label'],ax=ax)
# column参数表示要绘制成箱形图的数据,可以是一列或多列
# by参数表示分组依据,可以是一列或多列
ax.set_ylabel('花萼长度',fontsize =12)
ax.set_xlabel('鸢尾花种类',fontsize =12)
ax.set_title('Sepal_len',fontsize=14)
plt.show()
column参数也可以指定多列,配合layout参数使用(几行几列布局)
fig,ax= plt.subplots(1,1,figsize=(10,6))
data.boxplot(column=['sepal_len','sepal_wid'],by=['label'],ax=ax,layout=(2,1))
# column参数表示要绘制成箱形图的数据,可以是一列或多列
# by参数表示分组依据,可以是一列或多列
plt.show()
加上matplotlib里的各种信息
plt.figure(figsize=(20,4))
ff = data.boxplot(column=['sepal_len','sepal_wid'],
by=['label'],
layout=(2,1),#图像布局
sym = 'o', # 异常点形状,参考marker
vert = True, # 是否垂直
whis = 1.5, # IQR,默认1.5,也可以设置区间比如[5,95],代表强制上下边缘为数据95%和5%位置
patch_artist = False, # 上下四分位框内是否填充,True为填充
meanline = True, showmeans=True, # 是否有均值线及其形状
showbox = True, # 是否显示箱线
showcaps = True, # 是否显示边缘线
showfliers = True, # 是否显示异常值
notch = False, # 中间箱体是否缺口
return_type="dict"# 返回类型为字典
)
plt.title('my boxplot')
for f in ff:
for whisker in f['whiskers']:
whisker.set(color='k', linewidth=0.5,linestyle='-')
for cap in f['caps']:
cap.set(color='gray', linewidth=2)
for median in f['medians']:
median.set(color='DarkBlue', linewidth=2)
for flier in f['fliers']:
flier.set(marker='o', color='y', alpha=0.5)
# medians, 中位值的横线,
# whiskers, 从box到error bar之间的竖线.
# fliers, 异常值
# caps, error bar横线
# means, 均值的横线
3.利用senborn绘制
基本用法
- 直接应用某列数据绘制箱型图
import seaborn as sns
ax = sns.boxplot(x=data["sepal_len"])
- 对data中的多列数值型数据绘制箱型图
ax = sns.boxplot(data=data,orient="h", palette="Set2")
注意返回的是ax,我们就可以继续给他加x,y轴标题等信息了
分组绘制
按照某列分组针对某属性绘制箱型图
- 利用x,y分别指定分组依据和绘制列(垂直图时)
import seaborn as sns
ax = sns.boxplot(x="label", y="sepal_len", data=data)
- 与x,y配合使用hue指定二级分类
ax = sns.boxplot(x="day", y="total_bill", hue="smoker",
data=tips, palette="Set3")
g = sns.catplot(x="sex", y="total_bill",
hue="smoker", col="time",
data=tips, kind="box",
height=4, aspect=.7);
(本文数据不方便应用hue参数,代码和图为官网示例)
绘制水平箱型图
设置orient="h"画水平箱型图
(需要互换x,y轴对应数据)
ax = sns.boxplot(y="label", x="sepal_len",data=data,orient="h")
加上茎叶图
ax = sns.boxplot(x="label", y="sepal_len", data=data)
ax = sns.swarmplot(x="label", y="sepal_len", data=data, color=".25")
更多见http://seaborn.pydata.org/generated/seaborn.boxplot.html#seaborn.boxplot