matplotlib之pyplot模块——绘制箱线图(盒须图)boxplot()(二)演示外观参数、返回值

当前有效matplotlib版本为:3.4.1

概述

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, *, data=None)

函数的参数为:

  • x:输入数据。类型为数组或向量序列。必备参数。

  • notch:控制箱体中央是否有V型凹槽。当取值为True时,箱体中央有V型凹槽,凹槽表示中位数的置信区间;取值为False时,箱体为矩形。类型为布尔值,默认值为False。可选参数。

  • sym:离群点的默认标记符号,详解flierprops参数。类型为字符串,默认值为'None'。可选参数。取值为''隐藏离群点,取值为'None'时,取值为'b+'

  • vert:箱体的方向,当取值为True时,绘制垂直箱体,当取值为False时,绘制水平箱体。类型为布尔值,默认值为True。可选参数。

  • whis:箱须的位置。类型为浮点数或浮点数二元组,默认值为1.5。 可选参数。

    • 浮点数,则下箱须位于高于Q1-whis*(Q3-Q1)的最低数据处,上箱须位于低于Q3+whis*(Q3-Q1)下方的最高数据处,其中Q1Q3分别为下四分位数和上四分位数。默认值whis=1.5对应于箱线图的原始定义。
    • 浮点数元组,则表示要在绘制箱须的百分位数(例如,(5,95))。将其设置为(0,100)箱须覆盖整个数据范围。
      Q1==Q3时,如果autorangeTruewhis将自动设置为(0,100)

    箱须范围之外的数据将被视为异常值,绘制为点。

  • bootstrap:是否使用bootstrap方法计算中位数置信区间。类型为整数。可选参数。当参数取值为None时,中位数置信区间由某种高斯渐进逼近算法确定。否则,采用bootstrap方法求中位数95%置信区间,bootstrap 参数定义了抽样次数。建议取值范围为1000-10000

  • usermedians:是否指定中位数。类型为一维类数组结构。可选参数。对于一维数组,数组元素个数为1,对于多维数组,长度等于len(x)。如果元素不为None,则将该值强制设置为对应数据集的中位数;如果元素为None,则由matplotlib生成中位数。

  • conf_intervals:是否指定置信区间。类型为类数组结构,形状为 (len(x), 2)。可选参数。如果元素不为None,则将该值强制设置为箱体V型凹槽位置(只有当notch参数为True时绘制);如果元素为None,箱体V型凹槽的位置由其他参数计算,例如bootstrap

  • positions:指定箱体的位置。刻度和极值会自动匹配箱体位置。类型为类数组结构。可选参数。默认值为range(1, N+1)N为箱线图的个数。

  • widths:箱体的宽度。类型为浮点数或类数组结构。默认值为0.50.15*极值间的距离

  • patch_artist:控制箱体的生成对象。类型为布尔值,默认值为False。可选参数。当取值为False时,箱体由Line2D生成,否则,箱体由Patch对象生成。

  • labels:每个数据集的标签,默认值为'None'。类型为序列。可选参数。

  • manage_ticks:控制刻度和标签位置,取值为True时,刻度和标签位置自动匹配箱线图的位置。类型为布尔值,默认值为True。可选参数。

  • autorange:类型为布尔值,默认值为False。可选参数。当取值为True且数据分布满足上四分位数(75%)和下四分位数(25%)相等,whis设置为(0, 100) ,即箱须端点为数据的最大值和最小值。

  • meanline:均值显示为线还是点。类型为布尔值,默认值为False。可选参数。当取值为True,且showmeansshownotches参数均为True,时显示为线,线条属性受meanprops参数控制;否则显示为点。

  • zorder:箱线图的叠放次序。类型为浮点数,默认值为Line2D.zorder = 2。可选参数。

  • showcaps:是否显示箱须两端的横杠。类型为布尔值,默认值为True。可选参数。

  • showbox:是否显示箱体。类型为布尔值,默认值为True。可选参数。

  • showfliers:是否显示离群值。类型为布尔值,默认值为True。可选参数。

  • showmeans:是否显示算术平均值。类型为布尔值,默认值为False。可选参数。

  • capprops:箱须横杠的样式。类型为字典,默认值为None。可选参数。

  • boxprops:箱体的样式。类型为字典,默认值为None。可选参数。

  • whiskerprops:箱须的样式。类型为字典,默认值为None。可选参数。

  • flierprops:离群点的样式。类型为字典,默认值为None。可选参数。

  • medianprops:中位数的样式。类型为字典,默认值为None。可选参数。

  • meanprops:算术平均值的样式。类型为字典,默认值为None。可选参数。

函数返回值为字典对象。该字典将箱线图的每个组件都映射为一个Line2D实例列表。字典的键如下:

  • boxes:箱体。
  • medians:表示中位数的线。
  • whiskers: 箱须线。
  • caps:箱须端点的横杠。
  • fliers: 离群点。
  • means:表示均值的点或线。

案例:演示showcaps参数控制箱须横杠显示

在这里插入图片描述

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.family'] = 'simhei'
plt.rcParams['axes.unicode_minus'] = False

data = np.random.normal(size=1000)

plt.subplot(121)
plt.title("默认样式")
plt.boxplot(data)
plt.subplot(122)
plt.title("隐藏箱须横杠")
plt.boxplot(data, showcaps=False)

plt.show()

案例:演示showbox参数控制箱体显示

在这里插入图片描述

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.family'] = 'simhei'
plt.rcParams['axes.unicode_minus'] = False

data = np.random.normal(size=1000)

plt.subplot(121)
plt.title("默认样式")
plt.boxplot(data)
plt.subplot(122)
plt.title("隐藏箱体")
plt.boxplot(data, showbox=False)

plt.show()

案例:演示showfliers参数控制离群值显示

在这里插入图片描述

案例:演示showfliers参数控制离群值显示

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.family'] = 'simhei'
plt.rcParams['axes.unicode_minus'] = False

data = np.random.normal(size=1000)

plt.subplot(121)
plt.title("默认样式")
plt.boxplot(data)
plt.subplot(122)
plt.title("隐藏离群值")
plt.boxplot(data, showfliers=False)

plt.show()

案例:演示showmeans参数控制均值显示

在这里插入图片描述

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.family'] = 'simhei'
plt.rcParams['axes.unicode_minus'] = False

data = np.random.normal(size=1000)

plt.subplot(121)
plt.title("默认样式")
plt.boxplot(data)
plt.subplot(122)
plt.title("显示均值")
plt.boxplot(data, showmeans=True)

plt.show()

案例:演示capprops参数控制箱须横杠样式

在这里插入图片描述

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.family'] = 'simhei'
plt.rcParams['axes.unicode_minus'] = False

data = np.random.normal(size=1000)

plt.subplot(121)
plt.title("默认样式")
plt.boxplot(data)
plt.subplot(122)
plt.title("设置箱须横杠样式")
plt.boxplot(data, capprops={'color': 'red', 'linewidth': 2, 'linestyle': '--'})

plt.show()

案例:演示boxprops参数控制箱体样式

在这里插入图片描述

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.family'] = 'simhei'
plt.rcParams['axes.unicode_minus'] = False

data = np.random.normal(size=1000)

plt.subplot(121)
plt.title("默认样式")
plt.boxplot(data)
plt.subplot(122)
plt.title("设置箱体样式")
plt.boxplot(data, boxprops={'color': 'b', 'linewidth': 2, 'linestyle': '--'})

plt.show()

案例:演示whiskerprops参数控制箱须样式

在这里插入图片描述

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.family'] = 'simhei'
plt.rcParams['axes.unicode_minus'] = False

data = np.random.normal(size=1000)

plt.subplot(121)
plt.title("默认样式")
plt.boxplot(data)
plt.subplot(122)
plt.title("设置箱须样式")
plt.boxplot(data, whiskerprops={'color': 'g', 'linewidth': 2, 'linestyle': '--'})

plt.show()

案例:演示flierprops参数控制离群点样式

在这里插入图片描述

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.family'] = 'simhei'
plt.rcParams['axes.unicode_minus'] = False

data = np.random.normal(size=1000)

plt.subplot(121)
plt.title("默认样式")
plt.boxplot(data)
plt.subplot(122)
plt.title("设置离群点样式")
plt.boxplot(data, flierprops=dict(marker='o', markerfacecolor='green', markersize=12,
                                  linestyle='none'))

plt.show()

案例:演示medianprops参数控制中位数线样式

在这里插入图片描述

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.family'] = 'simhei'
plt.rcParams['axes.unicode_minus'] = False

data = np.random.normal(size=1000)

plt.subplot(121)
plt.title("默认样式")
plt.boxplot(data)
plt.subplot(122)
plt.title("设置中位数线样式")
plt.boxplot(data, medianprops=dict(color='red', linewidth=3))

plt.show()

案例:演示meanprops参数控制均值样式

在这里插入图片描述

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.family'] = 'simhei'
plt.rcParams['axes.unicode_minus'] = False

data = np.random.normal(size=1000)

plt.subplot(221)
plt.title("默认样式")
plt.boxplot(data)
plt.subplot(222)
plt.title("默认均值样式")
plt.boxplot(data, showmeans=True)
plt.subplot(223)
plt.title("设置均值点样式")
plt.boxplot(data, showmeans=True, meanprops=dict(
    marker='o', markerfacecolor='r'))
plt.subplot(224)
plt.title("设置均值线样式")
plt.boxplot(data, showmeans=True, meanline=True,
            meanprops=dict(color='g', linestyle='--'))
plt.show()

案例:演示patch_artist参数和boxprops参数控制箱体填充样式

在这里插入图片描述

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.family'] = 'simhei'
plt.rcParams['axes.unicode_minus'] = False

data = np.random.normal(size=1000)

plt.subplot(131)
plt.title("默认样式")
plt.boxplot(data)
plt.subplot(132)
plt.title("默认箱体填充样式")
plt.boxplot(data, patch_artist=True)
plt.subplot(133)
plt.title("设置箱体填充颜色")
plt.boxplot(data, patch_artist=True, boxprops=dict(
    facecolor='r'))

plt.show()

案例:演示返回值的不同情况

在这里插入图片描述
输出为:

# 默认样式返回值
{'boxes': [<matplotlib.lines.Line2D object at 0x000001A0F0CA31D0>],
 'caps': [<matplotlib.lines.Line2D object at 0x000001A0F0CA3A90>,
          <matplotlib.lines.Line2D object at 0x000001A0F0CA3D68>],
 'fliers': [<matplotlib.lines.Line2D object at 0x000001A0F2CBA358>],
 'means': [],
 'medians': [<matplotlib.lines.Line2D object at 0x000001A0F2CBA048>],
 'whiskers': [<matplotlib.lines.Line2D object at 0x000001A0F0CA3518>,
              <matplotlib.lines.Line2D object at 0x000001A0F0CA37B8>]}
# 显示均值时的返回值              
{'boxes': [<matplotlib.lines.Line2D object at 0x000001A0F2CFD550>],
 'caps': [<matplotlib.lines.Line2D object at 0x000001A0F2CFDDD8>,
          <matplotlib.lines.Line2D object at 0x000001A0F2D0E0F0>],
 'fliers': [<matplotlib.lines.Line2D object at 0x000001A0F2D0E978>],
 'means': [<matplotlib.lines.Line2D object at 0x000001A0F2D0E6A0>],
 'medians': [<matplotlib.lines.Line2D object at 0x000001A0F2D0E3C8>],
 'whiskers': [<matplotlib.lines.Line2D object at 0x000001A0F2CFD828>,
              <matplotlib.lines.Line2D object at 0x000001A0F2CFDB00>]}
# 箱体由Patch生成时的返回值              
{'boxes': [<matplotlib.patches.PathPatch object at 0x000001A0F2D517F0>],
 'caps': [<matplotlib.lines.Line2D object at 0x000001A0F2D51F98>,
          <matplotlib.lines.Line2D object at 0x000001A0F2D63320>],
 'fliers': [<matplotlib.lines.Line2D object at 0x000001A0F2D638D0>],
 'means': [],
 'medians': [<matplotlib.lines.Line2D object at 0x000001A0F2D635F8>],
 'whiskers': [<matplotlib.lines.Line2D object at 0x000001A0F2D51A58>,
              <matplotlib.lines.Line2D object at 0x000001A0F2D51D30>]}
import matplotlib.pyplot as plt
import numpy as np
from pprint import pprint

plt.rcParams['font.family'] = 'simhei'
plt.rcParams['axes.unicode_minus'] = False

data = np.random.normal(size=1000)

