访问通过pandas调用的绘图中的绘图对象的句柄

时间:2014-02-20 15:41:41

标签: python matplotlib plot pandas

我想利用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,然后在第二次调用之后再次获取容器列表,并获取设置差异,但这不起作用。

1 个答案:

答案 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完成这一切可能更容易,而不是试图调整大熊猫的回馈。