簡體   English   中英

matplotlib fill_between留下空白

[英]matplotlib fill_between leaves gaps

我正在嘗試在原始matplotlib中重新創建seaborn的僅填充置信區間繪圖 在這樣做時,我fill_between了奇怪的行為,其中fill_between函數在它應該填充的東西之間留下間隙。

我正在使用真實世界的數據,但它是表現良好的數據:x值在大約0-15的范圍內,y值在大約25-85的范圍內。 我正在使用statsmodels來擬合線並生成置信區間,基本上是來自此先前SO的代碼 ,並且擬合值以及置信區間的上限和下限是它們應該的(范圍是合適的,等等。)。 所以數據沒有錯。

這是代碼的相關部分:

def make_plot(x, y):
    fig = plt.figure(figsize=(12, 9))
    ax = fig.add_subplot(1, 1, 1)
    ax.plot(x, y, 'k.', ms=5)
    ax.locator_params(nbins=3)
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    regline =  sm.OLS(y,sm.add_constant(x)).fit()
    fitted = regline.fittedvalues
    ax.plot(x, fitted, color=(0.2, 0.2, 0.2, 0.2), linewidth=2)
    ci_low, ci_high = get_ci_values(regline)
    ax.fill_between(x, ci_low, fitted, facecolor=(0.4, 0.4, 0.9, 0.2))
    ax.fill_between(x, ci_high, fitted, facecolor=(0.9, 0.4, 0.4, 0.2))
    return fig

線條填充工作正常,直到它在x = 10,y = 50附近,然后它開始留下奇怪的間隙,它不會一直到回歸線。 這是一個例子:

圖像與可怕的差距

我在這做錯了什么? 我嘗試了很多東西,包括:

  • 為低和高置信區間添加線

  • interpolate=True添加到fill_between調用

  • fill_between調用中添加where=x>0

但這些都沒有任何區別。

我還注意到seaborn 設法使用fill_between進行漂亮的填充,使用完全相同的策略,並且seaborn的繪圖在我正在使用的數據上正確工作...

人們無法確切知道,因為問題是缺少必要部分,即數據本身(參見最小,完整和可驗證的例子 )。

然而,這里強烈的懷疑是數據沒有排序

(未經測試的)解決方案是對數據進行排序,

ax.plot(np.sort(x), fitted[np.argsort(x)])
ax.fill_between(np.sort(x), ci_low[np.argsort(x)], fitted[np.argsort(x)])

要理解為什么需要對值進行排序,也許圖片可以說出超過幾千個單詞。

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM