我正在尝试在原始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附近碰撞,然后它开始留下奇怪的间隙,它不会一直到回归线。这是一个例子:
我在这里做错了什么?我尝试了很多东西,包括:
为低和高置信区间添加线
将interpolate=True
添加到fill_between
来电
将where=x>0
添加到fill_between
来电
但这些都没有任何区别。
我还注意到seaborn manages使用fill_between
使用完全相同的策略进行漂亮的填充,并且seaborn的绘图在我正在使用的数据上正确地工作...
答案 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)])
要理解为什么需要对值进行排序,也许图片可以说出超过几千个单词。