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

如何将多组density plot完全重叠以对比形状?

问题

需要对比5组密度图的形状,但各组数值范围不同,常规密度图无法有效对比,希望让5组密度图完全重叠展示。当前使用的代码如下:

for descriptor in descriptors:
            plt.figure()
            descript = [descriptor]+ [descriptor+ '_'+ sets[i] for i in range(1,len(sets))]
            sns.kdeplot(data=df[descript], legend=False)
            plt.legend(labels=['a', 'b', 'c', 'd', 'e'],bbox_to_anchor=(1.04, 0.5), loc="center left")
            plt.title(descriptor.replace('_', ' ').capitalize())
            plt.xlabel(descriptor.replace('_', ' ').capitalize())
            plt.savefig('distribution_'+descriptor+'.png', bbox_inches='tight')
            plt.close()

解决方案

要让不同数值范围的密度图重叠对比形状,核心是对每组数据做标准化(Z-score归一化),将所有数据转换为均值为0、方差为1的分布,这样就能忽略数值绝对值差异,只对比分布形状。

修改后的代码如下:

from scipy.stats import zscore

for descriptor in descriptors:
    plt.figure()
    # 提取目标列
    descript = [descriptor] + [descriptor + '_' + sets[i] for i in range(1, len(sets))]
    # 对每列数据做Z-score标准化
    normalized_data = df[descript].apply(zscore)
    # 用标准化后的数据绘制密度图
    sns.kdeplot(data=normalized_data, legend=False)
    plt.legend(labels=['a', 'b', 'c', 'd', 'e'], bbox_to_anchor=(1.04, 0.5), loc="center left")
    plt.title(f"{descriptor.replace('_', ' ').capitalize()} (Z-score Normalized)")
    plt.xlabel("Z-score")  # 标准化后x轴改为Z-score更合理
    plt.savefig(f'distribution_{descriptor}_normalized.png', bbox_inches='tight')
    plt.close()

关键修改说明

  • 引入scipy.stats.zscore实现标准化,也可以手动计算:(x - x.mean()) / x.std()
  • 对提取的每组数据列应用标准化,生成normalized_data
  • 修改标题标注已标准化,x轴改为“Z-score”,更符合当前数据含义
  • 保存文件名加上_normalized区分原始图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 07:42:45