我正在使用包含错误栏的大熊猫条形图绘制数据(在条形顶部周围是对称的),我想在此图中修改一个单一错误栏的范围,以便它只显示其中的一半。我怎么能这样做?
这是一个具体的例子:
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)
产生如下情节:
我正在尝试 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
,描述了正确的对象,但是我无法在我的情节中修改它。关于如何做到这一点的任何想法?
答案 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()