如何将多组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
相关产品推荐
相关产品推荐

