#python #numpy #datetime #matplotlib #bspline
#python #numpy #datetime #matplotlib #bspline
Вопрос:
Итак, для школьного проекта я разрабатываю программу, которая создает график высот прилива с течением времени. BSpline не принимает объекты datetime, как и np.linspace, который, как я видел, необходим для запуска BSpline.
Я пытался использовать pandas для преобразования datetime в значение, которое np может прочитать, или с помощью datetime64. В приведенном ниже коде я удалил все свои неудачные методы и просто оставил голые кости.
import matplotlib.pyplot as pyplot
from matplotlib.dates import date2num, datestr2num
import numpy as np
import matplotlib.dates as mdates
from scipy.interpolate import make_interp_spline,BSpline
test_xvals = [datetime(1900, 1, 1, 1, 28), datetime(1900, 1, 1, 5, 47), datetime(1900, 1, 1, 13, 7), datetime(1900, 1, 1, 20, 43)] #times which correspond to the height of the tides
test_yvals = [3.3, 3.9, 0.8, 4.5] #height of the tides in meters
times = date2num(test_xvals) #converts to object compatible with numpy and matplotlib
heights = np.array(test_yvals) #array of 4 floats
x_smooth = np.linspace(times.min(), times.max(), 300)
spl = make_interp_spline(times,heights , k=3) #BSpline object
y_smooth = spl(x_smooth)
fig, ax = plt.subplots()
ax.plot(x_smooth, y_smooth)
ax.scatter(times,heights)
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
#pyplot.xticks(dates,xlabels)
pyplot.ylim(0,6)
Синусоидальный график не соответствует точкам данных. Какие атрибуты BSpline я должен настроить, чтобы точки данных совпадали с локальными максимальными / минимальными значениями?
График с несинхронизированными точками данных
Комментарии:
1. Вы ожидаете, что мы угадаем, где возникает ошибка?
2. Извините! Обновил его.
3. Перечитайте
BSpline
документы.4. Перечитывание документов BSpline не помогло, но я, наконец, нашел вопрос о переполнении стека, который отвечал на аналогичную проблему и привел мой график к кривой. Однако эти кривые не совпадают с фактическими точками данных (я обновил код и включил изображение выходных данных). Как я могу это исправить?
5. То, что бросилось мне в глаза, заключалось в том, что третий аргумент,
k
, должен быть единственным числом. Вы предоставили ему массив из linspace.