我想利用pandas DataFrames的堆积条形图功能。但是,我想通过修改刚绘制的条形来跟进。为此,我需要访问他们的图形句柄。但是我从df.plot()获得的是一个轴句柄。 如何获取特定呼叫中专门创建的内容列表?例如,如果在早期的图中相同的轴上存在预先存在的对象,那么这是必要的,我想区分,即仅处理新的对象。这是我的代码,它绘制两次到同一轴。我想最终让堆叠的条形物彼此相邻聚集,所以我想我可以让它们变得更窄并且左右移动它们。但为此我需要处理第二次调用中所做的事情。
import random
import pandas as pd
import numpy as np
from pylab import *
close('all')
df = pd.DataFrame(np.random.random((7, 5)) * 10,
index=list('abcdefg'), columns=list('ABCDE'))
print df
ax = df.plot(kind='bar', stacked=True, align='center')
c1=ax.containers
hh=findobj(ax,lambda xx:hasattr(xx,'width'))
setp(hh,'width',.3)
print hh
df2= pd.DataFrame(np.random.random((6, 5)) * 10,
index=list('abcdef'), columns=list('FGHIJ'))
ax2 = df2.plot(kind='bar', stacked=True, align='center', ax=ax,colormap='bone')
c2=ax2.containers
print ax==ax2 # Should be true
c1==c2 # Should be False
show()
我试图在第一次调用后获取容器列表ax.containers,然后在第二次调用之后再次获取容器列表,并获取设置差异,但这不起作用。
答案 0 :(得分:2)
您正在寻找轴的patches
属性。您可以使用[p.get_x() for p in ax.patches]
获取原始x位置。这给出了每个补丁的左端点。
您需要为每个补丁添加或减去一些值。类似于:new_xs = [p.get_x() - .5 for p in ax.patches]
。然后set_x
到新值:
>>>for p, x in zip(ax.patches, new_xs):
p.set_x(x)
您可能还需要更多地传播x_ticks
,或者使用p.set_width()
将每个补丁的宽度缩小。通过matplotlib完成这一切可能更容易,而不是试图调整大熊猫的回馈。