Matplotlib:绘图鼠标悬停值的默认分辨率

时间:2015-09-28 10:09:43

标签: python matplotlib

我正在使用MatplotLib绘制时间序列。时间序列值x轴的分辨率为'%d/%m/%y %H:%M',但鼠标中仅显示月份和年份。

我的问题是如何覆盖默认设置并设置鼠标悬停期间应显示的日期时间项?

我的偏好是至少显示day, month, and year

............................................... ......................

例如,这是一个屏幕截图,我为其中一个点做了鼠标悬停: enter image description here

正如您所见,(LHS底部角落)x值给出的日期仅显示月份和年份。

放大时,会显示日,月和年: enter image description here

1 个答案:

答案 0 :(得分:4)

鼠标悬停时显示的值由ax.format_coord方法控制,该方法在需要自定义时由用户提供的方法进行猴子修补。

例如:

import matplotlib.pyplot as plt

def formatter(x, y):
    return '{:0.0f} rainbows, {:0.0f} unicorns'.format(10*x, 10*y)

fig, ax = plt.subplots()
ax.format_coord = formatter
plt.show()

默认ax.format_xdata调用还有ax.format_ydataax.format_coord,以便更轻松地自定义x或y组件。

例如:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.format_xdata = '{:0.1f}meters'.format
plt.show()

请注意,我传入了字符串的format方法,但它可以很容易地成为lambda或任何需要单个数字参数的任意方法。

默认情况下,format_xdataformat_ydata使用轴的主刻度格式化程序,这就是为什么您获得日期轴的日级分辨率。

但是,您还需要将matplotlib的内部数字日期格式转换回“正确的”datetime对象。因此,您可以控制格式,类似于以下内容:

import datetime as dt
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

fig, ax = plt.subplots()

ax.xaxis_date()
ax.set_xlim(dt.datetime(2015, 1, 1), dt.datetime(2015, 6, 1))

ax.format_xdata = lambda d: mdates.num2date(d).strftime('%d/%m/%y %H:%M')

plt.show()