修改pandas barplot

时间:2016-11-22 19:43:09

标签: pandas matplotlib

我正在使用包含错误栏的大熊猫条形图绘制数据(在条形顶部周围是对称的),我想在此图中修改一个单一错误栏的范围,以便它只显示其中的一半。我怎么能这样做?

这是一个具体的例子:

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

bars = pd.DataFrame(np.random.randn(2,2), index=['a','b'], columns=['c','d'])
errs = pd.DataFrame(np.random.randn(2,2), index=['a','b'], columns=['c','d'])

ax = bars.plot.barh(color=['r','g'],xerr=errs)

产生如下情节:

barplot example with errorbars

我正在尝试 a posteriori 访问并修改索引a和列d的错误栏的范围,以便它只显示其前半部分,即段[bar_top-err, bar_top]而不是[bar_top-err, bar_top+err]。我试图检索以下matplotlib对象:

plt.getp(ax.get_children()[1],'paths')[0]

如果我没弄错的话,它是一个Bbox,描述了正确的对象,但是我无法在我的情节中修改它。关于如何做到这一点的任何想法?

1 个答案:

答案 0 :(得分:1)

你几乎就在那里,只需要修改和更新path.vertices中的坐标。我冒昧地假设您希望错误栏面向“远离零”,而不仅仅是显示它的负面部分:

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

bars = pd.DataFrame(np.random.randn(2,2), index=['a','b'], columns=['c','d'])
errs = pd.DataFrame(np.random.randn(2,2), index=['a','b'], columns=['c','d'])

ax = bars.plot.barh(color=['r','g'], xerr=errs)
child = ax.get_children()[1]

path = plt.getp(child, 'paths')[0]
bar_top = path.vertices.mean(axis=0)[0]

# replace the right tail if bar is negative or left tail if it's positive
method = np.argmin if np.sign(bar_top)==1 else np.argmax
idx = method(path.vertices, axis=0)[0]
path.vertices[idx, 0] = bar_top

plt.savefig('figs/hack-linecollections.png', dpi=150)
plt.show()

hack-linecollections