如何在Seaborn jointplot边际图中按类别展示百分比分布?
解决Seaborn jointplot边际图按组内百分比展示的问题
要实现每个Name组的边际图展示自身的百分比分布(而非全局计数或全局百分比),可以利用Seaborn的stat='probability'参数自动按组归一化,再将刻度转换为百分比格式,具体步骤如下:
修正后的代码
from faker import Faker import pandas as pd import numpy as np import seaborn as sns fake = Faker('En-US') name1 = fake.name() name2 = fake.name() # 创建模拟数据 m1 = pd.DataFrame({'Name': name1, 'X': np.random.normal(3, 100, 1000), 'Y': np.random.normal(7, 100, 1000)}) m2 = pd.DataFrame({'Name': name2, 'X': np.random.normal(50, 20, 50), 'Y': np.random.normal(-10, 100, 50)}) df = pd.concat([m1, m2]) # 绘制带组内百分比边际图的jointplot g = sns.jointplot( data=df, x='X', y='Y', hue='Name', # 边际图设置:按组归一化概率分布,总和为1 marginal_kws={'stat': 'probability'} ) # 将边际图的概率刻度转换为百分比显示 for ax in [g.ax_marg_x, g.ax_marg_y]: # 转换y轴刻度为百分比 ax.set_yticklabels(['{:.1f}%'.format(tick * 100) for tick in ax.get_yticks()]) # 转换底部边际图的x轴刻度为百分比 if ax == g.ax_marg_x: ax.set_xticklabels(['{:.1f}%'.format(tick * 100) for tick in ax.get_xticks()]) # 修改轴标签为“Percentage” ax.set_ylabel('Percentage') if ax == g.ax_marg_y else ax.set_xlabel('Percentage')
关键说明
marginal_kws={'stat': 'probability'}:让Seaborn自动对每个hue组的边际直方图进行归一化,每组的直方图高度总和为1(即组内比例),完美解决样本量差异导致的对比困难。- 刻度转换:通过
set_yticklabels和set_xticklabels将概率值(0-1)转换为百分比(0%-100%),提升图表可读性。 - 轴标签修改:将默认的计数标签改为“Percentage”,明确图表含义。
内容的提问来源于stack exchange,提问作者ez4tot
相关产品推荐
相关产品推荐

