我试图使用pandas和matplotlib使用以下代码绘制带有非对称误差线的系列:
d = {'high_delta': {1: 0.6,
2: 0.1,
3: 0.2,
4: 0.1,
5: 0.1,
6: 0.1,
7: 0.1,
8: 0.1,
9: 0.2,
10: 0.1},
'low_delta': {1: 0.2,
2: 0.1,
3: 0.1,
4: 0.1,
5: 0.1,
6: 0.1,
7: 0.1,
8: 0.1,
9: 0.1,
10: 0.4},
'p_hat': {1: 0.2,
2: 0.1,
3: 0.3,
4: 0.3,
5: 0.1,
6: 0.3,
7: 0.2,
8: 0.2,
9: 0.1,
10: 0.8}}
df = pandas.DataFrame(d)
df['p_hat'].plot(yerr=df[['low_delta', 'high_delta']].T.values)
(df.p_hat + df.high_delta).plot(style='.')
(df.p_hat - df.low_delta).plot(style='*')
下限似乎总是符合我的预期,但不是在上限添加值,而是再次添加下限的值。
如何将错误传递到matplotlib以便正确呈现错误条?
答案 0 :(得分:6)
简短回答:对非对称误差线使用1x2xN形错误列表。
F.ex。在当前示例中使用
errors = [ f.index.values, df['p_hat'].values ]
df['p_hat'].plot(yerr=[errors])
目前Pandas中存在一个错误,导致pandas解释一个系列的形状2xN中给出的错误条,就像它解释多个DataFrame行的多个错误条一样。由于您显然只绘制了1行/系列,因此仅使用错误栏列表的第一个元素并将其解释为对称错误。
在pandas中修复bug之前,可以通过传递Mx2xN形状的错误来“欺骗”大熊猫使用非对称错误条,就像DataFrame上非对称误差条的预期形状一样。确切地说,您必须使用1x2xN形状列表,可以通过调用f.ex简单地创建。 yerr=[ ... ]