Matplotlib中两条曲线精确交点计算异常问题求助
Matplotlib中两条曲线精确交点计算异常问题求助
嗨,我完全懂你的困扰!你现在代码里算出来的是拟合直线和红色水平线y=60的交点,但你实际想要的是原始数据连成的折线和这条水平线的精确交点,这就是结果不符合预期的原因啦~
咱们来拆解下问题:你用linregress得到的是原始数据的最佳拟合直线,用它计算的交点自然是拟合线和y=60的交点,而不是你画出来的那条折线的交点。原始数据是离散的点,折线是连接相邻点的线段,所以得针对每一段线段去判断是否和y=60相交,再计算交点坐标。
下面是修改后的代码,直接替换你原来的拟合和交点计算部分就行:
import numpy as np import matplotlib.pyplot as plt E = [113.3, 86.8, 74.6, 55.751, 46.147, 38.793] L = [7.06, 8.06, 9.06, 10.06, 11.06, 12.06] plt.plot(L, E) plt.axhline(60, color='r', linestyle='-') # 寻找折线与y=60的交点 x_intersect = None y_intersect = 60 # 遍历每一段相邻的线段 for i in range(len(E)-1): e1, e2 = E[i], E[i+1] l1, l2 = L[i], L[i+1] # 判断这段线段是否穿过y=60(两点分别在60的两侧) if (e1 >= y_intersect and e2 <= y_intersect) or (e1 <= y_intersect and e2 >= y_intersect): # 用线性插值计算交点的x坐标 # 线段的线性方程:y = mx + b,这里求y=60时的x m = (e2 - e1)/(l2 - l1) x_intersect = l1 + (y_intersect - e1)/m break if x_intersect is not None: print(f"Intersection point coordinates: ({x_intersect:.4f}, {y_intersect})") # 可以把交点标在图上更直观 plt.scatter(x_intersect, y_intersect, color='green', marker='o', label='Intersection') plt.legend() plt.show()
咱们来解释下关键部分:
- 遍历每一对相邻的(L,E)点,检查这两个点的E值是否分别在60的上下两侧,这样就能确定这段线段和y=60相交
- 用线性插值计算交点的x值:因为相邻点之间的线段是直线,所以通过两点式推导,就能算出当y=60时对应的x坐标
- 最后还可以把交点用绿色圆点标在图上,更直观看到结果
运行这段代码后,你得到的就是原始折线和y=60的精确交点啦~
备注:内容来源于stack exchange,提问作者Ayush Fotedar
相关产品推荐
相关产品推荐

