具有色调和双 y 尺度(twinx)的 Seaborn 绘图 displot

Seaborn plot displot with hue and dual y-scale (twinx)

我正在尝试绘制 ML 模型预测的输出,有 类 1,0 表示目标,还有分数。由于数据集不平衡,所以很少有1。

当我用 hue 参数中的 Target 绘制一个简单的 displot 时,该图对于描述 1 是无用的

sns.set_theme()
sns.set_palette(sns.color_palette('rocket', 3))
sns.displot(df, x='Score', hue='Target', bins=30, linewidth=0, height=5, kde=True, aspect=1.6)
plt.show()

我想更改同一绘图中 1 的比例,在右侧使用 twinx 更改第二个 y 比例。

我已经尝试了以下代码,可以解决 2 个图的问题,但是 我只需要一个图。我无法使用 twinx。

g = sns.displot(df, x='Score', col='Target', bins=30, linewidth=0, height=5, kde=True, aspect=1.6, facet_kws={'sharey': False, 'sharex': False})
g.axes[0,1].set_ylim(0,400)
plt.show()

g = sns.FacetGrid(df, hue='Target')
g = g.map(sns.displot, 'Score', bins=30, linewidth=0, height=3, kde=True, aspect=1.6)

泰坦尼克号数据集可能是一个可重现的例子:

df_ = sns.load_dataset('titanic')
sns.displot(df_, x='fare', hue='survived', bins=30, linewidth=0, height=5, kde=True, aspect=1.6)

g = sns.displot(df_, x='fare', col='survived', bins=30, linewidth=0, height=5, kde=True, aspect=1.6, facet_kws={'sharey': False, 'sharex': False})
g.axes[0,1].set_ylim(0,150)
plt.show()

我不确定,但你在找这个吗?

import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
df_ = sns.load_dataset('titanic')
sns.histplot(df_[df_['survived']==1]['fare'], bins=30, linewidth=0, kde=True, color='red')
ax2 = plt.twinx()
sns.histplot(df_[df_['survived']==0]['fare'], bins=30, linewidth=0, kde=True, ax=ax2, color='blue')

要比较具有不同观测值的分布形状,您可以通过设置 stat="density" 对其进行归一化。默认情况下,这会使用相同的分母对每个分布进行归一化,但您可以通过设置 common_norm=False:

独立地对每个分布进行归一化
sns.displot(
    titanic, x='fare', hue='survived',
    bins=30, linewidth=0, kde=True,
    stat="density", common_norm=False,
    height=5, aspect=1.6
)

两个分布的峰值不在相同的 y 值处,但这是数据的一个真实特征:幸存者人口分布在更广泛的票价范围内,并且较少聚集在低端。拥有两个独立的 y 轴并缩放它们以均衡每个分布峰的高度会产生误导。