在 seaborn 的一个图中组合 2 个 kde 函数

Combine 2 kde-functions in one plot in seaborn

我有以下代码用于绘制训练和验证数据集的直方图和 kde 函数(核密度估计):

#Plot histograms
import matplotlib.pyplot as plt
import matplotlib
import seaborn as sns



displot_dataTrain=sns.displot(data_train, bins='auto', kde=True)
displot_dataTrain._legend.remove()
plt.ylabel('Count')
plt.xlabel('Training Data')
plt.title("Histogram Training Data")
plt.show()

displot_dataValid =sns.displot(data_valid, bins='auto', kde=True)
displot_dataValid._legend.remove()
plt.ylabel('Count')
plt.xlabel('Validation Data')
plt.title("Histogram Validation Data")
plt.show()

# Try to plot the kde-functions together --> yields an AttributeError
X1 = np.linspace(data_train.min(), data_train.max(), 1000)
X2 = np.linspace(data_valid.min(), data_valid.max(), 1000)
fig, ax = plt.subplots(1,2, figsize=(12,6))
ax[0].plot(X1, displot_dataTest.kde.pdf(X1), label='train')
ax[1].plot(X2, displot_dataValid.kde.pdf(X1), label='valid')

在一个图中绘制直方图和 kde 函数没有问题。现在我想在一个图中使用 2 个 kde 函数,但是在使用发布的代码时,出现以下错误 AttributeError: 'FacetGrid' object has no attribute 'kde'

你知道如何在一个图中组合 2 个 kde 函数(没有直方图)吗?

sns.displot()returns一个FacetGrid。这不适用于 ax.plot() 的输入。此外,displot_dataTest.kde.pdf 永远无效。但是,您可以编写 sns.kdeplot(data=data_train, ax=ax[0]) 以在第一个子图中创建一个 kdeplot。见 docs;请注意可用于调整限制的可选参数 cut=clip=

如果你只想要一个子图,你可以使用 fig, ax = plt.subplots(1, 1, figsize=(12,6)) 并使用 ax=ax 而不是 ax=ax[0] 因为在这种情况下 ax 只是一个子图,而不是一组子图。

以下代码已经使用最新的seaborn版本进行了测试:

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

fig, ax = plt.subplots(figsize=(12, 6))
sns.kdeplot(data=np.random.normal(0.1, 1, 100).cumsum(),
            color='crimson', label='train', fill=True, ax=ax)
sns.kdeplot(data=np.random.normal(0.1, 1, 100).cumsum(),
            color='limegreen', label='valid', fill=True, ax=ax)
ax.legend()
plt.tight_layout()
plt.show()