在循环中进行分面 - 将df.plot分配给轴

时间:2014-10-06 02:56:07

标签: python matplotlib plot facet geopandas

基于来自this question的数据,通过循环进行分割,我想知道是否可以调用ax = df.plot(kind='bar')并将生成的AxesSubplot对象分配给特定的轴位置/坐标? (如小平面第1行,第1,2,3等等......)?

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

非工作示例 - 这里的循环非常伪;我没有移动轴索引以每次绘制不同的面板(事实上,我从子图调用中覆盖了轴对象)。也就是说,我想做的是 - 将绘图调用生成的轴对象映射到子图调用中的轴(坐标空间)。

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'>

enter image description here

1 个答案:

答案 0 :(得分:0)

如果我理解得对,那另一个问题中接受的答案对于用大熊猫做这件事的可能性过于悲观。怎么样:

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))

你得到:

enter image description here

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

在此版本中,子图上的轴限制不均衡。但总体思路可以完善处理。