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

