箱线图(Box-plot)是用来显示一组或多组数据分布特征的统计图。关于箱线图具体信息,可以参考箱线图详解
我们需要对以下数据中的charges值做出箱线图,并且按照不同性别分组展现。源数据下载
1、使用matplotlib的boxplot()函数制作箱线图
matplotlib中制作箱线图的函数为boxplot()。
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']#解决中文乱码问题
plt.rcParams["font.size"]=10#设置字体大小
plt.boxplot([data.charges[data.sex=='male'],data.charges[data.sex=='female']],labels=['male','female'])
plt.title('男女保费分布箱线图')
plt.savefig('gender.png',dpi=400)
绘制的箱线图如下图所示,图中数据点包括上四分位数、下四分位数、上边缘、下边缘、中位数以及异常值。男性相较于女性保费分布更广,意味着有更多的男性有着高保费。
如果想对以上箱线图形状做修饰的话,可以通过设置参数来完成。
(1)vert
=Fasle:水平箱线图;
(2)showmeans
=True:显示均值;
(3)nort
=True:改变箱体的形状,突出中位数的置信区间;
(4)sym
=’*’:异常值标注形状;
(5)patch_artist
与boxprops
配合使用来设置箱体边缘的颜色和箱体填充的颜色,patch_artist
=True,boxprops
中color
标签为箱体边框颜色,facecolor
标签为箱体填充颜色。
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']#解决中文乱码问题
plt.rcParams["font.size"]=10#设置字体大小
plt.boxplot([data.charges[data.sex=='male'],data.charges[data.sex=='female']],labels=['male','female'],notch=True,sym='*',vert=False,showmeans=True,patch_artist=True,boxprops = {'color':'orangered','facecolor':'pink'})
plt.title('男女保费分布箱线图')
plt.savefig('gender.png',dpi=400)
修饰后的水平箱线图如下图所示。
2、使用seaborn中的boxplot()函数制作箱线图
seaborn是在matplotlib基础上面的封装的可视化模块,代码更简洁,定制化能力稍差。
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_style('darkgrid', {'font.sans-serif':['SimHei', 'Arial']})#设置图表背景颜色字体
sns.boxplot(y='charges',data=data,x='sex')
plt.title('男女保费分布箱线图')
plt.savefig('gender.png',dpi=400)
绘制的箱线图如下图所示,图中数据点包括上四分位数、下四分位数、上边缘、下边缘、中位数以及异常值。
水平箱线图无需设置专门的参数,只需要将x,y值调换即可。绘制的水平箱线图图下图所示。
通常默认的异常值范围为大于 (上四分位数
+1.5倍四分位数差)的值,或者小于(下四分位数-1.5倍四分位数差)的值,即大于Q3+1.5IQR或小于Q1-1.5IQR的值划为异常值(outliers)。可以通过whis
参数可以改变IQR的因数大小进而改变异常值范围。
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_style('darkgrid', {'font.sans-serif':['SimHei', 'Arial']})#设置图表背景颜色字体
sns.boxplot(x='charges',data=data,y='sex',whis=3)
plt.title('男女保费分布箱线图')
plt.savefig('gender.png',dpi=400)
异常值更改后的箱线图如下图所示:
通过设置
hue
参数在箱线图中嵌套分组。
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_style('darkgrid', {'font.sans-serif':['SimHei', 'Arial']})#设置图表背景颜色字体
sns.boxplot(y='charges',data=data,x='sex',hue='smoker')
plt.title('男女保费分布箱线图')
plt.savefig('gender.png',dpi=400)
嵌套分组后的箱形图如下图所示,在男性保费分布广于女性保费的基础上,无论是男性还是女性,吸烟者相比于不吸烟者的保费分布更广,意味着更多的吸烟者有着高保费。
如果想对以上箱线图继续修饰的话,可以通过设置其他参数来完成。
(1)order
:显式传入参数指定顺序控制箱线图的显示顺序,hue_order则用于指定嵌套分组的显示顺序;
(2)palette
:修改每个类别的颜色;
(3)saturation
:类别颜色饱和度;
(4)fliersize
:修改异常点大小;
(5)notch
:改变箱体的形状,突出中位数的置信区间;
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_style('darkgrid', {'font.sans-serif':['SimHei', 'Arial']})#设置图表背景颜色字体
sns.boxplot(y='charges',data=data,x='sex',hue='smoker',order=['male','female'],palette='Set3',saturation=1.5,fliersize=4,notch=True,hue_order=['no','yes'])
plt.title('男女保费分布箱线图')
plt.savefig('gender.png',dpi=400)
3、使用seaborn中的boxenplot()函数制作增强型箱线图
一、什么是增强型箱线图
boxenplot用于为更大的数据集绘制增强的箱型图。这种风格的绘图最初被命名为“信值图”,因为它显示了大量被定义为“置信区间”的分位数。它类似于绘制分布的非参数表示的箱形图,其中所有特征对应于实际观察的数值点。通过绘制更多分位数,它提供了有关分布形状的更多信息,特别是尾部数据的分布。
二、语法
seaborn.boxenplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, orient=None,
color=None, palette=None, saturation=0.75, width=0.8, dodge=True,
k_depth='proportion',linewidth=None, scale='exponential', outlier_prop=None,
ax=None, **kwargs)
大部分参数与boxplot相同,独有的参数有k_depth,scale,outlier_prop。
(1)k_depth
:“proportion” 或 “tukey” 或 “trustworthy”
通过增大百分比的粒度控制绘制的盒形图数目。每个参数代表利用不同的统计特性对异常值的数量做出不同的假设。
(2)scale
:“linear” 或 “exponential” 或 “area”
用于控制增强箱线图宽度的方法。所有参数都会给显示效果造成影响。 “linear” 通过恒定的线性因子减小宽度,“exponential” 使用未覆盖的数据的比例调整宽度, “area” 与所覆盖的数据的百分比成比例。
(3)outlier_prop
:
被认为是异常值的数据比例。与 k_depth 结合使用以确定要绘制的百分位数。默认值为 0.007 作为异常值的比例。该参数取值应在[0,1]范围内。
三、实例
根据分类变量分组绘制一个纵向的增强箱线图。
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_style('darkgrid', {'font.sans-serif':['SimHei', 'Arial']})#设置图表背景颜色字体
sns.boxenplot(x='sex',y='charges',data=data)
plt.savefig('gender.png',dpi=400)
绘制的增强型箱线图如下图所示:
通过设置
hue
参数在增强型箱线图中嵌套分组。
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_style('darkgrid', {'font.sans-serif':['SimHei', 'Arial']})#设置图表背景颜色字体
sns.boxenplot(x='sex',y='charges',data=data,hue='smoker')
plt.savefig('gender.png',dpi=400)
嵌套分组后的增强型箱线图如下图所示:
通过
k_depth
参数改变箱线图的数目。
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_style('darkgrid', {'font.sans-serif':['SimHei', 'Arial']})#设置图表背景颜色字体
sns.boxenplot(x='sex',y='charges',data=data,hue='smoker',k_depth='tukey')
plt.savefig('gender.png',dpi=400)
箱线数目改变后如下图所示:
通过
scale
参数控制箱线图的宽度。
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_style('darkgrid', {'font.sans-serif':['SimHei', 'Arial']})#设置图表背景颜色字体
sns.boxenplot(x='sex',y='charges',data=data,hue='smoker',scale='linear',k_depth='proportion')
plt.savefig('gender.png',dpi=400)
宽度改变以后的箱线图如下图所示:
通过
outlier_prop
参数改变异常值的比例。
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_style('darkgrid', {'font.sans-serif':['SimHei', 'Arial']})#设置图表背景颜色字体
sns.boxenplot(x='sex',y='charges',data=data,hue='smoker',scale='linear',k_depth='proportion',outlier_prop=0.01)
plt.savefig('gender.png',dpi=400)
异常值比例改变后的箱线图如下图所示: