如何从 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】:使用groupby
、count
和unstack
调整数据框:
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如何设置索引从0开始,pandas如何恢复默认索引,DataFrame如何恢复隐式索引