从2014年到2018年,我每个月都有6个变量的每月数据。
我试图绘制六个子图(每个变量一个),每个月X轴(1月,2月...),并绘制5个系列(每年一个),其legend
。
这是数据的一部分:
我为每个变量(总共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)
答案 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)
结果(所有数字都是随机生成的):