如何在gnuplot、excel或matplotlib中为离散点拟合平滑曲线?
离散点平滑拟合方案(Excel/Matplotlib实现)
你之前使用六次多项式拟合效果不佳的核心原因是全局多项式的自由度不足,无法匹配数据中多个局部峰谷的变化特征,要得到穿过所有数据点的平滑曲线,推荐使用三次样条插值方案,以下是两种环境的实现方法:
Matplotlib实现
需要配合scipy库的插值工具,完整代码如下:
import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import interp1d # 读取第一份数据示例,处理第二份数据只需替换对应文件路径 data = np.loadtxt('dihedral_energy_sorted.txt') x = data[:, 0] y = data[:, 1] # 生成插值后的密集x坐标,提升曲线平滑度 x_new = np.linspace(x.min(), x.max(), 500) # 三次样条插值,曲线平滑且严格穿过所有原始数据点 f_spline = interp1d(x, y, kind='cubic') y_spline = f_spline(x_new) # 绘图输出 plt.scatter(x, y, c='red', s=50, label='原始数据点') plt.plot(x_new, y_spline, c='blue', lw=2, label='三次样条平滑曲线') plt.xlabel('二面角') plt.ylabel('能量') plt.legend() plt.show()
Excel实现
操作步骤如下:
- 将需要处理的x、y两列数据按x值升序排列(你提供的两份数据已经满足排序要求)
- 选中全部数据,插入「带数据标记的散点图」
- 选中图表中的数据系列,右键点击「设置数据系列格式」
- 在右侧弹出的设置面板中找到「线条」分类,勾选「平滑线」,可根据需求调整线条颜色、宽度
- 如需隐藏原始数据点的直连线段,可单独将「线条」设置为无,再添加趋势线选择「平滑线」即可
内容的提问来源于stack exchange,提问作者Jakub
相关产品推荐
相关产品推荐

