如何为初学者使用python平滑曲线

时间:2018-12-19 07:52:21

标签: python filter fft curve smoothing

我正在使用以下代码从我的两列Raw数据(x = time,y = | float数据|)中绘制一条曲线。它所绘制的图形是一个粗糙的边缘图形。这些数据是否有平滑边缘?我将附加代码,数据和曲线。

from datetime import datetime
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates
from matplotlib import style

# changing matplotlib the default style
matplotlib.style.use('ggplot')
#one of {'b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'}
plt.rcParams['lines.linewidth']=1
plt.rcParams['axes.facecolor']='.3'
plt.rcParams['xtick.color']='b'
plt.rcParams['ytick.color']='r'



x,y= np.loadtxt('MaxMin.txt', dtype=str, unpack=True)
x = np.array([datetime.strptime(i, "%H:%M:%S.%f") for i in x])
y = y.astype(float)

# naming the x axis 
plt.xlabel('<------Clock-Time(HH:MM:SS)------>') 
# naming the y axis 
plt.ylabel('Acceleration (m/sq.sec)') 
# giving a title to my graph 
plt.title('Sample graph!')
# plotting the points 
plt.plot(x, y)
# beautify the x-labels
plt.gcf().autofmt_xdate()
#Custom Format
loc = matplotlib.dates.MicrosecondLocator(1000000)
plt.gca().xaxis.set_major_locator(loc)
plt.gca().xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%H:%M:%S'))
# function to show the plot 
plt.show()

我已经搜索了类似的线程,但是它们使用的数学概念使我头疼。因此,我无法确定要对我的数据进行哪些操作。

Generated Graph from RAW data

我还提供了示例数据文件,以便您可以在最后重建它。

Get Data File

PS。即使使用

,我也无法从默认红色更改图形中的线条颜色
plt.rcParams['lines.color']='g'

尽管在这种情况下这是一个小问题。

**请善用我的代码和数据,看看您的建议是否真正在您的末端发挥作用,并在可能的情况下发布输出图。我是python的初学者。 **

2 个答案:

答案 0 :(得分:4)

输入数据的时间戳错误,原始作者在设置毫秒({gravatar email="example@example.com" size="60" rating="X" assign="gravatarURL" default="http://www.example.com/default_gravatar.jpg"} <img src="{$gravatarURL}" height="60" width="60"> )格式时应该使用零填充。

%03d

我们需要先解决此问题:

[...]
10:27:19.3 9.50560385141
10:27:19.32 9.48882194058
10:27:19.61 9.75936468731
10:27:19.91 9.96021690527
10:27:19.122 9.48972151383
10:27:19.151 9.49265161533
[...]

然后,您可以使用平滑内核(例如移动平均线)对数据进行平滑:

x, y = np.loadtxt('MaxMin.txt', dtype=str, unpack=True)

# fix the zero-padding issue
x_fixed = []
for xx in x:
    xs = xx.split(".")
    xs[1] = "0"*(3-len(xs[1])) + xs[1]
    x_fixed.append(xs[0] + '.' + xs[1])

x = np.array([datetime.strptime(i, "%H:%M:%S.%f") for i in x_fixed])
y = y.astype(float)

答案 1 :(得分:1)

scipy模块提供了一些通过点获得平滑曲线的方法。尝试将其添加到顶部:

from scipy import interpolate

然后将这些行添加到plt.show()之前:

xnew = np.linspace(x.min(), x.max(), 100) 
bspline = interpolate.make_interp_spline(x, y)
y_smoothed = bspline(xnew)
plt.plot(xnew, y_smoothed)

如果您对scipy.interpolate.make_interp_spline进行一些搜索,则可以找到有关此操作的更多信息。但从本质上讲,与np.linspace的组合会生成一堆假数据点以组成平滑曲线。