如何从列在分组条形图上添加错误条
问题描述
我有一个pandas数据框df
,它有四列:Candidate
、Sample_Set
、Values
和Error
。比方说,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"
您可以获得不同的分组:
相关文章