如何使Seaborn KDEPlot不同色调的密度峰值高度一致?
调整Seaborn JointGrid边际KDE曲线峰值高度的方法
直接设置ymax只会截断坐标轴显示范围,不会改变KDE曲线本身的峰值高度,达不到你要的效果。推荐用以下两种方法实现:
方法一:手动缩放KDE曲线的y值
KDE曲线的密度值是归一化后的结果,你可以提取两条曲线的数值,计算峰值比例后缩放目标曲线的y轴数据,让两者峰值对齐。示例代码如下:
import seaborn as sns import matplotlib.pyplot as plt import numpy as np # 生成示例数据 np.random.seed(42) x_blue = np.random.normal(0, 1, 1000) x_red = np.random.normal(0, 2, 1000) y_data = np.random.normal(0, 1, 1000) # 创建JointGrid并绘制基础图形 g = sns.JointGrid(x=x_blue, y=y_data) g.plot_joint(sns.scatterplot, alpha=0.3) g.plot_marginals(sns.kdeplot, color='blue') # 绘制红色边际KDE sns.kdeplot(x=x_red, ax=g.ax_marg_x, color='red') # 获取边际轴上的两条KDE曲线对象 lines = g.ax_marg_x.get_lines() blue_kde = lines[0] red_kde = lines[1] # 计算两条曲线的峰值 blue_peak = max(blue_kde.get_ydata()) red_peak = max(red_kde.get_ydata()) # 计算缩放比例,让红色曲线峰值匹配蓝色 scale_ratio = blue_peak / red_peak # 更新红色曲线的y值 red_kde.set_ydata(red_kde.get_ydata() * scale_ratio) # 调整边际轴的y范围以适配缩放后的曲线 g.ax_marg_x.set_ylim(0, max(blue_peak, red_kde.get_ydata().max())) plt.show()
方法二:调整KDE带宽(可选)
如果你想通过改变KDE的平滑程度来让峰值高度接近,可以调整bw_method参数(比如减小红色KDE的带宽,让曲线更陡峭、峰值更高)。但这种方法会改变曲线的形状,适合需要同时调整分布形态的场景:
# 在绘制红色KDE时调整带宽 sns.kdeplot(x=x_red, ax=g.ax_marg_x, color='red', bw_method=0.3)
内容的提问来源于stack exchange,提问作者Johnny Tam
相关产品推荐
相关产品推荐

