簡體   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