Matplotlib 箱线图使用预先计算(汇总)统计

Posted

技术标签:

【中文标题】Matplotlib 箱线图使用预先计算(汇总)统计【英文标题】:Matplotlib boxplot using precalculated (summary) statistics 【发布时间】:2014-07-02 13:49:38 【问题描述】:

我需要做一个箱线图(在 Python 和 matplotlib 中),但我没有原始的“原始”数据。 我所拥有的是预先计算的最大值、最小值、平均值、中值和 IQR(正态分布),但我仍然想做一个箱线图。当然,绘制异常值是不可能的,但除此之外,我想所有信息都在那里。

我到处寻找答案,但没有成功。我最接近的是同样的问题,但对于 R(我不熟悉)。见Is it possible to plot a boxplot from previously-calculated statistics easily (in R?)

谁能告诉我如何做箱线图?

非常感谢!

【问题讨论】:

此功能存在于 master 分支中,将在 1.4 中(应标记为“很快”)。 github.com/matplotlib/matplotlib/pull/2643 您在这里不需要任何特殊功能 - 只需使用常规 matplotlib boxplot 功能,因为如果您的整个数据集仅包含例如最小值、q1、中值、q3 和最大值,那么当它计算数据集上的汇总统计信息时,它们将是那些精确的点!试试看。 【参考方案1】:

在旧版本中,您必须通过单独更改箱线图元素来手动完成:

Mean=[3.4] #mean
IQR=[3.0,3.9] #inter quantile range
CL=[2.0,5.0] #confidence limit
A=np.random.random(50)
D=plt.boxplot(A) # a simple case with just one variable to boxplot
D['medians'][0].set_ydata(Mean)
D['boxes'][0]._xy[[0,1,4], 1]=IQR[0]
D['boxes'][0]._xy[[2,3],1]=IQR[1]
D['whiskers'][0].set_ydata(np.array([IQR[0], CL[0]]))
D['whiskers'][1].set_ydata(np.array([IQR[1], CL[1]]))
D['caps'][0].set_ydata(np.array([CL[0], CL[0]]))
D['caps'][1].set_ydata(np.array([CL[1], CL[1]]))
_=plt.ylim(np.array(CL)+[-0.1*np.ptp(CL), 0.1*np.ptp(CL)]) #reset the limit

【讨论】:

对于遇到此问题并对语法感到绝望的人:现在有更简单的方法可以做到这一点,请参阅 matplotlib 文档:matplotlib.org/gallery/statistics/bxp.html【参考方案2】:

感谢@tacaswell 的评论,我能够找到所需的文档并提出使用 Matplotlib 1.4.3 的示例。 但是,此示例不会自动将图形缩放到正确的大小。

import matplotlib.pyplot as plt

item = 

item["label"] = 'box' # not required
item["mean"] = 5 # not required
item["med"] = 5.5
item["q1"] = 3.5
item["q3"] = 7.5
#item["cilo"] = 5.3 # not required
#item["cihi"] = 5.7 # not required
item["whislo"] = 2.0 # required
item["whishi"] = 8.0 # required
item["fliers"] = [] # required if showfliers=True

stats = [item]

fig, axes = plt.subplots(1, 1)
axes.bxp(stats)
axes.set_title('Default')
y_axis = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
y_values = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
plt.yticks(y_axis, y_values)

文档的相关链接:

Axes.bxp() function boxplot_stats datastructure other examples using Axes.bxp

【讨论】:

对于像我一样绊倒的人:matplotlib 网站上还有一些文档现在更详细:matplotlib.org/gallery/statistics/bxp.html【参考方案3】:

参考@MKroehnert 和Boxplot drawer functionhttps://matplotlib.org/gallery/statistics/bxp.html 的回答,以下内容可能会有所帮助:

import matplotlib.pyplot as plt

stats = [
    "label": 'A',  # not required
    "mean":  5,  # not required
    "med": 5.5,
    "q1": 3.5,
    "q3": 7.5,
    # "cilo": 5.3 # not required
    # "cihi": 5.7 # not required
    "whislo": 2.0,  # required
    "whishi": 8.0,  # required
    "fliers": []  # required if showfliers=True
    ]

fs = 10  # fontsize

fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(6, 6), sharey=True)
axes.bxp(stats)
axes.set_title('Boxplot for precalculated statistics', fontsize=fs)
plt.show()

【讨论】:

以上是关于Matplotlib 箱线图使用预先计算(汇总)统计的主要内容,如果未能解决你的问题,请参考以下文章

使用 matplotlib 向箱线图添加点散点图

使用 seaborn 或 matplotlib 分组箱线图的数据格式

使用多个连接的箱线图更改 Matplotlib 中的轴刻度

使用 Matplotlib 创建箱线图

没有异常值的 Matplotlib 箱线图

matplotlib:每个类别的箱线图