У меня есть сложная кривая, определенная как набор точек в такой таблице (полная таблица находится здесь):
# x y
1.0577 12.0914
1.0501 11.9946
1.0465 11.9338
...
Если я построю эту таблицу с помощью команд:
plt.plot(x_data, y_data, c='b',lw=1.)
plt.scatter(x_data, y_data, marker='o', color='k', s=10, lw=0.2)
Я получаю следующее:
где я добавил красные точки и сегменты вручную. Что мне нужно, так это способ вычислить эти сегменты для каждой из этих точек, а именно: способ найти минимальное расстояние от заданной точки в этом 2D-пространстве до интерполированной кривой.
Я не могу использовать расстояние до самих точек данных (черные точки, формирующие синюю кривую), так как они расположены не через равные промежутки, иногда они близки, а иногда далеко друг от друга, и это сильно влияет на мои результаты в дальнейшем. линия.
Поскольку это не очень хорошая кривая, я не совсем уверен, что я мог бы сделать. Я попытался интерполировать его с помощью UnivariateSpline. но он возвращает очень плохое соответствие:
# Sort data according to x.
temp_data = zip(x_data, y_data)
temp_data.sort()
# Unpack sorted data.
x_sorted, y_sorted = zip(*temp_data)
# Generate univariate spline.
s = UnivariateSpline(x_sorted, y_sorted, k=5)
xspl = np.linspace(0.8, 1.1, 100)
yspl = s(xspl)
# Plot.
plt.scatter(xspl, yspl, marker='o', color='r', s=10, lw=0.2)
Я также попытался увеличить количество точек интерполяции, но получил беспорядок:
# Sort data according to x.
temp_data = zip(x_data, y_data)
temp_data.sort()
# Unpack sorted data.
x_sorted, y_sorted = zip(*temp_data)
t = np.linspace(0, 1, len(x_sorted))
t2 = np.linspace(0, 1, 100)
# One-dimensional linear interpolation.
x2 = np.interp(t2, t, x_sorted)
y2 = np.interp(t2, t, y_sorted)
plt.scatter(x2, y2, marker='o', color='r', s=10, lw=0.2)
Любые идеи/указатели будут высоко оценены.