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

如何在Python中绘制堆叠分组水平条形图?

实现堆叠分组水平条形图

你的原代码在barh参数使用上存在错误,以下是修正后的完整实现,满足按收入分组,每组对应2015/2018两个条形,每个条形堆叠男女占比的需求:

完整代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 原始数据
female_numbers_2015 = [20882, 31322, 52204, 52205, 31322, 20881]
female_numbers_2018 = [20882, 31322, 52204, 52205, 31322, 20881]
male_numbers_2015 = [11352, 17080, 28380, 28380, 17028, 11351]
male_numbers_2018 = [11454, 17181, 28636, 28634, 17181, 11454]

total_numbers_2015 = [306669]
total_numbers_2018 = [323356]

# 计算各分组男女占比(修正总人数循环匹配问题)
percent_males_2015 = [i / j * 100 for i, j in zip(male_numbers_2015, total_numbers_2015 * len(female_numbers_2015))]
percent_females_2015 = [i / j * 100 for i, j in zip(female_numbers_2015, total_numbers_2015 * len(female_numbers_2015))]
percent_males_2018 = [i / j * 100 for i, j in zip(male_numbers_2018, total_numbers_2018 * len(female_numbers_2018))]
percent_females_2018 = [i / j * 100 for i, j in zip(female_numbers_2018, total_numbers_2018 * len(female_numbers_2018))]

index = ['Poorest 10%', '10-25%', '25-50%', '50-75%', '75-90%', 'Richest 10%']

# 设置y轴位置:每个收入分组对应两个条形(2015和2018)
y = np.arange(len(index))
bar_height = 0.35  # 垂直方向上每个条形的高度

fig, ax = plt.subplots(figsize=(10, 6))

# 绘制2015年堆叠条形
# 女性部分(底层)
ax.barh(y - bar_height/2, percent_females_2015, height=bar_height, label='2015 - Female', color='#ff7f7f')
# 男性部分(堆叠在女性右侧,left指定起始位置)
ax.barh(y - bar_height/2, percent_males_2015, height=bar_height, left=percent_females_2015, label='2015 - Male', color='#7f7fff')

# 绘制2018年堆叠条形
ax.barh(y + bar_height/2, percent_females_2018, height=bar_height, label='2018 - Female', color='#ffcccc')
ax.barh(y + bar_height/2, percent_males_2018, height=bar_height, left=percent_females_2018, label='2018 - Male', color='#ccccff')

# 配置轴标签与刻度
ax.set_yticks(y)
ax.set_yticklabels(index)
ax.set_xlabel('Percentage (%)')
ax.set_ylabel('Income Group')
ax.set_title('Gender Percentage by Income Group (2015 vs 2018)')

# 添加图例与布局优化
ax.legend()
plt.tight_layout()
plt.show()

关键修正说明

  1. 占比计算修正:原代码中total_numbers_2015是单元素列表,zip仅循环一次,改为total_numbers_2015 * len(female_numbers_2015)后,确保每个收入分组都能匹配总人数计算占比。
  2. barh参数调整:
    • y参数指定垂直方向位置,每个分组对应两个位置(y - bar_height/2对应2015,y + bar_height/2对应2018),实现分组效果
    • height控制垂直方向的条形宽度,保证分组内两个条形的间距合理
    • left参数实现堆叠:男性条形的起始位置为女性条形的长度,从而堆叠在女性条形右侧
  3. 可视化优化:添加轴标签、标题、图例,调整图表尺寸,确保布局清晰美观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:55:15