如何在Matplotlib中匹配数据点不同的两条曲线并获取匹配后的数据
如何匹配两条多项式拟合曲线并获取对应数据?
嘿,我看你已经用numpy的多项式拟合生成了两条曲线,想要匹配它们并拿到对应的数据对吧?其实核心思路是让两条曲线基于同一个x轴取值集合计算y值,这样自然就能一一对应上了。你代码里已经用了polyline作为共同的x序列,这步很关键,接下来只需要把对应的数据提取出来就行。
步骤1:提取匹配的曲线数据
既然你已经用polyline生成了统一的x轴点,那直接用两个拟合模型分别计算每个x点对应的y值,就能得到匹配好的(x, y模型1, y模型2)数据组了。下面是修改并补全后的代码:
import numpy as np import matplotlib.pyplot as plt # 你之前的代码漏了导入matplotlib,记得补上 # ---------------------- # 替换成你的真实原始数据 x = np.random.rand(50)*280 # 示例x数据 y = 0.000001*x**7 - 0.0001*x**6 + 0.005*x**5 - 0.1*x**4 + 1.2*x**3 - 8*x**2 + 20*x + 50 # 示例y数据 x1 = np.random.rand(50)*280 # 示例x1数据 y1 = 0.0000000001*x1**13 - 0.00000001*x1**12 + 0.0000003*x1**11 - 0.000005*x1**10 + 0.00006*x1**9 - 0.0005*x1**8 + 0.003*x1**7 - 0.01*x1**6 + 0.03*x1**5 - 0.06*x1**4 + 0.08*x1**3 - 0.07*x1**2 + 0.03*x1 + 100 # 示例y1数据 # ---------------------- polyline = np.linspace(0, 280, 1000) plt.ylim(0,1400) plt.xlim(0,300) # 多项式拟合 model1 = np.poly1d(np.polyfit(x, y, 7)) model2 = np.poly1d(np.polyfit(x1, y1, 13)) # 把变量名改成model2,更清晰 # 计算两条曲线在每个x点的拟合y值 y_fit1 = model1(polyline) y_fit2 = model2(polyline) # 组合成匹配好的二维数组,每行是(x, y_fit1, y_fit2) matched_data = np.column_stack((polyline, y_fit1, y_fit2)) # 可视化(加上图例更清晰) plt.scatter(x, y, label='原始数据组1', alpha=0.6) plt.scatter(x1, y1, label='原始数据组2', alpha=0.6) plt.plot(polyline, y_fit1, label='7阶拟合曲线', linewidth=2) plt.plot(polyline, y_fit2, label='13阶拟合曲线', linewidth=2) plt.legend() plt.xlabel('X轴') plt.ylabel('Y轴') plt.show() # 打印前5组匹配数据看看效果 print("前5组匹配数据(x, 曲线1拟合值, 曲线2拟合值):") print(matched_data[:5])
步骤2:保存或使用匹配数据
如果你需要把这些匹配好的数据持久化,可以用numpy的savetxt方法存成CSV文件,方便后续用Excel或其他工具分析:
# 保存为CSV文件 np.savetxt('匹配曲线数据.csv', matched_data, delimiter=',', header='x,y_fit1,y_fit2', comments='')
一些注意点
- 13阶多项式很容易出现过拟合,如果你的拟合曲线在某些区间出现剧烈波动,建议尝试降低阶数,或者改用带正则化的多项式拟合(比如用
sklearn.linear_model.Ridge结合多项式特征)。 - 确保
polyline的取值范围覆盖两组原始数据的x区间,避免外插(即计算超出原始数据范围的x值)带来的不可靠结果。
内容的提问来源于stack exchange,提问作者aparna podili




