我有一个奇怪的情况,我想要一些帮助。我有以下数据:
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值的内插ydata值(它们也不是xdata的一部分)。如果我继续推进第二个想法,我需要知道matplotlib在使用plot()函数时默认情况下如何在数据点之间进行插值,以便尝试完全匹配ydata生成的曲线。
我对插值思想持开放态度,但我对所有有效的东西都很开放。谢谢!
答案 0 :(得分:1)
我想你可能不得不做插值。甚至以某种方式“裁剪”了
的结果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
左右),您会发现方法之间存在很大差异。