matplotlib的光标信息似乎取决于刻度的分辨率-如何更改这种依赖关系

时间:2018-12-06 08:59:47

标签: python matplotlib

使用matplotlib,如何在交互式绘图的右下角看到日期值的光标的确切值?

这似乎与刻度分辨率有关:

下面的代码示例具有不同的刻度分辨率。因此,在屏幕截图的右下角,光标值一次为2020,一次为2020-09

我想将其设为2020-09-01-以便数据具有这种分辨率/粒度。

import datetime
import pandas as pd
import matplotlib
min_date = datetime.datetime.now().date()
max_date = min_date + datetime.timedelta(days=2*365)
date_range = [min_date + datetime.timedelta(days=x)
              for x in range(0, (max_date - min_date).days)]
df = pd.DataFrame(date_range)
yRange = range(df.shape[0])
df["y"] = yRange
df.columns = ["x","y"]
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
plt.plot(df["x"], df["y"], "-o", markersize=2)
plt.show()

axes = plt.gca()
import matplotlib.ticker as ticker
tick_spacing = 50
axes.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))
plt.rcParams["figure.dpi"] = 200
plt.xticks(rotation=20)
plt.grid()
plt.plot(df["x"], df["y"], "-o", markersize=2)
plt.show()

monthly resolution

yearly resolution

1 个答案:

答案 0 :(得分:1)

为了格式化日期时间轴的x坐标与使用轴上的实际格式不同,可以将Axes.fmt_xdata属性设置为可调用的可调用对象,该可调用对象将位置放在其中并输出所需的字符串。 在这种情况下,

ax.fmt_xdata = lambda x: matplotlib.dates.num2date(x).strftime("%Y-%m-%d")

示例:

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

plt.plot([datetime.now(), datetime(2020,6,6)], [1,2], "-o")
plt.gca().fmt_xdata = lambda x: mdates.num2date(x).strftime("%Y-%m-%d")
plt.show()

enter image description here