pandas百分比堆叠柱状图如何在X轴标签旁展示分组样本量
实现x轴标签附带对应样本量的方法
核心实现逻辑
完全不需要改动原有堆叠柱状图的核心绘制逻辑,只要把默认的x轴标签换成拼接了样本量的自定义文本即可。pandas绘制分类柱状图时,每个柱子的位置和分类顺序严格一一对应,替换文本不会打乱柱子和标签的匹配关系。
具体操作步骤
- 第一步,提前计算每个年龄分组的总样本量:直接对原DataFrame的每一行做求和,得到的结果和原DataFrame的索引完全对齐,无需额外做匹配
# 计算每个分组的总样本数,按行求和 group_sample_size = table.sum(axis=1) - 第二步,按格式拼接自定义x轴标签,把样本量用括号包裹在原年龄标签后面
# 拼接为类似"18-24 (n=78)"的格式,n=是学术绘图的通用标注,方便读者快速识别数值含义 custom_x_labels = [ f"{age_bin} (n={sample_num})" for age_bin, sample_num in zip(table.index, group_sample_size) ] - 第三步,替换原有绘图代码里的x轴刻度设置,应用自定义标签
把原来代码里的plt.xticks(fontsize=15, rotation=45)部分,替换为明确指定刻度位置+自定义标签的代码,避免不同matplotlib版本的兼容警告# 明确指定每个柱子对应的x轴刻度位置(从0开始的整数,和柱子顺序一一对应) ax.set_xticks(range(len(table.index))) # 应用自定义标签,保留原有字体大小、旋转角度的设置 ax.set_xticklabels( custom_x_labels, fontsize=15, rotation=45 )
整合后的完整可运行代码
# 计算百分比占比用于堆叠绘图 percent_table = table.div(table.sum(1).astype(float), axis=0).mul(100.0) ax = percent_table.plot( kind='bar', stacked=True, cmap = 'Blues', fontsize=15, figsize = (8,8) ) # 原有图例设置 handles, labels = ax.get_legend_handles_labels() ax.legend(handles[::-1], labels[::-1], loc='upper right', fontsize=10) # 原有轴标签设置 ax.set_xlabel('', fontsize = 20) ax.set_ylabel('Percentage of total respondents', fontsize = 20) # 新增:生成带样本量的自定义x轴标签 group_sample_size = table.sum(axis=1) custom_x_labels = [ f"{age_bin} (n={sample_num})" for age_bin, sample_num in zip(table.index, group_sample_size) ] # 替换原有xticks配置 ax.set_xticks(range(len(table.index))) ax.set_xticklabels( custom_x_labels, fontsize=15, rotation=45 ) # 原有y轴范围设置 ax.set_ylim(0,100)
效果说明
按照给出的示例数据,三个分组计算得到的样本量分别是78、145、11,最终x轴显示的标签就会是18-24 (n=78)、25-44 (n=145)、45-64 (n=11),直接展示在对应柱子的正下方,和原有标签的位置完全一致。如果不需要标注n=字样,只要把拼接的文本改成f"{age_bin} ({sample_num})"即可,可按实际格式需求灵活调整。
内容的提问来源于stack exchange,提问作者Debjit Bhowmick
相关产品推荐
相关产品推荐

