Matplotlib:可视化箱线图boxplot

箱线图统计学知识

  • 上限值:Q1-1.5×IQR
  • 上相邻值:距离上限值最近的值
  • 须线:上下分位数各自与上下相邻值的距离
  • 上四分位数(Q1):一组数据按顺序排列,从小至大第25%位置的数值
  • 中位数:一组数据按顺序排列,从小至大第50%位置的数值
  • 中位线(IQR):Q3-Q1上四分位数至下四分位数的距离
  • 下四分位数(Q3):一组数据按顺序排列,从小至大第75%位置的数值
  • 下相邻值:距离下限值最近的值
  • 下限值:Q3+1.5×IQR
  • 离群值(异常值):一组数据中超过上下限的真实值
    在这里插入图片描述
    对照正态分布图来参考:
    在这里插入图片描述
    如果中位线往右偏移,那么数据呈左偏分布;
    如果中位线往左偏移,那么数据呈右偏分布

箱形图又称为盒须图,盒式图或箱线图。是一种用作显示一组数据分散情况资料的统计图。

plt.boxplot(		x, 
					notch=None, 
					sym=None,
					 vert=None, 
					 whis=None, 
					 positions=None, 
					 widths=None, 
					 patch_artist=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)
  • x:指定要绘制箱线图的数据;
  • notch:是否是凹口的形式展现箱线图,默认非凹口;
  • sym:指定异常点的形状,默认为+号显示;
  • vert:是否需要将箱线图垂直摆放,默认垂直摆放;
  • whis:指定上下须与上下四分位的距离,默认为1.5倍的四分位差;
  • positions:指定箱线图的位置,默认为[0,1,2…];
  • widths:指定箱线图的宽度,默认为0.5;
  • patch_artist:是否填充箱体的颜色;
  • meanline:是否用线的形式表示均值,默认用点来表示;
  • showmeans:是否显示均值,默认不显示;
  • showcaps:是否显示箱线图顶端和末端的两条线,默认显示;
  • showbox:是否显示箱线图的箱体,默认显示;
  • showfliers:是否显示异常值,默认显示;
  • boxprops:设置箱体的属性,如边框色,填充色等;
  • labels:为箱线图添加标签,类似于图例的作用;
  • filerprops:设置异常值的属性,如异常点的形状、大小、填充色等;
  • medianprops:设置中位数的属性,如线的类型、粗细等;
  • meanprops:设置均值的属性,如点的大小、颜色等;
  • capprops:设置箱线图顶端和末端线条的属性,如颜色、粗细等;
  • whiskerprops:设置须的属性,如颜色、粗细、线的类型等;
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(100)

# 生成一组随机数,数量为1000
data = np.random.normal(size=(1000,), loc=0, scale=1)

# sym 调整好异常值的点的形状
# whis 默认是1.5, 通过调整它的竖直来设置异常值显示的数量,
# 如果想显示尽可能多的异常值,whis设置很小,否则很大,也可以分别设定上下限whis=[5, 95]
plt.boxplot(data, sym="o", whis=1.5)
# plt.boxplot(data, sym ="o", whis = 0.01)
# plt.boxplot(data, sym ="o", whis = 999)
plt.show()

在这里插入图片描述

创建多组箱形图


# 在同一张图中显示多组箱形图
 
import numpy as np
import matplotlib.pyplot as plt
 
np.random.seed(100)
# 用来设置每一组的名字
labels = ["A", "B", "C", "D", "E"]
 
# 创建5组,每一组有1000个数
data = np.random.normal(size = (1000, 5), loc= 0, scale= 1)
 
plt.boxplot(data, labels = labels, sym = "o")
plt.show()

在这里插入图片描述

patch_artist:是否填充箱体的颜色;True or False

利用 numpy 库生成三组正态分布随机数:

import  matplotlib.pyplot as  plt
import  numpy as  np

all_data=[np.random.normal(0,std,100) for std in range(1,4)]
plt.boxplot(all_data,patch_artist = False)  #False    #描点上色
plt.show()

在这里插入图片描述
Note:默认 patch_artist=False,所以我们需要指定其参数值为 True,即可自动填充颜色。

notch=True, 切口形状 ,vert=True是否需要将箱线图垂直摆放,默认垂直摆放

