【问题标题】:Clustered Stacked bar plot over time python随时间变化的聚集堆积条形图python
【发布时间】:2021-10-04 02:11:32
【问题描述】:

我有一个如下的数据框:

   time       type      category   count
2021/01/01   regular       A         2
2021/01/02   new           B         3
2021/01/02   regular       A         5
2021/01/03   new           A         1
... and so on

我想要的是一个聚集的堆积条形图,这样时间在 x 轴上并且是有序的,在 y 轴上的计数,并且该图应该能够讲述特定日期的信息有多少常规类型的 A 类访问(计数)当天的总常客数量和新类型的相同。

为此我假设我们首先需要以某种方式转换数据,以便我们拥有所有计数为零的组合,因此上表中的第一个条目将被转换为四个条目,例如:

   time       type      category   count
2021/01/01   regular       A         2
2021/01/01   regular       B         0
2021/01/01   new           A         0
2021/01/01   new           B         0
... and so on

请指导我如何实现我想要的。我是这个可视化的新手

编辑 我可以使用以下方法填写缺失值:

pd.DataFrame({'count' :df.groupby(['time','type','category']).size().unstack(fill_value=0).stack()}).reset_index()

仍然不确定如何在堆叠的多条图中绘制它。如果有比这个情节更好的选择,请提出建议。

【问题讨论】:

    标签: python pandas matplotlib seaborn data-visualization


    【解决方案1】:

    您的期望并不完全清楚(请提供示例,即使只是示意图),但这里有一些示例。

    首先,您需要使用pivot 修改一些数据框:

    df_pivot = df.pivot(index='time', columns=['type', 'category']).fillna(0)['count']
    df_pivot
    

    输出:

    type       regular  new     
    category         A    B    A
    time                        
    2021/01/01     2.0  0.0  0.0
    2021/01/02     5.0  3.0  0.0
    2021/01/03     0.0  0.0  1.0
    

    然后你可以用:

    df_pivot.plot.bar(stacked=True)
    

    如果你想确保你拥有所有类别,你需要reindex

    import itertools
    idx = itertools.product(df['type'].unique(), df['category'].unique())
    df_pivot = df_pivot.reindex(idx, axis=1).fillna(0)
    df_pivot.plot.bar(stacked=True)
    

    【讨论】: