#python #pandas #matplotlib #time-series #seaborn
#python #pandas #matplotlib #временные ряды #сиборн
Вопрос:
Я строю свой набор данных (смертность в Англии и Уэльсе в зависимости от региона), и даты по оси X продолжают сортироваться в алфавитном порядке. Идет 06 апреля, 07 апреля, …, 06 февраля, 07 февраля, …, 13 сентября, 14 сентября.
Я хочу, чтобы они были в хронологическом порядке (как в моем наборе данных) Есть ли способ отключить принудительную сортировку? Я использую matplot lib и seaborn для этого графика.
Также, если кто-нибудь знает способ записать этот код, не повторяя код 13 раз, я был бы рад это услышать.
Мой код выглядит следующим образом
plt.figure(figsize=(48,12))
sns.lineplot(data=Regional,x='Date',y='England and Wales')
sns.lineplot(data=Regional,x='Date',y='England')
sns.lineplot(data=Regional,x='Date',y='North East')
sns.lineplot(data=Regional,x='Date',y='North West')
sns.lineplot(data=Regional,x='Date',y='Yorkshire and the Humber')
sns.lineplot(data=Regional,x='Date',y='East Midlands')
sns.lineplot(data=Regional,x='Date',y='West Midlands')
sns.lineplot(data=Regional,x='Date',y='East of England')
sns.lineplot(data=Regional,x='Date',y='Greater London')
sns.lineplot(data=Regional,x='Date',y='South East')
sns.lineplot(data=Regional,x='Date',y='South West')
sns.lineplot(data=Regional,x='Date',y='Wales')
sns.lineplot(data=Regional,x='Date',y='Non Residents')
plt.legend(['England and Wales','England','North East','North West','Yorkshire and the Humber','East Midlands','West Midlands','East of England','Greater London','South East','South West','Wales','Non Residents'])
Комментарии:
1. Перед построением графика преобразуйте дату в тип datetime.
2. ваши даты, вероятно, на самом деле не даты, а строки. Кроме того, вы должны объединить свои данные и передать результирующий столбец region в качестве вашего «оттенка» для одного вызова
lineplot
3. Почему бы не использовать Matplotlib? Никакая сортировка не происходит за кулисами, если вы не заставите ее
4. Если вы поместите свои даты в формат ISO 8601 , они будут отсортированы правильно.
Ответ №1:
Как уже упоминалось, использование pd.melt
формата даты и времени, скорее всего, решит ваши проблемы. Вы можете использовать pd.to_datetime
для преобразования ваших дат в формат datetime. Предполагая, что ваши строки имеют 'Jul-06'
формат, вы можете указать свой формат '%b-%y'
. В противном случае вы можете проверить эту таблицу на наличие правильного спецификатора формата.
pd.melt
вы можете переформатировать ваш фрейм данных для построения графика, используя одну строку кода. Предполагая, что ваш фрейм данных содержит столбцы только для даты и регионов, вы можете использовать следующий код, чтобы собрать все воедино:
Regional['Date'] = pd.to_datetime(Regional['Date'], format='%b-%y')
Regional = pd.melt(Regional, id_vars=['Date'], var_name='Region', value_name='Mortality')
sns.lineplot(data=Regional, x='Date', y='Mortality', hue='Region')
Комментарии:
1. Спасибо за это, обычно я бы использовал оттенок, но я не могу понять, как организовать мой CSV, чтобы в качестве заголовка указывался регион. В настоящее время у меня разрешено указывать дату в качестве строки, а регионы — в качестве столбца, но для региона нет заголовка. Примерно так выглядит эта дата, Англия, Северо-Восток,…. Уэльс Январь — 06, 300, 345, 654 Февраль -06 …. и т. Д. Поэтому все мои заголовки являются отдельными регионами
2. Я вижу, что pandas.melt повторил дату 14 раз для каждого региона. Я изначально рассматривал это, но думал, что есть более эффективный способ, но, полагаю, нет, спасибо.
Ответ №2:
Вместо плавления вы также можете pd.MultiIndex
автоматически создавать to plot
по желанию с помощью matplotlib
:
Regional['Date'] = pd.to_datetime(Regional['Date'])
Regional = Regional.set_index('Date')
Regional.columns = pd.MultiIndex.from_tuples([('Region', col) for col in Regional.columns])
Regional.plot(ax=ax, title='Daily Mortality Rate by Region', ylabel='Mortality')
plt.legend(title='Regions', labels=[col[1] for col in Regional.columns])
seaborn
Способ (см. Другой ответ) немного чище, но это всего лишь matplotlib
решение.