Matplotlib fill_between()变通方法

时间:2014-04-23 16:47:44

标签: python matplotlib plot

我有一个奇怪的情况,我想要一些帮助。我有以下数据:

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生成的曲线。

我对插值思想持开放态度,但我对所有有效的东西都很开放。谢谢!

1 个答案:

答案 0 :(得分:1)

我想你可能不得不做插值。甚至以某种方式“裁剪”了

的结果
plt.fill_between(xdata, 0, ydata)

Not cropped

如上述评论中所讨论的,相当于线性插值(每个数据点之间的直线)。这是你如何做到的:

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')

如果您在原件上执行此操作,则可以更好地查看: Linear

当然,您可以进行更高级的插值,下一步是使用样条线:

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')

对于您的示例,差异非常微妙,因此我已放大到填充区域的上边缘,但是使用更高的曲率数据,您会更容易发现差异: Linear and Spline

为了进行比较,请参见带有线性与样条插值的未剪切版本。如果您在峰值附近xleftxright11 - 12左右),您会发现方法之间存在很大差异。 Linear and Spline, uncropped