我遇到一个奇怪的情况,需要一点帮助。我有以下数据:
xdata = [ 11.125, 11.375, 11.625, 11.875, 12.125, 12.375, 12.625, 12.875, 13.125, 13.375, 13.625, 13.875, 14.125, 14.375, 14.625, 14.875, 15.125, 15.375]
ydata = [ 5.49305494, 6.51732366, 6.54733551, 6.38045781, 6.16101383, 5.93700054, 5.70674253, 5.47409529, 5.23715401, 4.98422568, 4.72124987, 4.43762374, 4.11756956, 3.74888544, 3.32613096, 2.79169065, 2.0374265, 1.07918125]
我想使用fill_between()函数,以使填充区域位于两个x值之间,这两个x值不属于列表xdata,同时填充y = 0之间的区域,并生成曲线通过提供的ydata。
我想到了两件事:1)不在乎被y数据限制(在这种情况下,我将使用axvspan()函数);这不再是一个真正的选择,并且2)执行某种插值方案以找到我拥有的x值(它们又不是xdata的一部分)的插值ydata值。如果我确实提出第二个想法,我将需要知道在使用plot()函数时,默认情况下matplotlib如何在数据点之间进行插值,以尝试完全匹配ydata生成的曲线。
我对插值法持开放态度,但实际上对任何可行的方法持开放态度。谢谢!
最佳答案
我认为您可能必须进行插值。甚至以某种方式“裁剪”来自
plt.fill_between(xdata, 0, ydata)
如上面的评论所讨论的,等效于线性插值(每个数据点之间的直线)。您可以按照以下方式进行操作:
xdata = ...
ydata = ...
xleft, xright = 13.3979400087, 13.414973348
xfill = np.linspace(xleft, xright)
yfill = np.interp(xfill, xdata, ydata)
plt.fill_between(xfill, 0, yfill, color='r')
如果您在原件上进行此操作,则可以更好地看到它:
当然,您可以进行更高级的插值,下一步是样条线:
from scipy import interpolate
# same as above ...
yfill_spline = interpolate.spline(xdata, ydata, xfill) #note the different args ordering from np.interp
plt.fill_between(xfill, 0, yfill_spline, color='g')
对于您的示例,差异非常细微,因此我放大了填充区域的顶部边缘,但是使用较高的曲率数据,您会更容易注意到差异:
为了进行比较,请参见具有线性和样条插值的非裁剪版本。如果
xleft
和xright
在峰值附近(11
– 12
左右),您会注意到方法之间的巨大差异。