pyplot 图表上光标位置的详细日期

Detailed date in cursor pos on pyplot charts

假设我想在 matplotlib 中绘制一个时间序列:

dates = pd.date_range(start='2011-01-01', end='2012-01-01')
s = pd.Series(np.random.rand(1, len(dates))[0], index=dates)

matplotlib 中的 GUI 后端有一个很好的功能,它们在 window 中显示光标坐标。当我使用它的 plot() 方法绘制 pandas 系列时,如下所示:

fig = plt.figure()
s.plot()
fig.show()

光标的 x 坐标以完整的 yyyy-mm-dd 显示在 window 的底部,如图 1 所示。

然而,当我用 pyplot 绘制同一系列 s 时:

fig = plt.figure()
plt.plot(s.index, s.values)
fig.show()

只有当我放大时才会显示完整日期,在默认视图中我只能看到 Mon-yyyy(见图 2),如果系列更长,我只会看到年份。

在我的项目中,有一些函数可以使用 plt.plot() 从时间序列数据中绘制复杂的多序列图,所以当我在 GUI 中查看结果时,我只能在收盘时看到完整的日期- UPS。我正在使用 ipython3 v. 4.0,我主要使用 MacOSX 后端,但我在 Linux 上尝试了 TK、Qt 和 GTK 后端,但行为没有差异。

到目前为止,关于如何在 GUI 中以任何缩放级别显示完整日期,我有 2 个想法:

  1. 将 plt.plot() 重写为 pd.Series.plot()
  2. 使用 canvas 事件处理程序从光标位置获取 x 坐标并将其打印在某处

然而,在我尝试上述任何一项之前,我需要确定是否有更好更快的方法来获取图表中打印的完整日期 window。我想是有的,因为 pandas 正在使用它,但我无法在 pyplot 文档或示例或在线其他地方找到它,它是这两个调用中的 none:

ax.xaxis_date()
fig.autofmt_xdate()

有人请指教

用于格式化信息的挂钩是 Axes.format_coordAxes.fmt_xdata。标准格式化程序在 pandas 的 matplotlib.dates (plus some additions 中定义。一个基本的解决方案可能是:

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

dates = pd.date_range(start='2011-01-01', end='2012-01-01')
series = pd.Series(np.random.rand(len(dates)), index=dates)

plt.plot(series.index, series.values)
plt.gca().fmt_xdata = matplotlib.dates.DateFormatter('%Y-%m-%d')
plt.show()