Python:箱线图的理解与绘制

这篇具有很好参考价值的文章主要介绍了Python:箱线图的理解与绘制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录
  • 一、箱线图简介
  • 二、箱线图的绘制
    • 2.1 基于matplotlib库的箱线图绘制
      • (1)函数主要参数及功能
      • (2)函数返回值
      • (3)示例
    • 2.2 基于seaborn库的箱线图绘制
      • (1)函数主要参数功能及其返回值
      • (2)示例
    • 附录
    • Python绘图待扩展阅读

一、箱线图简介

如下图所示,箱线图(箱形图、盒须图)是一种基于5个统计量(上边界、上四分位数、中位数、下四分位数以及下边界)显示数据分布的标准化方法,其可以用来检测数据的异常值和数据分布的形状,以及数据集的离散程度。图中矩形框显示数据集的上下四分位数,而矩形框中延伸出的线段(触须)则用于显示其余数据的分布位置,剩下超过上下四分位间距的数据点则被视为“异常值”。

Python:箱线图的理解与绘制

箱线图主要的组成元素及其具体含义如下所示:

  • 下四分位数Q1:将所有数据按照从小到大的顺序排在第25%的数;
  • 上四分位数Q3:将所有数据按照从小到大的顺序排在第75%的数;
  • 四分位间距(IQR, Interquartile Range):统计学中的一种数学表示方法(也称为四分差),为上四分位数与下四分位之间的距离,可表示为\(\Delta = Q3 - Q1\)
  • 上边界:除异常点以外数据中的最大值,可表示为\(Q3 + 1.5 \Delta\)
  • 下边界:除异常点以外数据中的最小值,可表示为\(Q1 - 1.5 \Delta\)
  • 异常值:小于下边界与大于上边界的值。

二、箱线图的绘制

本文给出基于matplotlib与seaborn库的两种箱线图绘制方法。

2.1 基于matplotlib库的箱线图绘制

matplotlib中绘制箱线图的函数为boxplot(),其函数原型如下所示:

matplotlib.pyplot.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, capwidths=None, *, data=None)

(1)函数主要参数及功能

常用的参数及功能如下表所示,为了方便理解各个参数的含义,本文将其划分为三个不同类别:常规参数显示控制参数以及细节属性参数

参数 功能 参数 功能
常规参数
x 指定要绘制箱形图的数据 notch 是否绘制带缺口的箱形图
patch_artist 是否填充箱体的颜色 vert 是否将箱线图垂直摆放
widths 指定箱线图的宽度 sym 指定异常点的形状
whis 指定上下边界与上下四分位数的距离 labels 为箱线图添加标签
capwidths 设置须线帽长度 position 指定箱线图的位置
显示控制参数
showmeans 是否显示均值点 meanline 是否显示均值线
showbox 是否显示箱形图的箱体 showcaps 是否显示须线帽
showfliers 是否显示异常值
细节属性参数
medianprops 设置中位线属性 meanprops 设置均值点属性
boxprops 设置箱体属性 capprops 设置须帽属性
whiskerprops 设置须线属性 flierprops 设置异常点属性

注意💥:对于细节属性参数需要输入字典格式的数据,其设置方法可参考📖 python-matplotlib | 箱线图及解读 - 知乎

(2)函数返回值

boxplot()函数是以字典格式返回箱线图的每个组件对象,每个键的键值为matplotlib.lines.Line2D类对象的列表,具体包括:

  • boxes:箱体的主体显示四分位数;
  • medians:每个箱体的中位数水平线;
  • whiskers:每个箱体的须线;
  • caps:须线末端的直线,即须线帽;
  • fliers:异常值;
  • means:均值点或直线。

注意💥:如果不启用箱线图的相应元素,相应键值则返回空列表。

(3)示例

更为详细的内容可参考matplotlib官方手册📚:matplotlib.pyplot.boxplot — Matplotlib 3.7.2 documentation。这里选取matplotlib官网上一个具有代表性的箱线图示例作为演示对象(参考🎨:Box plots with custom fill colors — Matplotlib 3.7.2 documentation)。在官网示例的基础上,本文添加了相关参数的使用方法并对代码进行注释,代码如下所示:

import matplotlib.pyplot as plt
import numpy as np

#! 解决不显示的问题:中文设置为宋体格式
plt.rcParams['font.family'] = ["Times New Roman", 'SimSun']

