You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让时间序列轴刻度及标签与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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 00:36:04