- Вы не включили импорт, но, к счастью, я понял их
- Мне пришлось удалить значение из
t_extra
, поскольку не было соответствующей точки
Тем не менее, вот что я придумала
import numpy as np
import matplotlib.pyplot as plt
halflife = 0.25
resolution_per_second = 1000
values = np.concatenate([np.zeros(resolution_per_second),
np.ones(resolution_per_second * 2),
np.zeros(resolution_per_second),
np.ones(resolution_per_second * 1),
np.zeros(resolution_per_second * 2),
])
t_grid = np.arange(0, len(values)) / resolution_per_second
step = 1.0 / resolution_per_second
k = np.power(0.5, 1 / (halflife * resolution_per_second))
def ema_fixed_step(y, k): #ema method 1 on chart
res = np.zeros_like(y)
curV = y[0]
for i in range(1, len(y) - 1):
curV = k * curV + (1 - k) * y[i]
res[i + 1] = curV
return res
ema1_arr = ema_fixed_step(values, k)
#
w = values != np.roll(values, 1)
w[0] = True
t_new = t_grid[w]
values_new = values[w]
t_extra = [0.6, 1.2, 1.5, 2.9, 4.5, 3.3, 5.5]
t_req = np.sort(np.concatenate([t_new, t_extra]))
def ema_func2(t_req, t, y): #ema method 2 on chart
return np.zeros_like(t_req, dtype=np.double)
ema2_arr = ema_func2(t_req, t_new, values_new)
plt.clf()
plt.step(t_grid, values, '.-', where='post', label='y')
plt.step(t_grid, ema1_arr, '.-', where='post', label='ema method 1')
markers_y = []
for t in t_grid:
if t in t_req:
index = list(t_grid).index(t)
markers_y.append(ema1_arr[index])
plt.scatter(t_req, markers_y, color='red', label='markers', zorder=10)
plt.grid()
plt.legend()
plt.xlabel('t, seconds')
plt.show()
Вывод: По сути, я просто составил список, и, если совпадает время, я взял значение y насоответствующий индекс (потому что x и y должны иметь одинаковый индекс для построения графика).Затем я построил их и убедился, что они являются верхним уровнем графика, используя zorder=10