繁体   English   中英

Matplotlib fill_between()解决方法

[英]Matplotlib fill_between() workaround

我遇到一个奇怪的情况,需要一点帮助。 我有以下数据:

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

对于您的示例,差异非常细微,因此我放大了填充区域的顶部边缘,但是使用较高的曲率数据,您会更容易注意到差异: 线性和样条

为了进行比较,请参见具有线性和样条插值的非裁剪版本。 如果xleftxright在峰值附近( 1112左右),您会发现这两种方法之间存在很大差异。 线性和样条线,未裁剪

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM