自定义boxplot、python中胡须的值

自定义boxplot、python中胡须的值,python,matplotlib,Python,Matplotlib,我想用mean+-2*std作为晶须的上限值绘制一个箱线图。但是,箱线图只能将胡须的上限值设置为百分位值。e、 g # The code below plot a boxplot that has cap values equal to 5th and 95th percentiles. boxplot(data_list,Whis = [5,95]) 假设我的分布不是正态分布,那么第95/5个百分位数将不是平均值+2std/平均值-2std。 因此,使用5/95百分位值表示平均值+-2*s

我想用mean+-2*std作为晶须的上限值绘制一个箱线图。但是,箱线图只能将胡须的上限值设置为百分位值。e、 g

# The code below plot a boxplot that has cap values equal to 5th and 95th percentiles. 
boxplot(data_list,Whis = [5,95])
假设我的分布不是正态分布,那么第95/5个百分位数将不是平均值+2std/平均值-2std。 因此,使用5/95百分位值表示平均值+-2*std是不准确的

我的问题是,如何为客户定制胡须帽值的箱线图?
非常感谢

Matplotlib没有提供将胡须指定为分位数以外的方法。如果您想使用平均值和±2倍标准偏差,您需要滚动自己的值,即将这些值转换为百分位数,并将其作为whis参数提供

例如:

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(42)
data = np.random.normal(size=10_000)

mean = np.mean(data)
std = np.std(data)
whis = np.interp([mean-2*std, mean+2*std], np.sort(data), np.linspace(0,1,data.size)) * 100

fig, (axl,axr) = plt.subplots(ncols=2)
axl.set_title('Default')
axl.boxplot(data)
axr.set_title(f'μ ± 2σ ({mean-2*std:.2f}, {mean+2*std:.2f})')
axr.boxplot(data, whis=whis, usermedians=[mean])
有一个警告:胡须不是从给定的第一个百分位值到给定的第二个百分位值参数whis绘制的,而是从第一个百分位值上方的最低数据点到第二个百分位值下方的最高数据点绘制的。这就是为什么对于相对较小的数据集,曲线图中的晶须末端不完全匹配μ±2σ


但请注意,这不再是一个盒子和胡须的阴谋,因此您应该清楚地描述您在这里策划的是什么,否则人们将被误导。

欢迎使用。这不是一个讨论论坛或教程。我不认为boxplot能体现Whisker的价值。所以这就是为什么我在这里问。如果你不认为它们可以定制,为什么你问。通读-几乎所有东西都可以定制,胡须是艺术家-它们有属性和方法。图库中的示例中的任何解决方案有用吗?中有一个指向源的链接-您应该能够看到胡须是如何计算和定位的,这应该给你一个起点。代码很好而且干净,所以+1。我还发现胡须不是直观的,而是在MATLAB中使用自定义绘制的箱线图。无论如何:一个警告主要是对OP,我更喜欢胡须在5%和95%分位数。若箱线图不表示分位数,而是表示标准偏差的倍数,那个么可能很难理解,我们希望得到数据的高斯分布……非常感谢。你的评论很有帮助。