在使用样条插值法绘制图形的最大值的x和y值之间绘制线条。

32 浏览
0 Comments

在使用样条插值法绘制图形的最大值的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()

我应该如何实现这个?

提前谢谢。

0
0 Comments

问题的原因是代码中存在两个主要错误:

1. x 应该是排序过的

2. xy 的大小应该相同

修正后的代码如下:

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轴之间绘制一条线,而不是将原始数据点叠加在样条插值曲线上。修正后的代码解决了这个问题。

0