Python Matplotlib绘制箱线图的全过程

 更新时间:2021年09月15日 11:21:34   作者:高成珍  
又称箱形图(boxplot)或盒式图,数据大小、占比、趋势等等的呈现其包含一些统计学的均值、分位数、极值等等统计量,因此该图信息量较大,下面这篇文章主要给大家介绍了关于Python Matplotlib绘制箱线图的相关资料,需要的朋友可以参考下

箱线图介绍

箱线图(Box-plot)又称为盒式图或箱型图,是一种用来显示一组数据分散情况的统计图,它能显示一组数据的上界、下界、中位数、上下四分位数以及异常值等。箱线图的各部分组成及其含义如下图所示。

 关键术语说明 四分位数:

  • 四分位数:就是把一组数据按照从小到大的顺序进行排列,然后分成四等份,处于三个分割点位置的数字就是四分位数;
  • 第一四分位数(q1):又称“较小四分位数”或“下四分位数”,等于该样本中所有数值由小到大排列后第25%的数字,q1的位置 = 1+(n-1)x 0.25;
  • 第二四分位数(q2):又称“中位数”,等于该样本中所有数值由小到大排列后第50%的数字,q2的位置= 1+(n-1)x 0.5;
  • 第三四分位数(q3),又称“较大四分位数”或“上四分位数”,等于该样本中所有数值由小到大排列后第75%的数字。q3的位置= 1+(n-1)x 0.75;
  • 四分位间距(InterQuartile Range,IQR):第三四分位数与第一四分位数的差距(q3数据- q1数据);
  • Whiske上限(大于该值即为异常值):q3数 + 1.5*IQR,(1.5表示超过的比例,是一个系数,可根据实际情况调整);
  • Whisker下限(小于该值即为异常值):q1数 - 1.5*IQR。

首先对这组数据进行排序得到:[12, 30, 36, 40, 45, 50, 80],数组长度n为7;

q1的位置 = 1+(n-1)x 0.25=1 + 6*0.25 =2.5,所以q1的值为:30 + (36 - 30)*0.5 = 33

q2的位置 = 1+(n-1)x 0.5=1 + 6*0.5 =4,所以q2的值为40

q3的位置 = 1+(n-1)x 0.75=1 + 6*0.75 =5.5,所以q3的值为:45 + (50 - 45)*0.5=47.5

例2:一组数据[12, 45, 30, 80, 36, 50, 40, 43],分别求出q1、q2、q3

首先对这组数据进行排序得到:[12, 30, 36, 40, 43, 45, 50, 80],数组长度n为8;

q1的位置 = 1+(n-1)x 0.25=1 + 7*0.25 =2.75,所以q1的值为:30 + (36 - 30)*0.75 = 34.5

q2的位置 = 1+(n-1)x 0.5=1 + 7*0.5 =4.5,所以q2的值为40 + (43-40)*0.5=41.5

q3的位置 = 1+(n-1)x 0.75=1 + 7*0.75 =6.25,所以q3的值为:45 + (50 - 45)*0.25=46.25

在numpy中提供了quantile()函数,可以直接获取四分位数,例如np.quantile(x, 0.25)即可获取数组x中的q1值

Matplotlib中绘制箱线图的方法:boxplot

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_ticks=True, autorange=False,

        zorder=None, *, data=None):

关键参数含义说明如下:

  • x:指定要绘制箱线图的数据,可以是一组数据也可以是多组数据;
  • notch:是否以凹口的形式展现箱线图,默认非凹口;
  • sym:指定异常点的形状,默认为蓝色的+号显示;
  • vert:是否需要将箱线图垂直摆放,默认垂直摆放;
  • whis:指定上下须与上下四分位的距离,默认为1.5倍的四分位差;
  • positions:指定箱线图的位置,默认为range(1, N+1),N为箱线图的数量;
  • widths:指定箱线图的宽度,默认为0.5;
  • patch_artist:是否填充箱体的颜色,默认为False;
  • meanline:是否用线的形式表示均值,默认用点来表示;
  • showmeans:是否显示均值,默认不显示;
  • showcaps:是否显示箱线图顶端和末端的两条线,默认显示;
  • showbox:是否显示箱线图的箱体,默认显示;
  • showfliers:是否显示异常值,默认显示;
  • boxprops:设置箱体的属性,如边框色,填充色等;
  • labels:为箱线图添加标签,类似于图例的作用;
  • filerprops:设置异常值的属性,如异常点的形状、大小、填充色等;
  • medianprops:设置中位数的属性,如线的类型、粗细等;
  • meanprops:设置均值的属性,如点的大小、颜色等;
  • capprops:设置箱线图顶端和末端线条的属性,如颜色、粗细等;
  • whiskerprops:设置须的属性,如颜色、粗细、线的类型等;
  • manage_ticks:是否自适应标签位置,默认为True;
  • autorange:是否自动调整范围,默认为False;

程序举例

(1)绘制单个箱线图

