使用样条插值绘制图形中最大值的 x 和 y 值的线
Plot lines to x and y values of maximum in graph with spline interpolation
我想绘制一个图形并通过绘制一条返回 x 轴和 y 轴的虚线并显示两者的值来突出显示其局部最大值。
例如一些数据:
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import make_interp_spline
x_ = np.array([1, 2.5, 2.7, 8, 3])
y_ = np.array([1, 2, 3, 4, 5, 6])
spline = make_interp_spline(x_, y_)
x = np.linspace(x_.min(), x_.max(), 500)
y = spline(x)
xmax = x[np.argmax(y)]
ymax = y.max()
plt.plot(x, y)
plt.plot(xmax,ymax,'o')
plt.show()
我该怎么做?
提前致谢
大体代码还可以,但是有两个大错误:
1- x
应该排序
2- x
和 y
应该大小相同
代码的工作版本:
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import make_interp_spline
x_ = np.array([1, 2.5, 2.7, 3, 8])
y_ = np.array([1, 2, 3, 5, 4])
spline = make_interp_spline(sorted(x_), y_)
x = np.linspace(x_.min(), x_.max(), 500)
y = spline(x)
xmax = x[np.argmax(y)]
ymax = y.max()
plt.plot(x_, y_, 'o')
plt.plot(x, y)
plt.plot(xmax,ymax,'s')
# annotations
plt.axhline(ymax, ls=':', c='k')
plt.axvline(xmax, ls=':', c='k')
plt.text(xmax, ymax*0.95, f'({round(xmax,2)}, {round(ymax,2)})')
plt.show()
我想绘制一个图形并通过绘制一条返回 x 轴和 y 轴的虚线并显示两者的值来突出显示其局部最大值。
例如一些数据:
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import make_interp_spline
x_ = np.array([1, 2.5, 2.7, 8, 3])
y_ = np.array([1, 2, 3, 4, 5, 6])
spline = make_interp_spline(x_, y_)
x = np.linspace(x_.min(), x_.max(), 500)
y = spline(x)
xmax = x[np.argmax(y)]
ymax = y.max()
plt.plot(x, y)
plt.plot(xmax,ymax,'o')
plt.show()
我该怎么做?
提前致谢
大体代码还可以,但是有两个大错误:
1- x
应该排序
2- x
和 y
应该大小相同
代码的工作版本:
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import make_interp_spline
x_ = np.array([1, 2.5, 2.7, 3, 8])
y_ = np.array([1, 2, 3, 5, 4])
spline = make_interp_spline(sorted(x_), y_)
x = np.linspace(x_.min(), x_.max(), 500)
y = spline(x)
xmax = x[np.argmax(y)]
ymax = y.max()
plt.plot(x_, y_, 'o')
plt.plot(x, y)
plt.plot(xmax,ymax,'s')
# annotations
plt.axhline(ymax, ls=':', c='k')
plt.axvline(xmax, ls=':', c='k')
plt.text(xmax, ymax*0.95, f'({round(xmax,2)}, {round(ymax,2)})')
plt.show()