# 生成一个包含三个随机数的数组,每个随机数包含100个数据,且他们的标准差分别为1,2,3
all_data = [np.random.normal(0, std, size=100) for std in range(1,4)]
labels = ['$x_1$', '$x_2$', '$x_3$']

fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(9, 4))

# 绘制矩形箱线图
bplot_rect = ax1.boxplot(
    x=all_data,         # 需要绘制的数据
    vert=True,          # 垂直排列箱线图
    widths=0.3,         # 箱形宽度
    labels=labels,      # 箱形图的标签
    patch_artist=True,  # 是否为箱子填充颜色,默认为False
    medianprops={       # 设置中位线属性
        'linestyle': '-', 'color': 'r', 'linewidth': 1.5
    },
    # showmeans=True,     # 是否显示均值点,默认为False
    # meanline=True,      # 是否显示均值线,默认为False
    # meanprops={         # 设置均值点属性
    #     'marker': 'o', 'markersize': 7.5, 'markeredgewidth': 0.75, 'markerfacecolor': '#b7e1a1', 'markeredgecolor': 'r', 'color': 'k', 'linewidth': 1.5
    # },
    showfliers=True,    # 是否显示异常值,默认为True
    flierprops={        # 设置异常点属性
        'marker': '^', 'markersize': 6.75, 'markeredgewidth': 0.75, 'markerfacecolor': '#ee5500', 'markeredgecolor': 'k'
    },
    whiskerprops={      # 设置须的线条属性
        'linestyle': '--', 'linewidth': 1.2, 'color': '#480656'
    },
    capprops={
        'linestyle': '-', 'linewidth': 1.5, 'color': '#480656'
    }
)
title_rect = ax1.set_title("矩形箱形图")

# 绘制带缺口象形图
bplot_notch = ax2.boxplot(
    x=all_data,         # 需要绘制的数据
    notch=True,         # 是否带有缺口,默认False
    # vert=True,          # 垂直排列箱线图,默认为True
    widths=0.3,         # 箱形宽度
    labels=labels,      # 箱形图的标签
    patch_artist=True,  # 是否为箱子填充颜色,默认为False
    medianprops={       # 设置中位线属性
        'linestyle': '-', 'color': 'r', 'linewidth': 1.5
    },
    # showmeans=True,     # 是否显示均值点,默认为False
    # meanline=True,      # 是否显示均值线,默认为False
    # meanprops={         # 设置均值点属性
    #     'marker': 'o', 'markersize': 7.5, 'markeredgewidth': 0.75, 'markerfacecolor': '#b7e1a1', 'markeredgecolor': 'r', 'color': 'k', 'linewidth': 1.5
    # },
    showfliers=True,    # 是否显示异常值,默认为True
    flierprops={        # 设置异常点属性
        'marker': '^', 'markersize': 6.75, 'markeredgewidth': 0.75, 'markerfacecolor': '#ee5500', 'markeredgecolor': 'k'
    },
    whiskerprops={      # 设置须的线条属性
        'linestyle': '--', 'linewidth': 1.2, 'color': '#480656'
    },
    capprops={
        'linestyle': '-', 'linewidth': 1.5, 'color': '#480656'
    },
)
title_notch = ax2.set_title("带有缺口的箱形图")

# 为箱形图填充颜色
colors = ['pink', 'lightblue', 'lightgreen']
for bplot in (bplot_rect, bplot_notch):
    for patch, color in zip(bplot['boxes'], colors):
        patch.set_facecolor(color)

# 添加水平网格线并设置轴标签
for ax in [ax1, ax2]:
    ax.yaxis.grid(True)
    ax.set_xlabel("样本")
    ax.set_ylabel("观测值")

代码执行结果如下图所示

后续替换中文为宋体的图片

Python:箱线图的理解与绘制

2.2 基于seaborn库的箱线图绘制

Seaborn是基于matplotlib的python数据可视化库。它提供了高层级的接口用于画出统计图。它与pandas库数据接口非常相近,可以直接使用pandas的数据结构。相比较于matplotlib的箱线图绘制,searborn绘制的更加美观。seaborn中绘制箱线图的函数为boxplot(),其函数原型如下所示:

seaborn.boxplot(data=None, *, x=None, y=None, hue=None, hue_order=None, orient=None, color=None, palette=None, saturation=0.75, width=0.8, dodge=True, fliersize=5, linewidth=None, whis=1.5, ax=None, **kwargs)

