如何用不同的颜色填充seaborn.distplot中的区域

aze*_*mar 3 python matplotlib seaborn

是否可以用颜色填充两条阈值线(线1和线2)外部并在y轴上受distplot绘制的KDE曲线限制的区域(在我的应用中为3σ)

import pylab as pl
import seaborn as sns
#plotting the two lines
p1 = pl.axvline(x=line1,color='#EF9A9A')
p2 = pl.axvline(x=line2,color='#EF9A9A')
#plotting the PDF
sns.distplot(stat, hist=True,color='#388E3C')
Run Code Online (Sandbox Code Playgroud)

结果图

Imp*_*est 6

您可以fill_between用来填充曲线下方的区域。要从海洋图访问KDE曲线,可以先绘制该图,这样就ax.lines只有一个元素,即感兴趣的曲线。其数据是通过获取的kde_x, kde_y = ax.lines[0].get_data()

然后使用ax.fill_between()允许填充曲线下的区域。为了将其限制在给定的数据范围之外,where可以使用关键字参数(并且interpolate=True应将其设置为使面积增加到所讨论的点)。

ax.fill_between(kde_x, kde_y, where=(kde_x<x0) | (kde_x>x1) , 
                interpolate=True, color='#EF9A9A')
Run Code Online (Sandbox Code Playgroud)

完整示例:

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

stat=np.random.randn(100)
x0 = -1
x1 = 1

#plotting the PDF (do this before plotting anything else)
ax = sns.distplot(stat, hist=True,color='#388E3C')
kde_x, kde_y = ax.lines[0].get_data()

#plotting the two lines
p1 = plt.axvline(x=x0,color='#EF9A9A')
p2 = plt.axvline(x=x1,color='#EF9A9A')


ax.fill_between(kde_x, kde_y, where=(kde_x<x0) | (kde_x>x1) , 
                interpolate=True, color='#EF9A9A')

plt.show()
Run Code Online (Sandbox Code Playgroud)

上面的代码产生的图像


最初问题的旧答案:

您可以使用axvspan,从左x极限开始到第一行的位置,而另一个从第二行的位置开始到右边的x极限。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

stat=np.random.randn(100)
x0 = -1
x1 = 1

#plotting the two lines
p1 = plt.axvline(x=x0,color='#EF9A9A')
p2 = plt.axvline(x=x1,color='#EF9A9A')

#plotting the PDF
ax = sns.distplot(stat, hist=True,color='#388E3C')

xlim = ax.get_xlim()
ax.axvspan(xlim[0], x0, color='#EF9A9A', alpha=0.5)
ax.axvspan(x1, xlim[1], color='#EF9A9A', alpha=0.5)
#reset xlim
ax.set_xlim(xlim)
plt.show()
Run Code Online (Sandbox Code Playgroud)

上面的代码产生的图像

在这里,我们需要在设置跨度之后调整xlimit;原因是跨度到位后,自动缩放会在轴的两端再添加5%的填充,从而导致空白。或者,您可以为x轴使用零边距ax.margins(x=0)