matplotlib fill_between留下空白

时间:2018-01-10 23:29:04

标签: python matplotlib data-visualization

我正在尝试在原始matplotlib中重新创建seaborn的fill-only confidence interval plotting。在这样做时,我遇到了奇怪的行为,fill_between函数在它应该填充的东西之间留下了空白。

我正在使用真实世界的数据,但它是表现良好的数据:x值在约0-15的范围内,y值在约25-85的范围内。我正在使用statsmodels来拟合线并生成基本上the code from this prior 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附近碰撞,然后它开始留下奇怪的间隙,它不会一直到回归线。这是一个例子:

image with horrible gap

我在这里做错了什么?我尝试了很多东西,包括:

  • 为低和高置信区间添加线

  • interpolate=True添加到fill_between来电

  • where=x>0添加到fill_between来电

但这些都没有任何区别。

我还注意到seaborn manages使用fill_between使用完全相同的策略进行漂亮的填充,并且seaborn的绘图在我正在使用的数据上正确地工作...

1 个答案:

答案 0 :(得分:3)

人们无法确切知道,因为问题缺少必要部分,即数据本身(见Minimal, Complete, and Verifiable example)。

然而,强烈怀疑数据未排序

(未经测试的)解决方案是对数据进行排序,

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

要理解为什么需要对值进行排序,也许图片可以说出超过几千个单词。

enter image description here