为什么Pandas在非对称误差条的两侧应用相同的值?

6
我正在尝试使用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,以便误差条正确呈现?

你能否重写这个代码而不使用pandas库? - tacaswell
如果我用plt.errorbar(df.index.values, df['p_hat'].values, yerr=df[['low_delta', 'high_delta']].T.values)替换df['p_hat'].plot(),一切都正常工作,但我想让它在pandas中工作,或者至少知道为什么不行。 - 2daaa
我会向Pandas提交一个错误报告,因为这是Pandas的一个错误。 - tacaswell
根据此处的代码(https://github.com/pydata/pandas/blob/master/pandas/tools/plotting.py),似乎pandas不支持这种类型的操作,尽管文档(http://pandas-docs.github.io/pandas-docs-travis/visualization.html#plotting-with-error-bars)中说应该支持。没有解析序列的非对称误差棒。 - Andrew Mao
错误已报告:https://github.com/pydata/pandas/issues/9536。 - Andrew Mao
1个回答

6
简短回答:使用 1x2xN 形状的误差列表来表示非对称误差条。
例如,在当前示例中使用:
errors = [ f.index.values, df['p_hat'].values ]
df['p_hat'].plot(yerr=[errors])

目前Pandas存在一个bug,当给定一系列的误差条形状为2xN时,pandas会像处理DataFrame多行的多个误差条那样来解释它。由于您显然只绘制了1行/系列,因此错误条列表的第一个元素将被使用并被解释为对称误差。

在Pandas修复这个bug之前,可以通过传递Mx2xN形状的误差来“欺骗”Pandas使用非对称误差条,这是DataFrame期望的形状。确切地说,您必须使用1x2xN形状的列表,可以通过调用例如yerr=[...]来简单地创建。


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