小能豆

使用 matplotlib 绘制奇怪的箱线图形状

py

data= np.array([9,13,10,9,13,5,13,9,7,9,13,11])
fig9, ax9 = plt.subplots()
ax9.boxplot(data, notch=True)

我得到了奇怪的缺口箱线图。我想使用缺口来突出显示中位数。为什么这个图显示出奇怪的形状?这难道不奇怪吗?

hvIG1.png

我使用 MacOS 10.14.5 和 python 3.7.2。


阅读 23

收藏
2024-11-16

共1个答案

小能豆

出现您所描述的奇怪箱线图缺口的原因,可能与 数据样本量较小 和 Matplotlib 对于缺口计算的方式有关。Matplotlib 使用 近似方法 来绘制缺口,缺口的宽度基于中位数的置信区间估计。当样本量较小时,估计可能会显得不准确,导致缺口看起来非常大甚至不符合直觉。


背景知识:缺口箱线图

  1. 缺口含义
  2. 缺口的上下边界表示中位数的置信区间,通常基于 95% 的置信区间计算。
  3. 如果两个缺口不重叠,则表明两组数据的中位数可能有统计显著性差异。

  4. Matplotlib 中缺口的计算

  5. Matplotlib 使用公式:
    [
    \text{Notch Interval} = \text{Median} \pm 1.57 \times \frac{\text{IQR}}{\sqrt{n}}
    ]

    • Median: 数据的中位数。
    • IQR: 四分位距(上四分位数 - 下四分位数)。
    • n: 数据点数。
  6. 当数据量较小时,样本的变异性大,导致置信区间宽度可能会被高估。


您图形的问题

在您的代码中:

data = np.array([9, 13, 10, 9, 13, 5, 13, 9, 7, 9, 13, 11])
fig9, ax9 = plt.subplots()
ax9.boxplot(data, notch=True)
  • 数据特性
  • 样本量 ( n = 12 ),较小。
  • 数据分布偏向集中(多个点取值为 9 和 13),但存在一定变异性。

  • 缺口问题

  • 数据量较小导致估计的中位数置信区间过大,因此缺口非常宽。
  • 这在样本量小时是常见问题,Matplotlib 的缺口绘制在这种情况下容易失真。

解决方案

  1. 增加数据量
    如果可能,尝试提供更大的数据集,以减少中位数置信区间的估计误差。

  2. 不使用缺口
    如果您不需要显示置信区间,可以通过将 notch=False 来禁用缺口。

python ax9.boxplot(data, notch=False)

  1. 自定义绘制缺口
    如果您需要更精确的缺口显示,可以手动计算中位数的置信区间并绘制。例如:

```python
import numpy as np
import matplotlib.pyplot as plt

data = np.array([9, 13, 10, 9, 13, 5, 13, 9, 7, 9, 13, 11])

# 计算统计量
median = np.median(data)
q1 = np.percentile(data, 25)
q3 = np.percentile(data, 75)
iqr = q3 - q1
n = len(data)

# 自定义缺口宽度
notch_interval = 1.57 * (iqr / np.sqrt(n))
lower_notch = median - notch_interval
upper_notch = median + notch_interval

# 绘制箱线图
fig, ax = plt.subplots()
ax.boxplot(data, notch=False)
ax.hlines([lower_notch, upper_notch], 0.9, 1.1, colors=’red’, linestyles=’dashed’, label=’Notch CI’)
ax.legend()
plt.show()
```

  1. 检查 Matplotlib 的版本
    有时特定版本的 Matplotlib 可能会引入绘图问题,建议升级到最新版本。

bash pip install --upgrade matplotlib


总结

缺口箱线图在样本量较小时可能会出现不直观的结果,因为置信区间估计受到样本数量的限制。如果缺口的形状过于奇怪,可以考虑增加样本量或禁用缺口绘制。

2024-11-16