如何让Matplotlib嵌套饼图内外层分区精准匹配?
解决嵌套饼图内外层精准匹配的最简方案
问题核心
原代码存在两个关键问题导致内外层错位:
- 内层标签顺序与数据顺序不匹配
- 内层饼图未对齐到外层对应性别的角度范围
修改后的代码
import matplotlib.pyplot as plt import numpy as np import pandas as pd # 模拟数据集(实际使用时替换为你的current_employees) data = { "gender": [0]*41 + [1]*45, "amount": [100]*41 + [98]*45, "college": [1]*33 + [0]*8 + [1]*36 + [0]*9 } current_employees = pd.DataFrame(data) # 计算外层数据:性别对应销售均值 sales_gender = current_employees.groupby("gender")['amount'].mean() # 计算内层数据:各性别下有无学位的人数 male_college = current_employees.loc[current_employees['gender'] == 0].groupby("college")["gender"].count().tolist() female_college = current_employees.loc[current_employees['gender'] == 1].groupby("college")["gender"].count().tolist() gender_college = male_college + female_college # 顺序:男有学位、男无学位、女有学位、女无学位 # 修正标签顺序 gender = ["Male", "Female"] gender_college_label = ["Male Degree", "Male No Degree", "Female Degree", "Female No Degree"] plt.figure(figsize=(20, 8)) size = 0.3 plt.rcParams['font.size'] = 9.0 cmap = plt.colormaps["tab20c"] outer_colors = cmap(np.arange(2)*4) # 仅保留2个外层性别颜色 inner_colors = cmap([1, 2, 5, 6]) # 对应4个内层分区的颜色 # 绘制外层饼图,获取楔形对象以提取角度信息 wedges_outer, texts_outer, autotexts_outer = plt.pie( sales_gender, radius=1, colors=outer_colors, wedgeprops=dict(width=size, edgecolor='w'), labels=gender, autopct='%1.1f%%', pctdistance=(1 - size/2), textprops={'fontsize': 12}, counterclock=False, # 统一顺时针绘制,简化角度对齐逻辑 startangle=90 # 从顶部开始绘制,视觉更规整 ) # 分两次绘制内层饼图,分别对齐外层的两个性别区域 # 1. 绘制男性对应的内层分区 plt.pie( male_college, radius=1 - size, colors=inner_colors[:2], wedgeprops=dict(width=size, edgecolor='w'), startangle=wedges_outer[0].theta1, # 对齐外层男性的起始角度 counterclock=False, textprops={'fontsize': 12} ) # 2. 绘制女性对应的内层分区 plt.pie( female_college, radius=1 - size, colors=inner_colors[2:], wedgeprops=dict(width=size, edgecolor='w'), startangle=wedges_outer[1].theta1, # 对齐外层女性的起始角度 counterclock=False, textprops={'fontsize': 12} ) plt.title('Sales Performance by Gender & Number of Gender with degrees or not', fontsize=12, fontweight='bold') # 绑定正确的图例标签 plt.legend(gender_college_label, loc=(0.9, 0.1)) plt.show()
关键优化说明
- 标签数据对齐:修正
gender_college_label顺序,确保与内层数据的分组顺序完全匹配。 - 统一绘制规则:设置
counterclock=False和startangle=90,让内外层饼图的角度计算逻辑一致,避免方向混乱。 - 分块精准嵌入:通过外层楔形的
theta1属性获取对应性别的起始角度,分别绘制内层分区,确保内层完全嵌套在外层对应性别区域内。 - 颜色精简:调整颜色索引,去掉多余的颜色配置,避免视觉混淆。
内容的提问来源于stack exchange,提问作者Jovan Lee
相关产品推荐
相关产品推荐

