Чтобы добавить промежуточные точки к вашим данным, вам нужно использовать некоторую форму интерполяция .В numpy
есть np.interp
, который обеспечивает простой интерфейс для предварительной линейной интерполяции.
Ниже приведен простой пример.
import numpy as np
import matplotlib.pyplot as plt
x = np.array([1,2,3,10,20,30])
y = np.array([1,2,3,4,5,6])
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot(x, y, '.', ms=10)
# Create a continuous range for the x axis from first to last value
xc = np.arange(x[0], x[-1])
yi = np.interp(xc, x, y)
ax.plot(xc, yi, 'x', color='r')
Это дает следующий график.
Входные данные отображаются в виде синих кружков, интерполированные в виде красных крестиков.
Важно отметить, что для интерполяции ваших данныхсначала необходимо вычислить ось интерполированных данных (например, регулярный диапазон значений от min..max).Затем вы передаете эту новую ось вместе с вашими текущими x
и текущими y
значениями в np.interp
.Результатом является новый набор y
значений в интерполированных x
местоположениях.
Используя ваш пример данных / сценария, вы можете сделать -
import numpy as np
import matplotlib.pyplot as plt
protocols = {}
types = {"data1": "data1_final.csv"}
for protname, fname in types.items():
col_time,col_window = np.loadtxt(fname,delimiter=',').T
trailing_window = col_window[:-1]
leading_window = col_window[1:]
decreasing_inds = np.where(leading_window < trailing_window)[0]
quotient = leading_window[decreasing_inds]/trailing_window[decreasing_inds]
quotient_times = col_time[decreasing_inds]
protocols[protname] = {
"col_time": col_time,
"col_window": col_window,
"quotient_times": quotient_times,
"quotient": quotient,
}
plt.figure(); plt.clf()
plt.plot(quotient_times,quotient, ".", label=protname, color="blue")
# Interpolate, along an axis from min..max quotient_times
xc = np.arange(quotient_times[0], quotient_times[-1], 0.5)
quotienti = np.interp(xc, quotient_times, quotient)
plt.plot(xc, quotienti, 'x', color='r')
plt.ylim(0, 1.0001)
plt.title(protname)
plt.xlabel("time")
plt.ylabel("quotient")
plt.legend()
plt.show()
, что приводит к следующему графику.