Как сгладить кривую в Python для начинающих - PullRequest
0 голосов
/ 19 декабря 2018

Я использую следующий код, чтобы нарисовать кривую из моих двух столбцов необработанных данных (x = время, y = | плавающие данные |). График, который он строит, представляет собой грубый граф.Можно ли иметь плавные края этих данных?Я прилагаю код, данные и кривую.

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()

Я искал похожие темы, но используемые ими математические понятия оказались у меня в голове.Поэтому я не могу определить, что именно должно быть сделано для моих данных.

Сгенерированный график из данных RAW

Я также даю образец файла данных, чтобы вы могли повторно-строить его на своем конце.

Получить файл данных

PS.Я также не могу изменить цвет линий на графике с красного по умолчанию даже после использования

plt.rcParams['lines.color']='g'

Хотя это незначительная проблема в этом случае.

** Пожалуйста, используйте мойкод и данные, и посмотрите, работают ли ваши предложения на самом деле, и опубликуйте выходной график, если это возможно. Я новичок в python. Так что еще не полностью знаком с тем, что очень очевидно для других.**

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Модуль 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 генерирует несколько ложных точек данных, образующих плавную кривую.

0 голосов
/ 19 декабря 2018

Входные данные имеют неправильные метки времени, первоначальный автор должен был использовать заполнение нулями при форматировании миллисекунд (%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)

Затем вы можете использовать сглаживающее ядро ​​(например, скользящее среднее) для сглаживания данных:

window_len = 3
kernel = np.ones(window_len, dtype=float)/window_len
y_smooth = np.convolve(y, kernel, 'same')
...