在使用样条插值法绘制图形的最大值的x和y值之间绘制线条。
在使用样条插值法绘制图形的最大值的x和y值之间绘制线条。
我想绘制一个图表,并通过在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轴之间绘制一条线,而不是将原始数据点叠加在样条插值曲线上。修正后的代码解决了这个问题。