【问题标题】:Plot subplots base on a column's values by using loop使用循环根据列的值绘制子图
【发布时间】:2021-03-23 10:46:49
【问题描述】:

我想根据数据框列的值(列的值:“名称”)绘制子图。我可以绘制一个图,但是当使用循环绘制多个图时,它们不显示。

绘制一个情节

d = {'date': ['2020-01', '2020-01', '2020-02', '2020-02'], 'id':[1, 2, 3, 4], 'name':['a', 'b', 'b', 'a'], 'type':['org', 'person', 'org', 'person']}
df = pd.DataFrame(data=d)

pivot = df[df['name'] == 'a'].groupby('date')['type'].value_counts(normalize=True).mul(100).reset_index(name='count').pivot('date', 'type', 'count')
ax = pivot.plot(kind='bar')
ax.legend(bbox_to_anchor=(1, 1), loc='upper left')

使用循环根据列的值绘制子图:“名称”

for i, name in enumerate(names):
    ax = plt.subplot(1, 2, i+1)
    pivot = df[df['name'] == name].groupby('date')['type'].value_counts(normalize=True).mul(100).reset_index(name='count').pivot('date', 'type', 'count')
    ax.plot(kind='bar', stacked=True, data=pivot)
    ax.legend(bbox_to_anchor=(1, 1), loc='upper left')

【问题讨论】:

    标签: pandas matplotlib


    【解决方案1】:

    试试 Pandas 的绘图功能。此外,使用groupby 可以更快地提取数据:

    for i, (name, data) in enumerate(df.groupby('name')):
        ax = plt.subplot(1, 2, i+1)
        pivot = (data.groupby('date')['type']
                     .value_counts(normalize=True)
                     .mul(100).unstack('type')              # you don't need to reset index, just unstack
                     .plot(kind='bar', stacked=True, ax=ax) # plot with pandas plot function
                )
    
        ax.legend(bbox_to_anchor=(1, 1), loc='upper left')
    

    输出:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 2020-05-15
      • 2015-08-03
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      相关资源
      最近更新 更多