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

如何让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()

关键优化说明

  1. 标签数据对齐:修正gender_college_label顺序,确保与内层数据的分组顺序完全匹配。
  2. 统一绘制规则:设置counterclock=False和startangle=90,让内外层饼图的角度计算逻辑一致,避免方向混乱。
  3. 分块精准嵌入:通过外层楔形的theta1属性获取对应性别的起始角度,分别绘制内层分区,确保内层完全嵌套在外层对应性别区域内。
  4. 颜色精简:调整颜色索引,去掉多余的颜色配置,避免视觉混淆。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:06:23