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

如何在Seaborn百分比柱状图标签中添加样本量(N)?

给Seaborn百分比柱状图添加样本量标签

要实现将样本量N(观测数)作为柱状图标签的一部分,你可以先计算每个分组的样本数量,再自定义标签文本结合百分比和样本量,具体修改如下:

修改后的完整代码

import matplotlib.pyplot as plt
from matplotlib.ticker import PercentFormatter
import seaborn as sns
import pandas as pd
import numpy as np

data = {
'id': [1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15],
'survey': ['baseline', 'endline', 'baseline', 'baseline', 'endline', 'baseline', 'endline', 'baseline', 'endline', 'baseline', 'baseline', 'endline', 'baseline', 'endline', 'baseline', 'endline', 'baseline', 'endline', 'baseline', 'endline', 'baseline', 'baseline', 'endline', 'baseline', 'endline', 'baseline', 'endline'],
'growth': [1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0]
}

df = pd.DataFrame(data)

sns.set_style('white')
ax = sns.barplot(data = df,
                 x = 'survey', y = 'growth',
                 estimator = lambda x: np.sum(x) / np.size(x) * 100, ci = None,
                 color = 'cornflowerblue')

# 计算每个survey分组的样本量
sample_sizes = df.groupby('survey').size().values
# 生成包含百分比和样本量的自定义标签
labels = [f'{val:.1f}% (N={n})' for val, n in zip(ax.containers[0].datavalues, sample_sizes)]
# 应用自定义标签
ax.bar_label(ax.containers[0], labels=labels, fontsize=20)

sns.despine(ax = ax, left = True)
ax.grid(True, axis = 'y')
ax.yaxis.set_major_formatter(PercentFormatter(100))
ax.set_xlabel('')
ax.set_ylabel('')
plt.tight_layout()
plt.show()

关键步骤说明

  • 计算样本量:使用df.groupby('survey').size()统计每个survey分组的观测数,通过.values转换为数组,方便后续对应每个柱子。
  • 生成自定义标签:通过列表推导式,把每个柱子的百分比数值(ax.containers[0].datavalues)和对应分组的样本量拼接成"XX.X% (N=XX)"格式的文本。
  • 应用标签:调用bar_label时,使用labels参数传入自定义标签,替代原有的fmt参数,实现同时显示百分比和样本量的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:01:36