0

基于这个问题中关于通过循环进行刻面的数据,我想知道是否可以调用 aax = df.plot(kind='bar')并将由此生成的AxesSubplot对象分配给特定的轴位置/坐标?(如第 1 行、第 1 列、第 2 列、第 3 列等...)?

我问的原因并不是真正的刻面条形图,而是使用该geopandas库制作刻面图。如果它适用于条形图,它也可能适用于 geopandas geodataframe.plot() 调用。我无法从轴本身绘制地图,因此我似乎需要反过来——将轴作为绘图调用的副产品,然后将其适当地放置在网格中。

不工作的例子——这里的循环真的是伪的;我不会每次都移动轴索引来绘制不同的面板(实际上,我从 subplots 调用中覆盖了轴对象)。不过,这就是我想做的——将绘图调用生成的轴对象映射到子绘图调用的轴(坐标空间)。

N = 100
industry = ['a','b','c']
city = ['x','y','z']
ind = np.random.choice(industry, N)
cty = np.random.choice(city, N)
jobs = np.random.randint(low=1,high=250,size=N)
df_city =pd.DataFrame({'industry':ind,'city':cty,'jobs':jobs})

## how many panels do we need?
cols =df_city.city.value_counts().shape[0]
fig, axes = plt.subplots(1, cols, figsize=(8, 8))

for x, city in enumerate(df_city.city.value_counts().index.values):
    data = df_city[(df_city['city'] == city)]
    data = data.groupby(['industry']).jobs.sum()
    axes = data.plot(kind='bar')
    print type(axes)
    fig.suptitle('Employment By Industry By City', fontsize=20)

<class 'matplotlib.axes._subplots.AxesSubplot'>
<class 'matplotlib.axes._subplots.AxesSubplot'>
<class 'matplotlib.axes._subplots.AxesSubplot'>

在此处输入图像描述

4

1 回答 1

1

如果我理解正确,那么在另一个问题中接受的答案对使用 pandas 进行此操作的机会过于悲观。这个怎么样:

for ix, (key, group) in enumerate(df_city.groupby('industry')):
    ax = pyplot.subplot(1, 3, ix+1)
    group.groupby('city')['jobs'].sum().plot(kind='bar', ax=ax)
    ax.set_xlabel('industry: {}'.format(key))

有了它,你会得到:

在此处输入图像描述

这个想法是按您想要分隔子图的变量进行分组,然后迭代这些组。对于每个组,使用 为每个组pyplot.subplot定位所需的子图,并在组数据上使用另一个 groupby 以获取要绘制的汇总值。您可以将ax参数传递给以DataFrame.plot告诉它绘制到现有的轴对象中。(我不知道您是否希望它们先按行业分组,然后按每个地块内的城市分组,或者相反,但groupby如果您希望反过来,您只需在两个调用中切换“行业”和“城市” .)

在此版本中,轴限制在子图中未均衡。但是可以对总体思路进行改进以处理该问题。

于 2014-10-06T03:13:21.740 回答