如何用Python绘制曲线滑动平均图并计算带误差的平均值
实现xvg文件数据的滑动平均曲线绘制与统计值计算
需求说明
我拥有file.xvg文件,使用Python 3.9.12版本的matplotlib与numpy绘制其数据,现有基础脚本。需要完成两个功能:
- 绘制滑动平均曲线
- 计算并展示数据的平均值±标准差(示例结果为7.5 ± 160.5 bar)
基础脚本
import matplotlib.pyplot as plt import numpy import numpy as np from scipy import signal x, y = numpy.loadtxt("file.xvg", unpack=True) fig = plt.figure(figsize=(13,8)) ax = fig.add_subplot(111) ax.plot(x, y, color="k", linestyle='solid', linewidth=0.8) ax.set_xlabel("Times (ps)", fontweight='bold', fontsize = 18, labelpad=3) ax.set_ylabel("Pressures (bar)", fontweight='bold', fontsize = 18, labelpad=3) plt.show()
修改后的完整脚本
import matplotlib.pyplot as plt import numpy as np # 加载xvg数据 x, y = np.loadtxt("file.xvg", unpack=True) # 定义滑动平均计算函数 def moving_average(data, window_size): # 创建等权重窗口 window = np.ones(window_size) / window_size # 卷积计算滑动平均,mode='same'保证输出长度与原数据一致 return np.convolve(data, window, mode='same') # 设置滑动窗口大小(可根据数据密度调整,示例取50个数据点) window_size = 50 y_smoothed = moving_average(y, window_size) # 计算统计值:平均值和标准差 mean_y = np.mean(y) std_y = np.std(y) # 绘图 fig = plt.figure(figsize=(13,8)) ax = fig.add_subplot(111) # 绘制原始数据曲线 ax.plot(x, y, color="k", linestyle='solid', linewidth=0.8, label='Original Data') # 绘制滑动平均曲线 ax.plot(x, y_smoothed, color='r', linestyle='-', linewidth=1.2, label=f'Moving Average (window={window_size})') # 设置坐标轴标签 ax.set_xlabel("Times (ps)", fontweight='bold', fontsize=18, labelpad=3) ax.set_ylabel("Pressures (bar)", fontweight='bold', fontsize=18, labelpad=3) # 添加图例 ax.legend(fontsize=14) # 在图中添加统计值标注(避免遮挡数据) ax.text(0.05, 0.95, f'Average: {mean_y:.1f} ± {std_y:.1f} bar', transform=ax.transAxes, fontsize=14, bbox=dict(facecolor='white', alpha=0.8)) # 显示图像 plt.show() # 控制台打印统计结果 print(f"数据统计结果:平均值 = {mean_y:.1f} bar,标准差 = {std_y:.1f} bar")
关键部分说明
- 滑动平均调整:
window_size可根据数据的时间间隔和波动幅度修改——数据点密集、波动大时调大窗口,反之调小 - 统计值计算:
np.mean()计算总体平均值,np.std()默认计算总体标准差;若需样本标准差,可添加参数ddof=1 - 可视化优化:用图例区分原始数据与平滑曲线,文本框标注统计值时使用
transform=ax.transAxes以相对坐标定位,避免因坐标轴范围变化导致遮挡
内容的提问来源于stack exchange,提问作者al ahmed
相关产品推荐
相关产品推荐

