如何从列在分组条形图上添加错误条

2022-02-27 00:00:00 python pandas matplotlib seaborn bar-chart

问题描述

我有一个pandas数据框df,它有四列:CandidateSample_SetValuesError。比方说,Candidate列有三个唯一条目:[X, Y, Z],我们有三个样本集,因此Sample_Set也有三个唯一值:[1,2,3]。DF大致如下所示。

import pandas as pd

data = {'Candidate': ['X', 'Y', 'Z', 'X', 'Y', 'Z', 'X', 'Y', 'Z'],
        'Sample_Set': [1, 1, 1, 2, 2, 2, 3, 3, 3],
        'Values': [20, 10, 10, 200, 101, 99, 1999, 998, 1003],
        'Error': [5, 2, 3, 30, 30, 30, 10, 10, 10]}
df = pd.DataFrame(data)

# display(df)
  Candidate  Sample_Set  Values  Error
0         X           1      20      5
1         Y           1      10      2
2         Z           1      10      3
3         X           2     200     30
4         Y           2     101     30
5         Z           2      99     30
6         X           3    1999     10
7         Y           3     998     10
8         Z           3    1003     10

我使用seaborn用x="Candidate"y="Values"hue="Sample_Set"创建了一个分组条形图。一切都很好,直到我尝试使用名为Error的列下的值沿y轴添加一个误差栏。我正在使用以下代码。

import seaborn as sns

ax = sns.factorplot(x="Candidate", y="Values", hue="Sample_Set", data=df,
                    size=8, kind="bar")

如何合并错误?

我希望能为这项任务提供解决方案或更优雅的方法。


解决方案

正如@Resmar在评论中指出的那样,Seborn中似乎没有用于轻松设置单个错误条的内置功能。

如果您更关心结果而不是实现目标的方式,以下(不是很优雅的)解决方案可能会有帮助,它建立在matplotlib.pyplot.bar的基础上。海运导入仅用于获取相同样式。

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd

def grouped_barplot(df, cat,subcat, val , err):
    u = df[cat].unique()
    x = np.arange(len(u))
    subx = df[subcat].unique()
    offsets = (np.arange(len(subx))-np.arange(len(subx)).mean())/(len(subx)+1.)
    width= np.diff(offsets).mean()
    for i,gr in enumerate(subx):
        dfg = df[df[subcat] == gr]
        plt.bar(x+offsets[i], dfg[val].values, width=width, 
                label="{} {}".format(subcat, gr), yerr=dfg[err].values)
    plt.xlabel(cat)
    plt.ylabel(val)
    plt.xticks(x, u)
    plt.legend()
    plt.show()


cat = "Candidate"
subcat = "Sample_Set"
val = "Values"
err = "Error"

# call the function with df from the question
grouped_barplot(df, cat, subcat, val, err )

请注意,只需颠倒类别和子类别

cat = "Sample_Set"
subcat = "Candidate"

您可以获得不同的分组:

相关文章