Форматирование даты по оси Х в matplotlib
Как сделать формат даты по оси абсцисс в виде Янв 2020 (или Jan 2020)?
Данные:
import os
import pandas as pd
df = pd.DataFrame()
df = pd.read_excel('https://github.com/At7sharp/FSK/blob/main/Metal_AT3_result.xlsx?raw=true')
df['file_date'] = df['file_date'].dt.strftime('%Y-%m-%d')
df = df.sort_values('file_date')
Отрисовка графиков:
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('default')
x = df.loc[:, 'file_date'].values.tolist()
y1 = df.loc[:, 'vfd_power_mean'].values.tolist()
y2 = df.loc[:, 'shaot_power_mean'].values.tolist()
y3 = df.loc[:, 'power_saving_mean'].values.tolist()
y4 = df.loc[:, 'air_temp'].values.tolist()
fig, ax = plt.subplots(3, 1, figsize=(16,16), dpi= 60)
ax[2].set(title='Temp')
ax[0].fill_between(x, 0, y2, label='ШАОТ', alpha=1)
ax[0].fill_between(x, 0, y1, label='ЧРП', alpha=1)
ax[1].fill_between(x, 0, y3, label='profit')
ax[2].plot(x, y4, label = 'Temp')
ax[0].legend(loc='upper left')
ax[1].legend(loc='upper left')
ax[2].legend(loc='upper left')
# Найстройка осей
#ax.set_xlim([-10, 10])
ax[0].set_ylim([0, 300]) # Границы по оси У
ax[1].set_ylim([0, 300])
ax[2].set_ylim([-15, 30])
#ax[0].set_xlabel('Даты')
ax[0].set_ylabel('Мощность, кВт')
ax[1].set_ylabel('Мощность, кВт')
ax[2].set_ylabel('Температура, °C')
# Настройка сетки
#ax[2].grid(which='major', color = 'k')
#ax[2].grid(which='minor', color = 'grey')
ax[0].grid()
ax[1].grid()
ax[2].grid()
# Названия графиков
ax[0].set(title='Потребление электроэнергии ЧРП и ШАОТ')
ax[1].set(title='Экономия электроэнергии')
ax[2].set(title='Температура воздуха')
# Устанавливаем интервал основных делений:
ax[0].xaxis.set_major_locator(ticker.MultipleLocator(58))
ax[1].xaxis.set_major_locator(ticker.MultipleLocator(58))
ax[2].xaxis.set_major_locator(ticker.MultipleLocator(58))
ax[2].yaxis.set_major_locator(ticker.MultipleLocator(5))
# Установка расстояния между таблицами
plt.subplots_adjust(wspace=0, hspace=0.35)
# Поля графиков (почему-то только для последнего)
#plt.margins(x=0,y=0)
plt.show()
В результате получается пока так:
Ответы (2 шт):
Автор решения: MaxU
→ Ссылка
Попробуйте больше использовать средства визуализации Pandas:
df = pd.read_excel('https://github.com/At7sharp/FSK/blob/main/Metal_AT3_result.xlsx?raw=true')
cols_map = dict(
file_date="Дата",
air_temp="Temp",
shaot_power_mean="ШАОТ",
vfd_power_mean="ЧРП",
power_saving_mean="profit"
)
t = df.rename(columns=cols_map).set_index("Дата").rename_axis(None)
fig, (ax0, ax1, ax2) = plt.subplots(3, 1, figsize=(12,16), dpi= 60)
ax0.set_ylim([0, 300]) # Границы по оси У
ax1.set_ylim([0, 300])
ax2.set_ylim([-15, 30])
t["Temp"].plot(ax=ax2, title="Температура воздуха", ylabel="Температура, °C", legend=True)
t[["ШАОТ", "ЧРП"]].plot.area(
ax=ax0,
stacked=False,
alpha=1,
title="Потребление электроэнергии ЧРП и ШАОТ",
ylabel="Мощность, кВт",
legend=True)
t["profit"].plot.area(
ax=ax1,
stacked=False,
alpha=1,
title="Экономия электроэнергии",
ylabel="Мощность, кВт",
legend=True)
plt.tight_layout()
Автор решения: strawdog
→ Ссылка
Вы же сами выставляете формат даты, который вам не нужен. сделайте сначала сортировку значений по дате, а потом отформатируйте ее:
df = df.sort_values('file_date')
df['file_date'] = df['file_date'].dt.strftime('%d %b %Y')
Формат метода strftime описан здесь
На выходе получите колонку file_date в таком виде.
file_date
0 24 Dec 2018
1 25 Dec 2018
2 26 Dec 2018
3 27 Dec 2018
4 28 Dec 2018
.. ...
577 26 Apr 2021
578 27 Apr 2021
579 28 Apr 2021
580 29 Apr 2021
581 30 Apr 2021
Ну и, соответственно,


