Графики mpf и plt не сходятся по временной шкале

Я пытаюсь отобразить 4 графика которые связанны по оси x, 1 из которых отображается при помощи mpf остальные plt, но они не сходятся по времени по непонятной мне причине ,входные данные из одного источника. Вот код:

    fig, (ax1,ap1,ap2,ap3) = plt.subplots(4, 1, sharex=True)
    mpf.plot(df_1m,type='candle',style='sas',ax=ax1,volume=False)
    ap1.plot(df_1m['rsi'], label= '1m')
    ap2.plot(df_5m['rsi'], label = '5m')
    ap3.plot(df_h1['rsi'], label = '1h')
    ap1.legend()
    ap2.legend()
    ap3.legend()
    mpf.show()

фигура выглядит так,отображается только одна метка времени введите сюда описание изображения

Заранее спасибо за ответы


Ответы (1 шт):

Автор решения: Airat Galiullin

Проблема возникает из-за того, что mpf.plot() (из библиотеки mplfinance) интерпретирует ось X как дату и время в формате Matplotlib (числовой формат), а простые графики из plt.plot() воспринимают ось X как числовой индекс (0, 1, 2 и т.д.).

Даже если данные имеют одни и те же метки времени, простые вызовы plt.plot(df['column']) используют просто числовые индексы по умолчанию (от 0 до N), в то время как mpf.plot() автоматически распознаёт индекс как дату/время.


fig, (ax1, ap1, ap2, ap3) = plt.subplots(4, 1, sharex=True, figsize=(12,8))

mpf.plot(df_1m, type='candle', style='sas', ax=ax1, volume=False, show_nontrading=True)

ap1.plot(df_1m.index, df_1m['rsi'], label='RSI 1m')
ap2.plot(df_5m.index, df_5m['rsi'], label='RSI 5m')
ap3.plot(df_h1.index, df_h1['rsi'], label='RSI 1h')

ap1.legend()
ap2.legend()
ap3.legend()

# Дополнительно: форматируем ось X, чтобы отображалась дата и время
import matplotlib.dates as mdates
ax3 = ap3  # нижний график для форматирования оси X
ax3.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d %H:%M'))

fig.autofmt_xdate()

plt.show()
→ Ссылка