如何使用Matplotlib中DateTimeIndex的月度数据绘制Yearly系列?

时间:2019-08-31 12:33:53

标签: pandas datetime matplotlib python-datetime

从2014年到2018年,我每个月都有6个变量的每月数据。 我试图绘制六个子图(每个变量一个),每个月X轴(1月,2月...),并绘制5个系列(每年一个),其legend

这是数据的一部分: Preview of the data

我为每个变量(总共30个)创建了5个系列(每年一个),我得到了预期的输出,但是使用了很多行代码。

使用更少的代码行来实现这一目标的最佳方法是什么?

这是我创建系列的示例:

CL2014 = data_total['Charity Lottery'].where(data_total['Date'].dt.year == 2014)[0:12]

CL2015 = data_total['Charity Lottery'].where(data_total['Date'].dt.year == 2015)[12:24]

这是我如何绘制系列的一个示例:     axCL.plot(xvals,CL2014)

axCL.plot(xvals, CL2015)

axCL.plot(xvals, CL2016)

axCL.plot(xvals, CL2017)

axCL.plot(xvals, CL2018)

2 个答案:

答案 0 :(得分:0)

我会尝试使用.groupby(),它对于解析如下内容确实非常强大:

for _, group in data_total.groupby([year, month])[[x_variable, y_variable]]:
    plt.plot(group[x_variables], group[y_variables])

因此,在此groupby会将您的data_total DataFrame分成年/月子集,最后使用[[]]解析为x_variable(假设它位于data_total DataFrame中)和y_variable,您可以制作您感兴趣的任何功能。

我会将您的datetime列分解为单独的year和month列,然后将groupby中的那些新列用作[year,month]。您也许可以像以前一样通过dt.year和dt.month……不确定,请尝试两种方式!

答案 1 :(得分:0)

无需在您的命名空间中添加30个变量。 Seaborn使这项工作非常容易,但是您需要首先规范化数据框。这就是“规范化”或“未透视”的样子(Seaborn称其为“长格式”):

Date        variable         value
2014-01-01  Charity Lottery  ...
2014-01-01  Racecourse       ...
2014-04-01  Bingo Halls      ...
2014-04-01  Casino           ...

您的屏幕截图是“透视”或“简写”数据框。

df_plot = pd.melt(df, id_vars='Date')
df_plot['Year'] = df_plot['Date'].dt.year
df_plot['Month'] = df_plot['Date'].dt.strftime('%b')

import seaborn as sns
plot = sns.catplot(data=df_plot, x='Month', y='value',
                   row='Year', col='variable', kind='bar',
                   sharex=False)
plot.savefig('figure.png', dpi=300)

结果(所有数字都是随机生成的):

Seaborn result