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

matplotlib调用plt.hlines()时X轴日期范围超出数据区间问题

问题根因
  • 异常完全由plt.hlines()的X轴参数类型不匹配导致:
    • matplotlib处理日期轴时,内部会将所有datetime类型的坐标转换为Unix时间戳数值参与计算,Unix时间戳的0值基准点就是1970年1月1日 00:00:00 UTC,2020年对应的时间戳数值已经达到18000+天的量级。
    • 原代码中plt.hlines(y=mean, xmin=0, xmax=len(data))传入的xmin、xmax是普通整数,和散点图传入的datetime类型X值类型不一致,matplotlib会直接将这两个整数识别为时间戳值,自动调整X轴范围把0值包含进来,最终左边界直接回溯到1970年,出现显示异常。
    • 删除该hlines语句后,X轴上仅存在2020-2021年的datetime类型数据,轴自动缩放逻辑会完全匹配实际数据的日期区间,显示恢复正常。
修复方案
  • 不要给hlines传整数索引作为X轴边界,替换为和数据集X轴类型一致的datetime边界值即可,将原代码里的hlines行替换为:
plt.hlines(y=mean, xmin=AAPL.index.min(), xmax=AAPL.index.max())
修正后完整可运行代码
import yfinance as yf
import matplotlib.pyplot as plt

AAPL = yf.download('AAPL', start = '2020-4-5', end = '2021-6-5',)

data = AAPL['Close']
mean = AAPL['Close'].mean()
std = AAPL['Close'].std()
min_value = min(data)
max_value = max(data)

plt.title("AAPL")
plt.ylim(min_value -20, max_value + 20)
plt.scatter(x=AAPL.index, y=AAPL['Close'])
# 替换为日期类型的边界参数,不再触发轴范围异常
plt.hlines(y=mean, xmin=AAPL.index.min(), xmax=AAPL.index.max())
plt.show()

补充说明:如果确实需要用位置索引绘制水平线,也可以提前把X轴从日期类型转为普通数值轴(比如用range(len(data))作为散点图的x参数,再手动设置xtick标签为对应日期),但对于常规金融时序绘图场景,直接传入日期边界是最简便的方案。

内容的提问来源于stack exchange,提问作者Data

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:15:40