plt.subplot(131)
plt.title("默认样式")
bdict1=plt.boxplot(data)
pprint(bdict1)
plt.subplot(132)
plt.title("显示均值")
bdict2=plt.boxplot(data,showmeans=True)
pprint(bdict2)
plt.subplot(133)
plt.title("箱体由Patch对象生成")
bdict3=plt.boxplot(data,patch_artist=True)
pprint(bdict3)
plt.show()
<think>好的,我现在需要帮助用户解决在箱线图上添加均值连线的问题。用户提到使用Python或R,所以我要分别考虑这两种语言的实现方法。首先,我得回忆一下相关的库和函数,比如在Python中常用的matplotlib和seaborn,而在R中则是ggplot2。 接下来,我需要查阅用户提供的引用内容,特别是引用[2]和[4]。引用[2]中提到了用matplotlib绘制箱线图并标注均值位置,使用ax.plot添加红色圆点标记均值。引用[4]提到连接均值的问题,用户遇到点成竖线的情况,需要调整x轴的位置。这可能是因为在分组箱线图中,每个箱子的位置需要正确对应到折线图的x坐标上。 对于Python部分,用户可能需要先计算每组数据的均值,然后在对应的x位置绘制连线。比如,如果箱线图是按组别分列的,每个组的x位置是1,2,3等,那么均值连线的x坐标也应如此。使用plot函数连接这些点即可。要注意的是,在seaborn中,箱线图的位置可能稍有不同,需要确认x轴的刻度位置是否准确。 在R语言方面,使用ggplot2的话,可能需要先计算每组的均值,然后通过geom_point和geom_line来添加连线和点。同样需要注意分组的变量和x轴的位置是否匹配。 另外,用户可能遇到的问题包括均值点的位置不对,或者连线没有正确连接。这时候需要检查数据的结构,以及绘图时使用的x轴坐标是否正确。例如,在分组箱线图中,每个箱子的实际x坐标可能不是简单的1,2,3,而是有偏移,这时候需要手动调整或使用分组的变量来准确定位。 还需要考虑代码的示例是否清晰,是否需要提供完整可运行的代码,包括数据生成的部分。例如,在Python中使用numpy生成示例数据,然后计算每组的均值,存储为一个列表或数组,再绘制连线。 可能还需要提到如何自定义连线的样式,比如颜色、线型,以及如何添加图例说明均值连线。此外,异常值的处理、箱体样式等设置是否影响均值连线的添加,可能需要简单说明。 总结步骤应该是:绘制箱线图,计算各组的均值,确定每个均值对应的x坐标,使用折线图或散点图在相应位置添加点并连线。需要确保代码示例正确,并且考虑到不同库(如matplotlib和seaborn)之间的差异,以及R中ggplot2的实现方式。 最后,生成相关问题,可能涉及如何调整连线的样式、如何处理分组数据、如何添加其他统计量等,以帮助用户进一步探索。</think>### 分步解答:在箱线图绘制均值连线 #### **Python实现方法** ##### 方法一:Matplotlib 1. **绘制箱线图** 使用`matplotlib.pyplot.boxplot`生成箱线图,并存储返回值以获取箱线图元素的位置信息。 ```python import matplotlib.pyplot as plt import numpy as np # 生成示例数据(假设分3组) np.random.seed(1) data = [np.random.normal(loc=i, scale=1, size=50) for i in range(3)] # 绘制箱线图并获取箱体位置信息 fig, ax = plt.subplots() box = ax.boxplot(data, patch_artist=True) ``` 2. **计算每组数据的均值** 使用`np.mean`计算各组的均值。 ```python means = [np.mean(group) for group in data] ``` 3. **标注均值位置并连线** 通过箱线图的`positions`参数获取各组中心点坐标,使用`plot`绘制连线。 ```python # 获取箱线图的x轴位置(默认为[1,2,3,...]) x_positions = np.arange(1, len(data)+1) # 绘制均值点并连线 ax.plot(x_positions, means, marker='o', color='red', linestyle='--', label='Mean Line') ax.legend() plt.show() ``` ##### 方法:Seaborn 1. **绘制箱线图** Seaborn的`boxplot`自动处理分组逻辑,但需手动计算均值并标注。 ```python import seaborn as sns import pandas as pd # 构造DataFrame格式数据(长格式) df = pd.DataFrame({'Group': np.repeat(['A','B','C'], 50), 'Value': np.concatenate(data)}) # 绘制箱线图 plt.figure(figsize=(8,6)) sns.boxplot(x='Group', y='Value', data=df) ``` 2. **计算均值并添加连线** 使用`groupby`计算各组的均值,通过`plt.plot`连接均值点。 ```python # 计算每组均值 means = df.groupby('Group')['Value'].mean().values # 获取x轴刻度位置(Seaborn默认从0开始) x_ticks = plt.xticks()[0] plt.plot(x_ticks, means, marker='o', color='red', linestyle='--', label='Mean Line') plt.legend() plt.show() ``` #### **R语言实现方法** 1. **使用ggplot2包** ```r library(ggplot2) # 生成示例数据 set.seed(1) df <- data.frame( Group = rep(c("A","B","C"), each=50), Value = c(rnorm(50,0), rnorm(50,1), rnorm(50,2)) ) # 计算每组均值 mean_data <- aggregate(Value ~ Group, df, mean) ``` 2. **绘制箱线图并添加均值连线** 结合`geom_boxplot`和`geom_line`实现。 ```r ggplot(df, aes(x=Group, y=Value)) + geom_boxplot() + geom_line(data=mean_data, aes(x=Group, y=Value, group=1), color="red", linetype="dashed") + geom_point(data=mean_data, aes(x=Group, y=Value), color="red", size=3) + theme_minimal() ``` #### **注意事项** - **坐标对齐**:需确保均值点的x坐标与箱线图的分组位置一致,尤其在分组较多时需检查实际偏移量[^4]。 - **样式调整**:可通过`linestyle`(Python)或`linetype`(R)修改连线样式,`marker`参数调整标记形状[^2][^5]。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值