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
相关产品推荐
相关产品推荐

