Seaborn条形图是否可以输入置信区间/误差线的值?

10

我习惯在seaborn上制作我的条形图,并且喜欢它用于显示置信区间的布局,但是我有一个特殊情况,我已经有了置信区间的数据集,就像这样:

month   ci-b     mean    ci-t
201801  0.020   0.0206  0.021
201802  0.019   0.0198  0.0204
201803  0.022   0.0225  0.0228
201804  0.022   0.0236  0.0240
201805  0.023   0.0235  0.0239

有没有一种方法可以手动输入seaborn置信区间线的值?或者将其用作“None”,并使用一些matlib函数将置信区间放在图表中(但保留seaborn的条形图)

当我执行以下操作时:

ax = sns.barplot('month','mean',data=df, ci=None)

如预期一样,我得到了一个普通的条形图:

This graphic

当我尝试使用matlib的误差条时,出现以下情况:

ax = sns.barplot('month','mean',data=df, ci=None)
plt.errorbar(x=df['month'],y=df['mean'],yerr=(df['ci-t']-df['ci-b']))

只有一行奇怪的线路丢失,所有东西都会变得混乱:

像这样的图形

我是否在错误地使用errorbar?还有更好的工具吗?

1个回答

9

更新(2019年8月2日):

我的早期回答(见下文)过分强调了错误,因为yerr如果传递一个形状为(N,)的单个数组,则会使用相同的顶部和底部误差。要获取不同的底部和顶部误差,我们需要使用形状为(2,N)的数组。第一行用于底部误差,第二行用于顶部误差(参见文档)。在代码中,这样写:

# Bottom error, then top
yerr = [df['mean']-df['ci-b'], df['ci-t'] - df['mean']]

ax = sns.barplot('month','mean',data=df, ci=None)
plt.errorbar(x=[0, 1, 2, 3, 4],y=df['mean'],
            yerr=yerr, fmt='none', c= 'r')

结果如下: 这里输入图片描述 底部和顶部的错误现在不同。下面是直接比较,原始(对称)误差线为红色,非对称误差线为蓝色。我们可以直接看到差异: 这里输入图片描述 早期回答的误差有夸张。由于Seaborn和Matplotlib对月份的解释不同,因此导致误差线的奇怪放置。您还需要指定“fmt ='none'”以避免将错误线绘制为数据点的线条。以下代码将误差线放置在正确的x位置:
ax = sns.barplot('month','mean',data=df, ci=None)
plt.errorbar(x=[0, 1, 2, 3, 4],y=df['mean'],
             yerr=(df['ci-t']-df['ci-b']), fmt='none', c= 'r')

enter image description here


1
如果我理解正确的话,我认为这种方法会过度表示(可能会使误差线的大小翻倍)。看看第四列,201804。图中的上限似乎在或高于0.025,而在OP的表格中,上限仅为0.024? - Russell Richie
是的,我认为你可能是正确的,因为当传递一个一维值数组时,plt.errorbar 在两侧添加并减去相同的误差。这里是文档 - willk
为了纠正这个问题,看起来我们需要传递一个形状为(2, N)的值数组到yerr,第一行是负误差,后面是正误差。所以调用应该像这样:yerr=[df['ci-mean']-df['ci-b'], df['ci-t'] - df['ci-mean']]。我认为这是文档的正确解释。在原始答案中,同样的误差被加上和减去。这是不正确的,因为误差是从上到下导出的,而实际上有单独的误差。 - willk
我根据你的评论修改了我的答案。我认为错误现在应该已经被纠正了,但是欢迎更多的反馈。 - willk
1
我认为这是正确的,但你可能想把更正后的代码放在顶部,以防其他人盲目地采用你答案的第一部分。 :-) - Russell Richie
1
完成了!感谢您仔细查看。如果您没有指出我的错误,我可能会一无所知! - willk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接