首页 > 解决方案 > 如何在python中绘制按类别分组的置信区间

问题描述

我有以下形状的日期:

示例数据

如何使用 python(pandas/matplotlib 或任何库)绘制它,使其看起来像这样: 示例输出

标签: python-3.xpandasnumpymatplotlib

解决方案


我想我会尝试用普通的箱线图来做。根据您想要的漂亮程度,您可以获得接近您想要的东西。我通常使用 seaborn,但它基于 matplotlib,所以如果你愿意,不应该做太多的改变来保持它的纯 mpl。

我模仿了你的数据集

import pandas as pd
import seaborn as sns

data = [['A','A','B','B','C','C'],
       [1, 1.1, 0.7, 1.2, 0.8, 1.1],
       [1.5, 1.4, 1.4, 1.7, 1.6, 1.4],
       [1.8, 1.8, 2.1, 2.2, 2.4, 1.7]]

df = pd.DataFrame(data).T
df.columns = ["Group","Lower","Average","Upper"]

然后,我将列融合回行,并删除平均值。这留下了最大值和最小值。我不得不添加一个新列作为色调,以便单独绘制每组中的项目。

df = df.melt(id_vars=["Group"],value_vars=["Lower","Average","Upper"])
df = df[df["variable"] != "Average"]
df["hue"] = df.groupby(["Group","variable"]).cumcount()

如果您绘制一个将 whis 设置为 100 的框和胡须,那么它会为您提供最大值和最小值,平均值在中间(因为它只有两个数据点,它与您的平均值列相同)。

g = sns.boxplot(x='Group',
                y='value',
                hue="hue",
                data=df,
                whis=(0,100),
                meanline=True,
                showbox=False,
                width=0.5)
g.get_legend().remove()

我找不到强制显示垂直线剩余部分的方法。缝隙是盒子所在的地方,但你可以隐藏它,尤其是现在它已经毫无意义了。无论如何,这是最终结果:

在此处输入图像描述


推荐阅读