如何在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()
关键修正说明
- 占比计算修正:原代码中
total_numbers_2015是单元素列表,zip仅循环一次,改为total_numbers_2015 * len(female_numbers_2015)后,确保每个收入分组都能匹配总人数计算占比。 barh参数调整:y参数指定垂直方向位置,每个分组对应两个位置(y - bar_height/2对应2015,y + bar_height/2对应2018),实现分组效果height控制垂直方向的条形宽度,保证分组内两个条形的间距合理left参数实现堆叠:男性条形的起始位置为女性条形的长度,从而堆叠在女性条形右侧
- 可视化优化:添加轴标签、标题、图例,调整图表尺寸,确保布局清晰美观。
内容的提问来源于stack exchange,提问作者Michelle13
相关产品推荐
相关产品推荐

