如何在Matplotlib中延长两线段至交点并连接(保持方向)
解决方案
要实现两条线段延长至交点并连接,同时保留原始11个标记点,可按以下步骤操作:
核心思路
- 从原始数据中提取两条线段的端点,推导各自的直线方程
- 求解两条直线的交点坐标
- 基于直线方程生成延长至交点的平滑线条
- 叠加绘制原始标记点,确保只保留11个标记
完整代码
import numpy as np from matplotlib import pyplot as plt # 1. 定义原始数据 x_original = np.arange(-0.5, 0.51, 0.1) y1 = np.linspace(2, 10.5, 5) y2 = np.linspace(11, 1, 6) y_original = np.concatenate([y1, y2]) # 2. 获取两条线段的端点 # 左线段(x∈[-0.5, -0.1])的首尾端点 x1_start, y1_start = x_original[0], y1[0] x1_end, y1_end = x_original[4], y1[-1] # 右线段(x∈[0, 0.5])的首尾端点 x2_start, y2_start = x_original[5], y2[0] x2_end, y2_end = x_original[-1], y2[-1] # 3. 计算两条直线的斜率与交点 m1 = (y1_end - y1_start) / (x1_end - x1_start) # 左线段斜率 m2 = (y2_end - y2_start) / (x2_end - x2_start) # 右线段斜率 # 联立直线方程求解交点 x_intersect = (m1 * x1_start - m2 * x2_start + y2_start - y1_start) / (m1 - m2) y_intersect = m1 * (x_intersect - x1_start) + y1_start # 4. 生成延长后的平滑线条数据 x_left_extend = np.linspace(x1_start, x_intersect, 100) # 左线段延长至交点 y_left_extend = m1 * (x_left_extend - x1_start) + y1_start x_right_extend = np.linspace(x_intersect, x2_end, 100) # 右线段延长至交点 y_right_extend = m2 * (x_right_extend - x2_start) + y2_start # 5. 绘制图形 plt.ylim([0, 14]) # 绘制延长后的连续线条 plt.plot(x_left_extend, y_left_extend, color='blue') plt.plot(x_right_extend, y_right_extend, color='blue') # 绘制原始11个标记点(仅显示标记,无连接线条) plt.plot(x_original, y_original, marker='o', color='blue', linestyle='None') plt.show()
代码说明
- 通用性:只需替换
y1和y2的原始数据,即可处理任意斜率不同的两条线段 - 标记点控制:通过单独绘制原始
x_original和y_original并设置linestyle='None',确保仅保留11个原始标记点 - 平滑线条:用
linspace生成100个点绘制延长线,保证线条流畅
内容的提问来源于stack exchange,提问作者Shaun Han
相关产品推荐
相关产品推荐

