前言
接着上一篇文章刘毛毛:matplotlib.pyplot常用函数讲解大全(一)来接着总结学习,上一篇写了bar()条形图,本文来总结箱线图boxplot().
二,boxplot()箱线图
箱线图是统计分析常用的分析图,从数据的箱线图中,可以直观的观察到一个数据的大致分布,可以看出此数据是偏态分布还是对称分布,可以观察到数中有无异常值。可以在图中显示出
- 四分之一分位数Q1;
- 中位数M;
- 四分之三分位数Q3;
- 顶端:Q3+1.5*(Q3-Q1),若数据上限不超过此值,则顶端为数据最大值Max;
- 末端:Q1-1.5*(Q3-Q1),若数据下限不低于此值,则末端为数据最小值Min;
- boxplot()里也可以显示出均值。
注:不在区间[Q1-1.5*(Q3-Q1),Q3+1.5*(Q3-Q1)]的值为异常值。
具体关于统计的知识,我就不讲了,怕讲错了,我们还是来画图吧,我已经迫不及待了,嘻嘻!
参数说明
参数说明
只要把参数都调一遍,你就能掌握住怎么画箱线图了。还不赶紧动动小手,操作一番。
老套路,先画个简单的图胚子,然后再装修。
数据准备
##########t分布,自定义实现函数
def t(n):
b=np.zeros((500))
for i in range(n):
# print(1)
a=np.random.normal(0,1,500)
b=b+a**2
return b
b1=t(1)
b2=t(2)
b3=t(3)
b4=t(10)
b5=t(20)
a=np.random.normal(0,1,500)
###########
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams["font.family"]="SimHei"#正确显示中文
plt.rcParams["axes.unicode_minus"]=False#正确显示负号
fig= plt.figure(figsize=(8,6))
ax=fig.add_subplot(111)
######重点围攻区域
ax.boxplot(b4)###今天的主角
######重点围攻区域
plt.show()
1
注:箱线图里,x轴默认lim=[0,2],默认labels=["1"],箱线图默认添加位置为1。
这个图这么看,从下往上5条横线分别代表:末端,Q1,M,Q3,顶端。最上面的小泡泡为异常值,我们还可以改变它们的形状,颜色,大小等。
我们现在来调参,调完的图形会有花哨,也是为了可以看一下参数的作用,我觉得箱线图在应用中还是比较简单点好看。
ax.boxplot(b4,capprops={"linewidth":3,"color":"teal","linestyle":"--"},
boxprops={"color":"pink","linewidth":3,"facecolor":"g"},
medianprops={"linewidth":2},patch_artist=True,meanprops=
{"linestyle":"--","color":"w","linewidth":1},meanline=True,widths=0.5,positions=[1],
showmeans=True,whiskerprops={"linestyle":"--","color":"turquoise"},labels=["t(4)分布图"],
flierprops={"markerfacecolor":"y","markersize":12},sym="*")
2
我们现在精装修一下此图,boxplot()里有些参数的设置,接下来我就修改为默认,为了看着不那么花哨一些,不过还是很花哨,嘻嘻。
fig= plt.figure(figsize=(8,6))
ax=fig.add_subplot(111)
ax.boxplot(b4,capprops={"linewidth":3,"color":"teal"},
boxprops={"color":"pink","linewidth":3,"facecolor":"g"},
medianprops={"linewidth":2},patch_artist=True,meanprops=
{"linestyle":"--","color":"w"},meanline=True,widths=0.5,positions=[1],
showmeans=True,whiskerprops={"linestyle":"--","color":"turquoise"})
ax.set_ylim(-4,32)
ax.set_xlim(0,2)
ax.set_xticks(np.linspace(0,2,11))
ax.set_yticks(np.linspace(-4,32,10))
ax.tick_params(labelsize=12,bottom=False,labelbottom=False)
ax.tick_params("x",labelsize=14,)
ax.spines["top"].set_color("g")
ax.spines["right"].set_color("g")
ax.spines["left"].set_color("g")
ax.spines["bottom"].set_color("g")
ax.spines["bottom"].set_linewidth(2)
ax.spines["top"].set_linewidth(2)
ax.spines["left"].set_linewidth(2)
ax.spines["right"].set_linewidth(2)
###几个统计数的计算,
q25=np.percentile(b4,25)
q75=np.percentile(b4,75)
to=(q75-q25)*1.5+q75
me=np.percentile(b4,50)
mi=np.min(b4)
ax.annotate(s="%d"%q25,xy=(0.7,q25-0.2),xytext=(0.5,q25),arrowprops=dict(edgecolor="dimgray",shrink=0,
headwidth=6,headlength=2,width=0.2
),fontsize=12)
ax.annotate(s="%d"%q75,xy=(0.7,q75-0.2),xytext=(0.5,q75),arrowprops=dict(edgecolor="dimgray",shrink=0,
headwidth=6,headlength=2,width=0.2
),fontsize=12)
ax.annotate(s="%d"%to,xy=(0.7,to-0.2),xytext=(0.5,to),arrowprops=dict(edgecolor="dimgray",shrink=0,
headwidth=6,headlength=2,width=0.2
),fontsize=12)
ax.annotate(s="%d"%mi,xy=(0.7,mi-0.2),xytext=(0.5,mi),arrowprops=dict(edgecolor="dimgray",shrink=0,
headwidth=6,headlength=2,width=0.2
),fontsize=12)
ax.annotate(s="%d"%me,xy=(0.7,me-0.2),xytext=(0.5,me),arrowprops=dict(edgecolor="grey",shrink=0,
headwidth=6,headlength=2,width=0.2,
),fontsize=12)
ax.annotate(s="异常值",xy=(1.1,to+2),xytext=(1.3,to+2.2),arrowprops=dict(edgecolor="grey",shrink=0,
headwidth=6,headlength=2,width=0.2,
),fontsize=12)
ax.tick_params()
ax.set_title("t(10)分布箱线图",fontsize=18)
ax.grid(linewidth=0.5,color="black",alpha=0.1)
ax.set_axisbelow(True)#
plt.show()
其中全部函数的使用,都是使用之前两篇文章讲过的,有疑惑的可以翻一下,我把链接放最后。
3
并列箱线图
多个箱线图并列的方法,就是将多个数据,传给x参数即可,我们来可视化一下。
plt.rcParams["font.family"]="SimHei"#正确显示中文
plt.rcParams["axes.unicode_minus"]=False#正确显示负号
fig= plt.figure(figsize=(8,6))
ax=fig.add_subplot(111)
ax.boxplot([b1,b2,b3,b4,b5],labels=["t(1)分布","t(2)分布","t(3)分布","t(10)分布","t(20)分布"],
notch=True,capprops={"linewidth":2},boxprops={"linewidth":1},
)
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)
ax.spines["left"].set_visible(False)
#ax.spines["bottom"].set_color("g")
ax.spines["bottom"].set_linewidth(2)
ax.spines["top"].set_linewidth(2)
ax.spines["left"].set_linewidth(2)
ax.spines["right"].set_linewidth(2)
ax.tick_params(labelsize=12,left=False)
ax.set_title("t分布箱线图",fontsize=18)
ax.grid(linewidth=0.5,color="black",alpha=0.2)
ax.set_axisbelow(True)#
plt.show()
4
简简单单的箱线图,是不是看着更好看一些。
DataFrame型数据专用函数boxplot()
参数
b6=np.ones((500))
b6[0:200]=0
import pandas as pd
data=pd.DataFrame({"b1":b1,"b2":b2,"b3":b3,"b4":b4,"b6":b6})
data.boxplot(column=["b1","b2"],showmeans=True,grid=False,fontsize=12,figsize=(8,4)
,widths=[0.3,0.3])
plt.show()
好像不能用通用函数来搞装修了,不知道是不是才疏学浅。
我们来看一下,by参数和layout参数的使用。
import pandas as pd
data=pd.DataFrame({"b1":b1,"b2":b2,"b3":b3,"b4":b4,"b6":b6})
d=data.boxplot(column=["b1","b2"],showmeans=True,grid=False,fontsize=12,by="b6",
layout=(1,2),figsize=(8,4))
plt.show()
我们将两个列的数据按“b6”列来分组,“b6”列里只有两个不同值0和1,因此“b1”和“b2”列,各被分为两组,我们的数据会画出两个子图,每个子图2个箱线图,来看一下是个什么样子。
每个图分别代表我们所选中的列的数据,每个图里的箱线图是分组之后的小组数据,因为“b6”列只有两个不同值,因此分为两组。
文章链接:
刘毛毛:matplotlib.pyplot的使用总结大全(入门加进阶)zhuanlan.zhihu.com
刘毛毛:matplotlib.pyplot常用函数讲解大全(一)zhuanlan.zhihu.com