如何从带有事件的Python绘图中获取DateTime格式的数据?

6

我有一个 iPython DataFrame 数据,像这样:

    Date                        X           Y           Z
0   2015-11-30 20:23:05.556     281.764900  -43.895060  8.714666
1   2015-11-30 20:23:05.757     192.519990  -44.636436  1.720552
2   2015-11-30 20:23:05.958     149.030600  -45.098050  1.958352
3   2015-11-30 20:23:06.171     140.707600  -44.622448  1.510729
4   2015-11-30 20:23:06.366     139.154890  -45.154003  4.783974
5   2015-11-30 20:23:06.564     138.875140  -44.790306  2.266093

这些列的dtypes如下:

Date    datetime64[ns]
X              float64
Y              float64
Z              float64
dtype: object

我将button_press_event设置为我的fig,代码如下:

def onclick(event):
    print 'button=%d, x=%d, y=%d, xdata=%s, ydata=%f'%(
        event.button, event.x, event.y, event.xdata, event.ydata)
cid = fig.canvas.mpl_connect('button_press_event', onclick)

我希望从x轴获取Date格式或String格式的数据,但在单击图表后只能获得以下内容:

button=1, x=152, y=339, xdata=735932.856811, ydata=8.518828

如何将xdata的输出设置为String类型?
2个回答

5

Matplotlib的日期支持早于Numpy的日期时间支持(甚至早于整个Pandas)。因此,它使用自己的内部日期约定

要将您收到的“原始”数字转换为日期时间,请使用{{link2:matplotlib.dates.num2date}}。

例如,类似于您正在执行的操作:

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:
        print mdates.num2date(event.xdata)

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()

1
所以,实际上解决方案就是将mdates.num2date(event.xdata)替换为event.xdata。非常感谢! - Jan Bednar
45分钟的互联网搜索才找到了这个答案!谢谢! - s.paszko

1

@Joe Kington的回答对于这种情况并不理想。这个答案是解决这个问题的有效方法(在使用pandas.plot绘图时,matplotlib点击事件中的event.xdata返回了一个非常大的数字): https://stackoverflow.com/a/54036315/8564548 Pandas自己通过this link解决了这个问题。

pd.Period(ordinal=int(event.xdata), freq=freq)

其中freq是您绘图的频率,可以是'1s'、'1min'、'1H'等等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接