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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 20:45:03