注意💥:
(1)虽然seaborn的boxplot()能以arraylist以及DataFrame。但是其更适合于对DataFrame格式的数据进行箱线图绘制。因此,在绘制箱线图之前,建议将数据转换为DataFrame格式。本文的介绍以DataFrame格式的数据为例
(2)由于seaborn是基于matplotlib的,因此我们可以直接调用matplotlib.boxplot的参数对箱线图进行设置。

(1)函数主要参数功能及其返回值

常用的参数及功能如下表所示:

参数 功能 参数 功能
xy 数据或向量的变量名 data 用于绘图的数据集
width 箱体的宽度 linewidth 构成图元素的灰线宽度
orient 绘图方向,v(垂直)、h(水平) color 所有元素的颜色
fliersize 异常值标记的大小 notch 是否绘制带缺口的箱形图
whis 控制在超过高低四分位时IQR的比例 ax 使用的Axes轴对象,默认使用当前轴
palette 调色板名称 saturation 控制用于绘制颜色的原始饱和度比例
hue 指定色调的分组 dodge 使用色调嵌套时,元素是否沿分类轴移动
kwargs 可调用matplotlib.axes.Axes.boxplot参数,比如medianpropsboxprops

seaborn.boxplot()函数的返回值为当前绘制图像数matplotlib.Axes据格式的句柄对象

更为详细的内容可参考seaborn官方手册📚:seaborn.boxplot — seaborn 0.12.2 documentation。

(2)示例

下面通过若干个绘图示例来理解seaborn.boxplot参数的功能:

import seaborn as sns
import matplotlib.pyplot as plt

#! 解决不显示的问题:中文设置为宋体格式
plt.rcParams['font.family'] = ["Times New Roman", 'SimSun']

df = sns.load_dataset("titanic")
fig, axs = plt.subplots(nrows=2, ncols=3, figsize=(14,11))

sns.boxplot(ax=axs[0,0], data=df, x ="age", y="class")
axs[0,0].set_title("图1:舱位等级的年龄分布", fontsize=14)
axs[0,0].xaxis.grid(True)

# sns.boxplot(ax=axs[0,1], data=df, x="age", y="class", hue="alive")
sns.boxplot(ax=axs[0,1], data=df, x="class", y="age", hue="alive")  # 对掉x、y参数可以切换水平、垂直绘图
axs[0,1].set_ylabel('')
axs[0,1].set_title("图2:基于存活与否分组的舱位等级年龄分布", fontsize=14)
axs[0,1].yaxis.grid(True)

sns.boxplot(ax=axs[0,2], data=df[["age", "fare"]], orient="h")
axs[0,2].set_title("图3:绘制多列数值型数组的箱线图", fontsize=14)
axs[0,2].xaxis.grid(True)

sns.boxplot(ax=axs[1,0], data=df, x="fare", y="deck", hue="deck", dodge=False)
axs[1,0].set_title("图4:hue参数与dodge参数的作用", fontsize=14)
axs[1,0].xaxis.grid(True)

sns.boxplot(ax=axs[1,1], data=df, x="fare", y="deck", order=["G", "F", "E", "D", "C", "B", "A"], hue="deck", dodge=False)
axs[1,1].set_title("图5:改变图4中y轴的排列次序", fontsize=14)
axs[1,1].xaxis.grid(True)

sns.boxplot(
    ax=axs[1,2], data=df, x="age", y="class",
    notch=True, showcaps=False,
    flierprops={"marker": "^"},
    # boxprops={"facecolor": (.4, .6, .8, .5)},
    medianprops={"color": "r"}
)
axs[1,2].set_title("图6:使用matplotlib.boxplot参数进行配置", fontsize=14)
axs[1,2].xaxis.grid(True)
Python:箱线图的理解与绘制

防采坑💣:在使用df = sns.load_dataset("titanic")导入seaborn自带的数据时,由于网络原因会出现加载不了的问题。对此,可参考博文📖 解决seaborn数据无法导入的问题_无法解析导入 seaborn_ryo007gnnu的博客-CSDN博客进行排雷。

附录

博文鉴赏:文章来源地址https://www.toymoban.com/news/detail-666379.html

  • 📖 如何深刻理解箱线图(boxplot) - 知乎
  • 📖 箱线图(box & whisker plot)—数据准备_whiskers plot_海州湾的博客-CSDN博客
  • 📖 统计学笔记----箱形图以及python实践_ZengHaihong的博客-CSDN博客
  • 📖 箱线图 · python 学习记录

