如何解决时间序列折线图回归线斜率计算值与视觉角度不符问题
问题根因
你计算的7.3度是数据空间的数学角度,视觉上看到的接近45度是画布像素空间的显示角度,二者的坐标轴缩放比例不一致,导致结果差异。
- 你代码里的角度计算逻辑本身没有错误:x轴差值单位是「天」,y轴差值单位是「股价(美元)」,2019-01到2021-01间隔约730天,股价差值约90美元,
arctan2(90,730)换算角度确实约为7.3度。 - 图表显示时的坐标轴缩放比例非对等:你设置的画布尺寸为
figsize=(15,6),x轴总数据跨度为6年≈2190天,y轴总数据跨度约为120美元,每单位数据对应的像素长度完全不对等,数据映射到像素后线段被纵向拉伸,因此视觉角度接近45度。
计算视觉角度的解决方案
如果需要得到和视觉观感一致的角度,需要先将数据坐标转换为画布的像素坐标后再计算,代码示例如下:
# 在plt.show()前添加以下代码 # 将数据坐标转换为像素坐标 point1 = ax1.transData.transform((x1, y1)) point2 = ax1.transData.transform((x2, y2)) # 基于像素坐标差值计算视觉角度 visual_angle = round(np.rad2deg(np.arctan2(point2[1] - point1[1], point2[0] - point1[0])), 1) print(f"线段视觉角度为{visual_angle}度")
运行后得到的结果就和你图中观察到的接近45度的结果一致。
如果需要让数据空间角度和视觉角度完全匹配,可以调用ax1.set_aspect('equal')设置坐标轴等比例缩放,但时间序列场景下该设置会导致图表宽度过大,实用性较低。
内容的提问来源于stack exchange,提问作者Raj Nair
相关产品推荐
相关产品推荐

