如何让时间序列轴刻度及标签与matplotlib绘图的数据点一一对应
异常根本成因
该时间刻度与数据点不匹配的问题本质是matplotlib默认的时间刻度自动定位规则导致的:
matplotlib内置的AutoDateLocator会自动选择它判定为「视觉整齐」的刻度间隔,优先对齐月初、整旬这类整数时间节点,不会直接采用你输入的所有采样时间作为刻度。
你的数据是每周一的周度采样,10月底到11月初跨月时,自动定位器会优先把11月1日(月初)设为刻度,导致前面10月的几周刻度和你实际的周一采样点错位,而11月之后的周度采样刚好和自动生成的刻度间隔对齐,所以后续显示正常。
彻底解决方案
可根据你的使用场景二选一:
- 场景1:需要显示所有原始采样时间作为刻度
直接使用FixedLocator固定刻度位置为你实际的采样时间点,写法比手动设置xticks更规范,可维护性更高:
from matplotlib import pyplot as plt from matplotlib.dates import FixedFormatter, FixedLocator import numpy as np import pandas as pd dates = ['2021-10-11 00:00:00', '2021-10-18 00:00:00', '2021-10-25 00:00:00', '2021-11-01 00:00:00', '2021-11-08 00:00:00', '2021-11-15 00:00:00', '2021-11-22 00:00:00'] stamps = pd.to_datetime(dates) vals = np.random.random(7) plt.figure(figsize=(14,6)) plt.plot(stamps, vals) # 固定使用原始采样时间作为刻度 ax = plt.gca() ax.xaxis.set_major_locator(FixedLocator(stamps)) ax.xaxis.set_major_formatter(FixedFormatter(stamps.dt.strftime('%Y-%m-%d'))) # 可选:旋转刻度避免重叠 plt.xticks(rotation=45, ha='right') plt.show()
- 场景2:数据量较大不需要显示所有采样点,仅需要保证刻度对齐周度规则
使用WeekdayLocator指定每周固定周几作为刻度基准,自动生成刻度的同时保证和你的采样时间对齐:
from matplotlib import pyplot as plt from matplotlib.dates import WeekdayLocator, DateFormatter import matplotlib.dates as mdates import numpy as np import pandas as pd dates = ['2021-10-11 00:00:00', '2021-10-18 00:00:00', '2021-10-25 00:00:00', '2021-11-01 00:00:00', '2021-11-08 00:00:00', '2021-11-15 00:00:00', '2021-11-22 00:00:00'] stamps = pd.to_datetime(dates) vals = np.random.random(7) plt.figure(figsize=(14,6)) plt.plot(stamps, vals) ax = plt.gca() # 指定每周周一为刻度位置 ax.xaxis.set_major_locator(WeekdayLocator(byweekday=mdates.MO)) # 设置刻度显示格式 ax.xaxis.set_major_formatter(DateFormatter('%Y-%m-%d')) plt.xticks(rotation=45, ha='right') plt.show()
内容的提问来源于stack exchange,提问作者Michal B.
相关产品推荐
相关产品推荐

