您可以使用fill_between
填充曲线下方的区域。要从seaborn图中访问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')
完整示例:
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()
Old answer to initial question:
您可以使用axvspan https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.axvspan.html,从左 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()
这里,我们需要在设置span之后调整xlimits;原因是,在设置了跨度后,自动缩放会在轴的两端再添加 5% 的填充,从而产生空白。或者,您可以对 x 轴使用零边距,ax.margins(x=0)
.