You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Seaborn中实现KDE图与Strip图的对齐显示

解决方案:修正Seaborn Strip图与KDE图的对齐问题

1. 解决KDE图反转问题

KDE图反转的核心原因是组合绘图时错误颠倒了X/Y轴映射,或使用了与单独绘制时不一致的轴参数,不要用bw_adjust=-1这种反向调整带宽的方式,会扭曲真实分布。

正确做法是保持KDE的轴方向与Strip图一致,为每个分类绘制KDE并对齐到Strip图对应Y轴位置:

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import gaussian_kde

df = sns.load_dataset("tips")
cat_col = "day"    # 分类列
num_col = "total_bill"  # 数值列
hue_col = "sex"    # 分组列

fig, ax = plt.subplots(figsize=(8, 4))

# 绘制Strip图,dodge让不同hue的点错开
sns.stripplot(data=df, x=num_col, y=cat_col, hue=hue_col, ax=ax, dodge=True, zorder=1)

# 获取分类在Y轴的位置映射
cat_pos_dict = {label.get_text(): pos for label, pos in zip(ax.get_yticklabels(), ax.get_yticks())}
hue_colors = dict(zip(df[hue_col].unique(), sns.color_palette("husl", 2)))
kde_scale = 0.3  # 控制KDE曲线高度

# 为每个分类+hue组合绘制KDE
for hue_val in df[hue_col].unique():
    for cat_val, y_pos in cat_pos_dict.items():
        subset = df[(df[cat_col]==cat_val) & (df[hue_col]==hue_val)][num_col]
        if len(subset) < 2:
            continue
        # 计算KDE并缩放偏移到对应Y位置
        kde = gaussian_kde(subset)
        x_vals = np.linspace(df[num_col].min(), df[num_col].max(), 200)
        y_vals_scaled = kde(x_vals) * kde_scale + y_pos
        # 错开hue对应的KDE位置(匹配strip的dodge)
        offset = 0.1 if hue_val == "Male" else -0.1
        ax.plot(x_vals, y_vals_scaled + offset, color=hue_colors[hue_val])

ax.legend(title=hue_col)
plt.tight_layout()
plt.show()

2. 解决Y轴缩放适配问题

  • 通过kde_scale参数控制KDE曲线高度:曲线过高就调小(如0.2),过低就调大(如0.4);
  • 配合dodge=True和手动偏移(offset变量)让不同hue的KDE与Strip点一一对应,避免重叠;
  • 用zorder=1确保Strip数据点显示在KDE曲线上方,不会被遮挡。

关键注意事项

  • 始终保持KDE与Strip图的轴方向一致:Strip图X为数值、Y为分类时,KDE的X必须对应数值列,不要切换为Y轴;
  • 禁止使用负的带宽调整参数,会完全扭曲数据分布的真实形态;
  • 如果不想手动计算KDE,可临时创建隐藏轴绘制KDE后,将曲线坐标转换到主轴对应位置。

内容的提问来源于stack exchange,提问作者Elie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 15:02:39