Matplotlib вертикальный и горизонтальный курсор на нескольких подграфиках

Вопрос или проблема

Так что, в основном, моё решение, которое не работает, – использовать два мультикурсора:

один для всех вертикалей на каждом подграфике

один для всех горизонталей на каждом подграфике
вставьте описание изображения здесь

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

на подграфике, на который наведена моя мышь

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

моя лучшая попытка на данный момент состоит в том, что у меня есть “пропавшая” вертикаль, но они мигают, когда я двигаю мышь с этим кодом:

import tkinter as tk
from matplotlib.widgets import MultiCursor

import mplfinance as mpf
import yfinance as yf
import datetime as dt
import pandas as pd


df = pd.DataFrame(yf.Ticker( "^NDX" ).history(interval="1d",start= dt.datetime.today()-dt.timedelta(days = int(500) ) ,end= dt.date.today()-dt.timedelta(days = 0))[["Open","High","Low","Close","Volume"]])


fig= mpf.figure(style="yahoo",figsize=(15,10))

nb_subplot=3
for i in range(0,nb_subplot,1):
    if i == 0:
        axlist=[ fig.add_subplot(nb_subplot,1,1)]
    else:
        axlist.append(fig.add_subplot(nb_subplot,1,i+1,sharex=axlist[0] ))


multicursor= []
for i in range(0,nb_subplot,1):
    
    
    if i == 0:
        multicursor.append(  MultiCursor( fig.canvas , axlist ,vertOn=True,  color="black",lw=0.5, useblit=True)  )
    
    
    #multicursor.append(   Cursor(axlist[i],  horizOn=True,vertOn=False,  useblit=True )   )
    multicursor.append( MultiCursor(fig.canvas , [axlist[i]] , horizOn=True, color="black",lw=0.5, useblit=True) )
    


mpf.plot(df,type="candle",ax=axlist[0],volume= False)
#returnfig = True,
mpf.show()

пожалуйста, ответьте с кодом =)

Ответ или решение

Чтобы создать вертикальный и горизонтальный курсор на нескольких субплотах в Matplotlib, нам необходимо правильно настроить MultiCursor для достижения желаемого поведения. В предоставленном вами коде была некоторая путаница, и я предлагаю более детализированный и исправленный вариант, который позволит вам добиться необходимого результата.

Обзор проблемы

Ваша основная цель – создать курсоры, которые будут плавно взаимодействовать с несколькими субплотами. Для этого вы хотите использовать один курсор для вертикального перемещения по всем субплотам, а второй – для горизонтального.

Решение

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

Пример кода

import tkinter as tk
from matplotlib.widgets import MultiCursor
import mplfinance as mpf
import yfinance as yf
import datetime as dt
import pandas as pd
import matplotlib.pyplot as plt

# Загружаем данные
df = pd.DataFrame(yf.Ticker("^NDX").history(interval="1d", start=dt.datetime.today()-dt.timedelta(days=500), end=dt.date.today())[['Open', 'High', 'Low', 'Close', 'Volume']])

# Создаем фигуру и субплоты
fig = mpf.figure(style="yahoo", figsize=(15, 10))
nb_subplot = 3
axlist = [fig.add_subplot(nb_subplot, 1, i + 1) for i in range(nb_subplot)]

# Добавляем MultiCursor для вертикального перемещения
multicursor_vertical = MultiCursor(fig.canvas, axlist, vertOn=True, horizOn=False, color="black", lw=0.5, useblit=True)

# Добавляем отдельный курсор для горизонтального перемещения на каждом subplot
for ax in axlist:
    MultiCursor(fig.canvas, [ax], horizOn=True, vertOn=False, color="black", lw=0.5, useblit=True)

# Строим графики для каждого субплота
mpf.plot(df, type='candle', ax=axlist[0], volume=False)

# Отображаем график
plt.tight_layout()  # Это обеспечит аккуратное расположение субплотов
mpf.show()

Объяснение кода

  1. Импорт библиотек: Мы импортируем необходимые библиотеки, включая matplotlib, mplfinance, yfinance и другие. Это позволяет управлять графиками и финансовыми данными.

  2. Загрузка данных: Используя yfinance, мы загружаем данные по индексу NDX за последние 500 дней и создаем DataFrame. Это наша база данных для построения графиков.

  3. Создание фигуры и субплотов: Мы создаем фигуру и добавляем в нее три субплота. Это создаст структуру для отображения графиков.

  4. Добавление курсоров:

    • Мы создаем вертикальный MultiCursor, который будет применен ко всем субплотам одновременно.
    • Для каждого субплота добавляется горизонтальный курсор, который будет работать независимо, что позволяет избежать конфликта между субплотами.
  5. Строительство графиков: Используя mplfinance, мы отображаем свечные графики на первом субплоте.

  6. Отображение графика: Наконец, вызываем mpf.show(), чтобы отобразить созданный график.

Заключение

Этот код решает вашу задачу, обеспечивая плавное взаимодействие с графиками через горизонтальные и вертикальные курсоры. Обратите внимание, что при использовании разных курсоров для субплотов важно контролировать их поведение, чтобы сохранить интуитивный и удобный интерфейс для пользователя. Если у вас есть дополнительные вопросы или нужна помощь с доработками, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...