我正在使用以下代码从我的两列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()
我已经搜索了类似的线程,但是它们使用的数学概念使我头疼。因此,我无法确定要对我的数据进行哪些操作。
我还提供了示例数据文件,以便您可以在最后重建它。
PS。即使使用
,我也无法从默认红色更改图形中的线条颜色plt.rcParams['lines.color']='g'
尽管在这种情况下这是一个小问题。
**请善用我的代码和数据,看看您的建议是否真正在您的末端发挥作用,并在可能的情况下发布输出图。我是python的初学者。 **
答案 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
的组合会生成一堆假数据点以组成平滑曲线。