Python绘图待扩展阅读

到了这里,关于Python:箱线图的理解与绘制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python绘制k线图均线图

    Date,Close,Volume,Open,High,Low 06/23/2023,$186.68,53117000,$185.55,$187.56,$185.01 06/22/2023,$187.00,51245330,$183.74,$187.045,$183.67 06/21/2023,$183.96,49515700,$184.90,$185.41,$182.5901 06/20/2023,$185.01,49799090,$184.41,$186.10,$184.41 06/16/2023,$184.92,101256200,$186.73,$186.99,$184.27 06/15/2023,$186.01,65433170,$183.96,$186.52,$183.78 06/14/2023,$

    2024年02月20日
    浏览(39)
  • 绘制多条折线图的python代码实现

    绘制多条折线图的python代码实现 在Python中,我们可以使用matplotlib库来绘制折线图。对于需要同时绘制多条折线图的情况,我们可以通过加入多个线条的方式来达到目的。下面是一个简单的例子,展示了如何在可视化图像中同时绘制多条折线图。 首先,我们需要导入matplotli

    2024年02月08日
    浏览(40)
  • 【Python】Python中使用Matplotlib绘制折线图、散点图、饼形图、柱形图和箱线图

    python数据可视化课程,实验二 Matplotlib 中文API:API 概览 | Matplotlib 一、实验任务的数据背景 提供的源数据(数据文件employee.csv)共拥有4个特征,分别为就业人员、第一产业就业人员、第二产业就业人员、第三产业就业人员。根据3个产业就业人员的数量绘制散点图和折线图。

    2023年04月15日
    浏览(96)
  • Python 折线图的绘制(Seaborn篇-04)

    Python 折线图的绘制(Seaborn篇-04)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔

    2024年01月21日
    浏览(51)
  • python使用matplotlib实现折线图的绘制

    一、意义 数据可视化可以以简洁的方式呈现出数据,发现众多数据中隐藏的规律和意义。Matplotlib是一个数学绘图库。利用它可以制作简单的图表(散点图、折线图)。然后,将基于漫步概念生成一个更有趣的数据集–根据一系列随机决策生成的图表。本文我们主要练习折线

    2024年02月12日
    浏览(35)
  • 利用python绘制二三维曲面和矢量流线图

           为了实现不同数据的可视化,最近研究了python环境下的可视化方案,为后续的流体运动仿真模拟做好储备,由于python处理数据的便利性,导致目前很多后端处理或者可视化成图操作都在python中实现,比如前端是vue,加上简单的交互操作,后端搭建webserver,可采用java或

    2024年02月07日
    浏览(44)
  • Python使用Matplotlib绘制三维折线图(进阶篇)

    三维图像技术是现在国际最先进的计算机展示技术之一,任何普通电脑只需要安装一个插件,就可以在网络浏览器中呈现三维的产品,不但逼真,而且可以动态展示产品的组合过程,特别适合远程浏览。 立体图视觉上层次分明色彩鲜艳,具有很强的视觉冲击力,让观看的人驻

    2024年02月05日
    浏览(63)
  • 数据可视化——用python绘制简单的折线图

    前面我们已经学习了python的基础语法和面向对象,那么接下来我们将学习python编程语言的过人之处——数据的可视化之折线图。 说到数据可视化,我们需要先知道什么是JSON。 json是一种轻量级的数据交互格式,可以按照json指定的格式去组织和封装数据 json本质上是一个带有特

    2024年02月17日
    浏览(42)
  • Python绘制折线图、散点图...Pyplot库功能使用示例大全

    matplotlib.pyplot库是Python中一个非常重要的可视化工具,可以用于绘制各种图表。本文给出了图表绘制的各种示例 1、简单折线图示例 代码中首先导入了matplotlib.pyplot库和numpy库。生成了一些数据并使用plt.plot()函数绘制了折线图,同时使用plt.title()、plt.xlabel()和plt.ylabel() 函数为图

    2024年02月14日
    浏览(41)
  • Python使用Matplotlib库绘制双y轴图形(柱状图+折线图)

    今天是第一次写 踩坑日记 系列,这个系列用来记录在Python和R学习过程中遇到的问题和结果。今天介绍的是使用Python的matplotlib库绘制两个y轴图的一些基本用法与踩坑行为。希望可以帮助到大家,也希望大家可以给出建议,欢迎留言交流。 Matplotlib是Python数据分析中常用的可视

    2024年02月15日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包