如何用Plotly Python绘制穿过两点且贯穿绘图区X方向的直线?
用Plotly画贯穿绘图区的直线(替代两点短线)
不用折腾画布像素坐标,直接基于数据坐标系推导直线方程就能解决,步骤如下:
1. 提取目标两点的坐标
先确认你要连线的两个数据点的时间和股价,比如:
# 替换成你实际的两个点数据 x1 = pd.to_datetime('2023-01-10') y1 = 148.5 x2 = pd.to_datetime('2023-01-20') y2 = 156.2
2. 计算直线的斜率和截距
因为X轴是时间序列,需要先把时间转成数值(Plotly内部用毫秒时间戳处理时间),再推导直线参数:
# 将时间转换为毫秒级数值 x1_num = x1.value // 10**6 x2_num = x2.value // 10**6 # 计算斜率k和截距b k = (y2 - y1) / (x2_num - x1_num) b = y1 - k * x1_num
3. 获取绘图区X轴范围,计算直线端点Y值
直接调用图表的X轴范围,代入直线方程算出左右两端的Y值:
# 假设fig是你的K线图对象 x_range = fig.layout.xaxis.range # 将边界时间也转换为数值 x_left_num = pd.to_datetime(x_range[0]).value // 10**6 x_right_num = pd.to_datetime(x_range[1]).value // 10**6 # 算出直线左右端点的Y值 y_left = k * x_left_num + b y_right = k * x_right_num + b
4. 添加贯穿直线到图表
用add_shape方法添加一条覆盖整个X轴范围的直线:
fig.add_shape( type='line', x0=x_range[0], y0=y_left, x1=x_range[1], y1=y_right, line=dict(color='purple', width=2), xref='x', yref='y' # 基于数据坐标系,无需处理画布像素 )
额外提示
如果用户缩放或平移图表导致X轴范围变化,直线可能不再贯穿。需要动态更新的话,监听图表的relayout事件,每次范围变化时重新计算直线端点即可。
内容的提问来源于stack exchange,提问作者YuWea
相关产品推荐
相关产品推荐