import matplotlib.pyplot as plt
import numpy as np
x = np.array([12, 45, 30, 70, 36, 50, 40, 26, 38])
print(sorted(x))
a = np.quantile(x, 0.75)  # 上四分之一数
b = np.quantile(x, 0.25)  # 下四分之一数
print("平均数:", np.mean(x))  # 打印均值
print("中位数:", np.median(x))  # 打印中位数
print("上四分之一数:", a)  # 打印上四分之一数
print("下四分之一数:", b)  # 打印下四分之一数
up = a + 1.5 * (a - b)  # 异常值判断标准
down = b - 1.5 * (a - b)  # 异常值判断标准
x = np.sort(x)  # 对原始数据排序
shangjie = x[x < up][-1]  # 除了异常值外的最大值
xiajie = x[x > down][0]  # 除了异常值外的最小值
print("上界:", shangjie)  # 打印上界
print("up:", up)
print("down:", down)
print("下界:", xiajie)  # 打印下界
plt.grid(True)  # 显示网格
y = plt.boxplot(x, meanline=True, showmeans=True,
                flierprops={"marker": "o", "markerfacecolor": "red", "markersize": 15})  # 绘制箱形图,设置异常点大小、样式等
plt.show()  # 显示图

程序执行效果图:

 控制台输出结果为:

[12, 26, 30, 36, 38, 40, 45, 50, 70]
平均数: 38.55555555555556
中位数: 38.0
上四分之一数: 45.0
下四分之一数: 30.0
上界: 50
up: 67.5
down: 7.5
下界: 12

(2)绘制多个箱线图

import matplotlib.pyplot as plt
import numpy as np
x = np.random.randint(10, 100, size=(5, 9))  # 随机生成5行9列 [10, 100]之间的数
print(x)  # 打印数据
plt.grid(True)  # 显示网格
plt.boxplot(x, labels=list("ABCDEFGHI"), sym="r+", showmeans=True)  # 绘制箱线图
plt.show()  # 显示图片

程序执行效果图:

 注:图中红色+号表示异常点,绿色三角形表示平均数。

控制台输出的打印结果为:

 更多Python[[90 99 35 32 21 31 83 71 39]
 [24 95 63 50 92 41 89 16 79]
 [73 73 53 21 39 60 50 55 43]
 [64 94 66 26 20 73 40 68 45]
 [74 72 33 81 73 59 85 23 17]]

总结

到此这篇关于Python Matplotlib绘制箱线图的文章就介绍到这了,更多相关Matplotlib绘制箱线图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Django实现文章与多个标签关联的示例详解

    使用Django实现文章与多个标签关联的示例详解

    在构建一个博客或内容管理系统时,经常需要实现文章与标签的关联,在 Django 中,我们可以利用 ManyToManyField 来实现文章与标签的多对多关系,在本文中,我们将详细探讨如何使用 Django 模型实现文章与多个标签的关联,需要的朋友可以参考下
    2023-11-11
  • Python中 map()函数的用法详解

    Python中 map()函数的用法详解

    map( )函数在算法题目里面经常出现,map( )会根据提供的函数对指定序列做映射,在写返回值等需要转换的时候比较常用。这篇文章主要介绍了Python中 map()的用法,需要的朋友可以参考下
    2018-07-07
  • python 动态导入模块实现模块热更新的方法

    python 动态导入模块实现模块热更新的方法

    这篇文章主要介绍了python 动态导入模块,实现模块热更新,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • 基于K.image_data_format() == ''channels_first'' 的理解

    基于K.image_data_format() == ''channels_first'' 的理解

    这篇文章主要介绍了基于K.image_data_format() == 'channels_first' 的理解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Pytorch实现将模型的所有参数的梯度清0

    Pytorch实现将模型的所有参数的梯度清0

    这篇文章主要介绍了Pytorch实现将模型的所有参数的梯度清0,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Django自定义用户认证示例详解

    Django自定义用户认证示例详解

    这篇文章主要给大家介绍了关于Django自定义用户认证的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03
  • python scrapy简单模拟登录的代码分析

    python scrapy简单模拟登录的代码分析

    在本篇文章里小编给大家整理的是一篇关于python scrapy简单模拟登录的代码分析,有兴趣的朋友们可以学习参考下。
    2021-07-07
  • Jupyter Notebook出现不是内部或外部的命令解决方案

    Jupyter Notebook出现不是内部或外部的命令解决方案

    这篇文章主要介绍了Jupyter Notebook出现不是内部或外部的命令解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Python中按值来获取指定的键

    Python中按值来获取指定的键

    今天小编就为大家分享一篇关于Python中按值来获取指定的键,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Python减少循环层次和缩进的技巧分析

    Python减少循环层次和缩进的技巧分析

    这篇文章主要介绍了Python减少循环层次和缩进的技巧,结合实例形式较为详细的分析了Python优化代码跳出循环以减少循环层次的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-03-03

最新评论