参考资料:https://blog.csdn.net/weixin_42782150/article/details/107176500

一、Savitzky-Golay 滤波器实现曲线平滑

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. # 使用Savitzky-Golay 滤波器后得到平滑图线
  4. from scipy.signal import savgol_filter
  5. Size = 100
  6. x = np.linspace(1, Size, Size)
  7. data = np.random.randint(1, Size, Size)
  8. print(data)
  9. # 可视化图线
  10. plt.plot(x, data)
  11. plt.title('before')
  12. plt.show()
  13. y = savgol_filter(data, 5, 3, mode='nearest')
  14. # 可视化平滑后图线
  15. plt.plot(x, y, 'b', label='savgol')
  16. plt.title('after')
  17. plt.show()

image.pngimage.png

二、插值法对折线进行平滑曲线处理

2-D数据平滑:scipy.interpolate

  1. import numpy as np
  2. from matplotlib import pyplot as plt
  3. from scipy.interpolate import make_interp_spline
  4. x = np.array([6, 7, 8, 9, 10, 11, 12])
  5. y = np.array([1.53E+03, 5.92E+02, 2.04E+02, 7.24E+01, 2.72E+01, 1.10E+01, 4.70E+00])
  6. plt.plot(x, y)
  7. plt.title('before')
  8. plt.show()
  9. x_smooth = np.linspace(x.min(), x.max(), 300) # np.linspace 等差数列,从x.min()到x.max()生成300个数,便于后续插值
  10. y_smooth = make_interp_spline(x, y)(x_smooth)
  11. plt.plot(x_smooth, y_smooth)
  12. plt.title('after')
  13. plt.show()

image.pngimage.png

三、基于Numpy.convolve实现滑动平均滤波

  1. # 实现数据可视化中的数据平滑
  2. import numpy as np
  3. import matplotlib.pylab as plt
  4. '''
  5. 其它的一些知识点:
  6. raise:当程序发生错误,python将自动引发异常,也可以通过raise显示的引发异常
  7. 一旦执行了raise语句,raise语句后面的语句将不能执行
  8. '''
  9. def moving_average(interval, windowsize):
  10. window = np.ones(int(windowsize)) / float(windowsize)
  11. re = np.convolve(interval, window, 'same')
  12. return re
  13. def LabberRing():
  14. t = np.linspace(-4, 4, 100) # np.linspace 等差数列,从-4到4生成100个数
  15. print('t=', t)
  16. # np.random.randn 标准正态分布的随机数,np.random.rand 随机样本数值
  17. y = np.sin(t) + np.random.randn(len(t)) * 0.1 # 标准正态分布中返回1个,或者多个样本值
  18. print('y=', y)
  19. plt.plot(t, y, 'k') # plot(横坐标,纵坐标, 颜色)
  20. y_av = moving_average(y, 10)
  21. plt.plot(t, y_av, 'b')
  22. plt.xlabel('Time')
  23. plt.ylabel('Value')
  24. # plt.grid()网格线设置
  25. plt.grid(True)
  26. plt.show()
  27. return
  28. LabberRing() # 调用函数

image.png