【问题标题】:Accessing handles of plot objects in plot called through pandas访问通过 pandas 调用的绘图中绘图对象的句柄
【发布时间】:2014-02-20 15:41:41
【问题描述】:

我想利用 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,然后在第二次调用后再次获取,并获取设置的差异,但这没有用。

【问题讨论】:

  • 实际上,如果我在每种情况下都使用 list(gca().containers) ,那么它工作正常,并且 set(c2)-set(c1) 得到了我想要的。所以我认为这是我自己问题的答案。

标签: python matplotlib plot pandas


【解决方案1】:

您正在寻找坐标区的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 完成这一切可能会更容易,而不是尝试调整 pandas 回馈的内容。

【讨论】:

  • 谢谢。也许我应该更详细或更清楚地说明一些东西。是的,我实际上是在补丁上使用循环,并且正如你所说的 set_x 。但是这个问题是关于通过 pandas 的绘图调用获取新创建的补丁列表。换句话说,我认为您的建议对于移动第二组条而不是第一组没有用。是吗?
  • df2.plot() 行中,您设置了ax=ax,它修改了先前的坐标区对象您ax2 对象 ax。所以 ax.patches 将有来自df.plots() 的补丁。你可以通过定义做ax=df1.plot(...); old_patches = set(ax.patches)来获得新的。然后做df2.plot(ax=ax,...); new_patches=set(ax.patches) - old_patches。不过这有点骇人听闻。
  • 你真的试过了吗?我在我的问题中添加了评论,以更具体地说明导致我发帖的一些问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 2013-08-09
  • 1970-01-01
  • 2020-07-25
  • 2019-06-26
  • 1970-01-01
  • 2017-02-21
相关资源
最近更新 更多