如何从 Pandas DataFrame 开始绘制堆叠时间直方图?

Posted

技术标签:

【中文标题】如何从 Pandas DataFrame 开始绘制堆叠时间直方图?【英文标题】:How to plot stacked time histogram starting from a Pandas DataFrame? 【发布时间】:2019-02-12 12:22:53 【问题描述】:

考虑以下 DataFrame df

Date                   Kind
2018-09-01 13:15:32    Red
2018-09-02 16:13:26    Blue
2018-09-04 22:10:09    Blue
2018-09-04 09:55:30    Red
...                    ...

其中有一列具有 datetime64[ns] dtype,另一列包含 np.object,它只能假设有限数量的值(在本例中为 2)。

您必须绘制一个日期直方图,其中包含:

在 x 轴上,日期(显示月份和日期的每日直方图); 在 y 轴上,属于该日期的项目数,以堆叠条形显示蓝色和红色之间的差异。

如何使用 Matplotlib 实现这一点?

我正在考虑做一个 set_index 并重新采样如下:

df.set_index('Date', inplace=True)
df.resample('1d').count()

但我丢失了有关每种物品的物品数量的信息。我还想将任何缺失的日期保持为零。

非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

使用groupbycountunstack调整数据框:

df2 = df.groupby(['Date', 'Kind'])['Kind'].count().unstack('Kind').fillna(0)

接下来,对数据帧重新采样并对每天的计数求和。这还将添加任何不在数据框中的缺失天数(如指定的那样)。然后调整索引只保留日期部分。

df2 = df2.resample('D').sum()
df2.index = df2.index.date    

现在用stacked=True绘制数据框:

df2.plot(kind='bar', stacked=True)


或者,plt.bar() 函数可用于最终绘图:

cols = df['Kind'].unique() # Find all original values in the column 
ind = range(len(df2))

p1 = plt.bar(ind, df2[cols[0]])
p2 = plt.bar(ind, df2[cols[1]], bottom=df2[cols[0]])

这里需要将每个部分的bottom参数设置为之前所有部分的总和。

【讨论】:

以上是关于如何从 Pandas DataFrame 开始绘制堆叠时间直方图?的主要内容,如果未能解决你的问题,请参考以下文章

从 Pandas DataFrame 绘制条形图

pandas如何设置索引从0开始,pandas如何恢复默认索引,DataFrame如何恢复隐式索引

从Pandas DataFrame绘制条形图

如何使用 pandas DataFrame 绘图函数绘制每个子图的 ylabel

如何从 Pandas 数据框中绘制多个折线图

pandas DataFrame“没有要绘制的数字数据”错误