我试图按月分组后绘制一个时间序列,但我在x轴标签上仍获得了几年而不是几个月。如何在不同年份的x轴标签和不同曲线上获得数月?
这是我的尝试:
import numpy as np
import pandas as pd
import statsmodels.api as sm
df = pd.DataFrame.from_records(sm.datasets.co2.load().data)
df['index'] = pd.to_datetime(df['index'])
df = df.set_index('index')
ts = df['co2']['1960':]
ts = ts.bfill()
ts = ts.resample('MS').sum()
ts.groupby(ts.index.month).plot()
在图的x轴上的月份名称以及不同年份的不同曲线。
该图应类似于以下内容:
答案 0 :(得分:1)
您可以从以下开始:
ts.groupby([ts.index.month,ts.index.year]).sum().unstack().plot(figsize=(12,8))
import numpy as np
import pandas as pd
import calendar
import seaborn as sns
sns.set(color_codes=True)
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
df = pd.read_csv('https://github.com/selva86/datasets/raw/master/AirPassengers.csv',
parse_dates=['date'],index_col=['date'])
ts = df['value']
df_plot = ts.groupby([ts.index.month,ts.index.year]).sum().unstack()
df_plot
fig, ax = plt.subplots(figsize=(12,8))
df_plot.plot(ax=ax,legend=False)
# xticks
months = [calendar.month_abbr[i] for i in range(1,13)]
ax.set_xticks(range(12))
ax.set_xticklabels(months)
# plot names in the end
for col in df_plot.columns:
plt.annotate(col,xy=(plt.xticks()[0][-1]+0.7, df_plot[col].iloc[-1]))
答案 1 :(得分:1)
我认为您正在寻找pandas.to_datetime(),然后使用dattime索引的.month或.year属性。
通过使用statsmodel的'as_pandas = True',您的代码也会变得更短
无论如何,如果您想绘制月份作为色调,我建议在matplotlib上使用seaborn
import pandas as pd
import statsmodels.api as sm
import seaborn as sns
df = sm.datasets.co2.load(as_pandas=True).data
df['month'] = pd.to_datetime(df.index).month
df['year'] = pd.to_datetime(df.index).year
sns.lineplot(x='month',y='co2',hue='year',data=df.query('year>1995')) # filtered over 1995 to make the plot less cluttered
这给