Форматирование даты по оси Х в 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()

В результате получается пока так:

graph


Ответы (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 

Ну и, соответственно,

введите сюда описание изображения

→ Ссылка