首页 > 解决方案 > 将两个数据框绘制成一个条形图,区分它们的值

问题描述

我对以下任务感到困惑,我希望有人能指出我正确的方向。我有两个数据集,一个包含 2019 年 1 月的数据,另一个包含 2020 年 1 月的数据。

df1

ID     Date
5177   2019-01-31
5178   2019-01-31
5179   2019-01-31
5180   2019-01-31
5181   2019-01-31
5182   2019-01-31
5183   2019-01-31
5184   2019-01-30
5185   2019-01-30
5186   2019-01-30

df2

ID     Date
2918   2020-01-31
2919   2020-01-31
2920   2020-01-31
2921   2020-01-31
2922   2020-01-31
2923   2020-01-31
2924   2020-01-31
2925   2020-01-31
2926   2020-01-30
2927   2020-01-30

我试图将它们绘制为折线图,如下所示:

df1.groupby('Date').size().plot()
df2.groupby('Date').size().plot()

plt.xticks(rotation=90)
plt.show() 

但输出并不好,因为结果显示在图表的两个不同区域(一个是 2019 年,另一个是 2020 年)。所以我一直在尝试做的是将这些数据绘制为条形图,将条形彼此靠近,以便轻松比较数据的频率。

我试过如下:

df1.groupby(['Date'])['Date'].size().plot(kind='bar')
df2.groupby(['Date'])['Date'].size().plot(kind='bar')

但这不区分来自 df1 的值和来自 df2 的值(此外,条形图的颜色相同)。

我想要的是一张在 x 轴上显示日期的图表(只有几天,因为月份是相同的,我知道我在比较哪一年)。使用不同的颜色,我需要绘制来自 1 的数据和来自 2 的数据(图例会告诉 df1/2 是哪个)。

你能告诉我如何绘制数据以获得预期的输出吗?

谢谢

标签: pythonpandasmatplotlib

解决方案


您可以先加入一个数据框,但首先将日期的格式更改为'%m-%d'with strftime,您也可以rename将列的输出size更改为年份。

df1['Date'] = pd.to_datetime(df1['Date']).dt.strftime('%m-%d')
df2['Date'] = pd.to_datetime(df2['Date']).dt.strftime('%m-%d')
(df1.groupby('Date').size().rename('Size').to_frame().join(
    df2.groupby('Date').size().rename('Size').to_frame(),
    lsuffix='_2019', rsuffix='_2020').plot(kind='bar'))

在此处输入图像描述


推荐阅读