缺口表示50%分位点的置信区间,缺口太大表示分布太分散了

all_data=[np.random.normal(0,std,100) for std in range(1,4)]
#首先有图(fig),然后有轴(ax)
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(9,4))


bplot1=axes[0].boxplot(all_data,
                       vert=True,
                       patch_artist=True)

#axes[0]表示在第一张图的轴上描点画图
#vert=True表示boxplot图是竖着放的
#patch_artist=True 表示填充颜色

bplot2 = axes[1].boxplot(all_data,
                         notch=True,  # 切口形状
                         vert=True,
                         patch_artist=True)
plt.show()

在这里插入图片描述

美化图形

箱线图对象的类型:
type(bplot1)
#dict
返回字典字典类型

填充颜色基本遵循以下步骤:

  • 指定箱线图中每个箱子的填充颜色,如:red、green、blue、pink 等 构造字典存放箱子配色 ——{箱线图中每个箱子patch:对应的配色color}
  • 重新上色 —— patch.set_facecolor(color)
import  matplotlib.pyplot as  plt
import  numpy as  np


all_data=[np.random.normal(0,std,100) for std in range(1,4)]
#首先有图(fig),然后有轴(ax)
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(9,4))
bplot1=axes[0].boxplot(all_data,
                       vert=True,
                       patch_artist=True)


bplot2 = axes[1].boxplot(all_data,
                         notch=True,
                         vert=True,
                         patch_artist=True)

# 颜色填充
colors = ['pink', 'lightblue', 'lightgreen']
for bplot in (bplot1, bplot2):
    for patch, color in zip(bplot['boxes'], colors):
        patch.set_facecolor(color)

plt.show()

在这里插入图片描述

添加网格线
  • 指定在x轴上添加网格线(ax.xaxis.grid(True)),或者在y轴上添加网格线(ax.yaxis.grid(True))
  • 指定 x 轴和 y 轴上的刻度个数(ax.set_xticks([1,2,3]),ax.set_yticks([1,2,3,4,5,6,7,8]))
  • 设置 x 轴名称(ax.set_xlabel(“xlabel”))
  • 设置 y 轴名称(ax.set_xlabel(“ylabel”))
import matplotlib.pyplot as plt
import numpy as np

all_data=[np.random.normal(0,std,100) for std in range(1,4)]

#首先有图(fig),然后有轴(ax)
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(9,4))


bplot1=axes[0].boxplot(all_data,
                       vert=True,
                       patch_artist=True)


bplot2 = axes[1].boxplot(all_data,
                         notch=True,
                         vert=True, 
                         patch_artist=True)



#颜色填充
colors = ['pink', 'lightblue', 'lightgreen']
for bplot in (bplot1, bplot2):
    for patch, color in zip(bplot['boxes'], colors):
        patch.set_facecolor(color)

# 加水平网格线
for ax in axes:
    ax.yaxis.grid(True) #在y轴上添加网格线
    ax.set_xticks([y+1 for y in range(len(all_data))] ) #指定x轴的轴刻度个数
    ## [y+1 for y in range(len(all_data))]运行结果是[1,2,3]
    ax.set_xlabel('xlabel') #设置x轴名称
    ax.set_ylabel('ylabel') #设置y轴名称

# 添加刻度
# 添加刻度名称,我们需要使用 plt.setp() 函数:

# 加刻度名称
plt.setp(axes, xticks=[1,2,3],
         xticklabels=['x1', 'x2', 'x3'])
# 我们的刻度数是哪些,以及我们想要它添加的刻度标签是什么。
        
plt.show()

在这里插入图片描述

import matplotlib.pyplot as plt

# 其他参数
# 在图上标记出均值线

fig,axes=plt.subplots(1,2,figsize=(9,5))
axes[0].boxplot(data,labels=labels,showmeans=True,meanline=False)
axes[0].set_title("默认 meanline=False",fontsize=15)
axes[1].boxplot(data,labels=labels,showmeans=True,meanline=True)
axes[1].set_title("meanline=True",fontsize=15)
plt.show()

# Note:

# meanline=False,那么均值位置会在图中用小三角表示出来

# meanline=True,那么均值位置会在图中用虚线表示出来
# 默认 showfliers=True,那么图中会显示出离群值

# showfliers=False,那么图中会去除离群值
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值