У меня есть фрейм данных с именем df
с datetimeIndex
первым днем месяца и столбцом с именем Val
с некоторыми числовыми значениями.
df.head()
+------------+-----+
| | Val |
+------------+-----+
| DateTime | |
| 2011-10-01 | 11 |
| 2011-11-01 | 85 |
| 2011-12-01 | 12 |
| 2012-01-01 | 91 |
| 2012-02-01 | 44 |
+------------+-----+
dataFrame содержит одну строку в месяцыгоды между 2010 и 2017. Моя цель состоит в том, чтобы отобразить на одном графике все значения, где каждая линия представляет один год, на оси x у меня есть месяцы (январь или 01 не важны), а на оси y сумма Val
.
Моей первой идеей было использовать что-то вроде df.groupby(df.index.year)['Val'].agg('sum').unstack()
, но это приводило к ошибке.AttributeError:
Объект 'Int64Index' не имеет атрибута 'remove_unused_levels'
Затем я написал следующий код, который работает, но имеет некоторые проблемы:
- Я должен перечислить все годы;
- Я должен перечислить все цвета линии
- Трудно создать легенду
.
fig, ax1 = plt.subplots(figsize=(20,7))
months = df['2018'].index
ax1.set_xlabel('months')
ax1.set_ylabel('Sales')
ax1.plot(months, df['2018'], color='navy')
ax1.plot(months, df['2017'], color='blue')
ax1.plot(months, df['2016'], color='lightblue')
ax1.plot(months, df['2015'], color='lime')
plt.grid()
fig.tight_layout()
plt.title('Sales per year', loc='center')
plt.show()
Есть ли более умный способ создания сюжета?