matplotlib event.xdata вне диапазона таймеров - PullRequest
0 голосов
/ 04 января 2019

Возникла проблема с использованием matplotlib event.xdata при построении pandas.Timeseries, я попытался воспроизвести ответ, предложенный в очень связанном вопросе , но получил очень странное поведение.

Вот код, адаптированный к python3 и с немного большим количеством функций в функции on_click():

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

import matplotlib.dates as mdates

def on_click(event):
    if event.inaxes is not None:
        # provide raw and converted x data
        print(f"{event.xdata} --> {mdates.num2date(event.xdata)}")
    # add a vertical line at clicked location
    line = ax.axvline(x=event.xdata)
    plt.draw()

t = pd.date_range('2015-11-01', '2016-01-06', freq='H')
y = np.random.normal(0, 1, t.size).cumsum()

df = pd.DataFrame({'Y':y}, index=t)

fig, ax = plt.subplots()
line = None
df.plot(ax=ax)
fig.canvas.mpl_connect('button_press_event', on_click)
plt.show()

Если я запусту это, я получу следующую диаграмму с ожидаемым диапазоном дат между ноябрем.2015 и январь 2016 года, а также информация о положении курсора в нижнем колонтитуле окна (здесь 2015-11-01 10:00) и правильное расположение вертикальных линий:

GUI result of matplotlib code

Однако вывод командной строки выглядит следующим образом:

C:\Users\me\Documents\code\>python matplotlib_even.xdate_num2date.py
402189.6454115977 --> 1102-02-27 15:29:23.562039+00:00
402907.10400704964 --> 1104-02-15 02:29:46.209088+00:00

Эти значения event.xdata явно находятся вне диапазона входных данных и диапазона данных оси x, инепригодны для последующего использования (например, попробуйте найти ближайшее значение y в серии).

Итак, кто-нибудь знает, как я могу получить правильный xdata?

1 Ответ

0 голосов
/ 04 января 2019

Что-то должно было измениться в том, как matplotlib / pandas обрабатывает информацию о дате и времени между ответом на связанный вопрос , который вы связали, и сейчас.Я не могу комментировать почему, но я нашел решение вашей проблемы.

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

Оттуда вы можете видеть, что вам нужно преобразовать значение с плавающей точкой в ​​Period объект.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


def on_click(event):
    print(pd.Period(ordinal=int(event.xdata), freq='H'))


t = pd.date_range('2015-11-01', '2016-01-06', freq='H')
y = np.random.normal(0, 1, t.size).cumsum()

df = pd.DataFrame({'Y': y}, index=t)

fig, ax = plt.subplots()
df.plot(ax=ax)
fig.canvas.mpl_connect('button_press_event', on_click)
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...