pyplot画图_matplotlib.pyplot常用函数讲解大全(二)

2b2a71e866504ff8316f7a33213db8f4.png

前言

接着上一篇文章刘毛毛: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)]的值为异常值。

具体关于统计的知识,我就不讲了,怕讲错了,我们还是来画图吧,我已经迫不及待了,嘻嘻!


参数说明

152a8404a49b5f0ceafb37c94f1a08ec.png
参数说明

只要把参数都调一遍,你就能掌握住怎么画箱线图了。还不赶紧动动小手,操作一番。


老套路,先画个简单的图胚子,然后再装修。

数据准备
##########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()

f47aeffc7469e24318750c4e7552edc8.png
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="*")

e8f2f8d5b1fa177ac62dbd6bb88ad644.png
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()

其中全部函数的使用,都是使用之前两篇文章讲过的,有疑惑的可以翻一下,我把链接放最后。

2a0910b0ba9fa16dc994658332ddd4f9.png
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()

74d26d58fd4786e392f26840ec4aece6.png
4

简简单单的箱线图,是不是看着更好看一些。


DataFrame型数据专用函数boxplot()

参数

f2a3acc4bd848c776a974dbbb37e4552.png
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()

209ed66c891a788643c3816816e934ef.png

好像不能用通用函数来搞装修了,不知道是不是才疏学浅。

我们来看一下,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个箱线图,来看一下是个什么样子。

3097b0a67fe507e9458424e372a81ccc.png

每个图分别代表我们所选中的列的数据,每个图里的箱线图是分组之后的小组数据,因为“b6”列只有两个不同值,因此分为两组。

文章链接:

刘毛毛:matplotlib.pyplot的使用总结大全(入门加进阶)​zhuanlan.zhihu.com
0b11c805957bbd49318744eb5a2cd9e2.png
刘毛毛:matplotlib.pyplot常用函数讲解大全(一)​zhuanlan.zhihu.com
6acf5ba5fc26d97aea52cc8ee79ef142.png
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值