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

如何在matplotlib中拆分饼图并保留autopct生成的数值

双饼图拆分实现方案

完全可以实现,针对你这种单分类占比极高、剩余分类数值过小无法在单饼图展示的场景,并排双饼图是可读性最高的实现方式,可完整保留autopct百分比标注,不需要改动原始数据源结构。

核心实现逻辑

  • 从原始数据中单独拆分出中国的病例数值,将剩余20个国家的数值归为一组,作为第一个整体占比饼图的数据源
  • 将剩余20个国家的病例数值单独作为第二个饼图的数据源,放大展示这部分小数值的内部占比
  • 两个子图横向并排排布,分别添加标题、百分比标注和对应图例,避免元素重叠

可直接运行的修改后代码

import matplotlib.pyplot as plt

# 从原始记录中拆分中国与其他国家数据
china_case_num = 0
other_case_values = []
other_case_labels = []

for record in country_records:
    if record.name == "中国":
        china_case_num = record.cases
    else:
        other_case_values.append(record.cases)
        other_case_labels.append(record.name)

# 创建1行2列的子图布局,设置画布尺寸避免挤压
fig, (ax_total, ax_other) = plt.subplots(1, 2, figsize=(14, 6))

# 绘制第一个饼图:展示全球整体占比
total_dataset = [china_case_num, sum(other_case_values)]
total_labels = ["中国", "其他国家/地区合计"]
ax_total.pie(
    total_dataset,
    labels=total_labels,
    autopct='%.1f%%',
    startangle=90
)
ax_total.set_title("全球新冠病例总占比")

# 绘制第二个饼图:展示非中国国家的内部占比
ax_other.pie(
    other_case_values,
    labels=other_case_labels,
    autopct='%.1f%%',
    startangle=90
)
ax_other.set_title("非中国地区病例占比分布")
ax_other.legend(loc="upper right", bbox_to_anchor=(1.6, 1.1))

# 自动调整子图间距
plt.tight_layout()
plt.show()

可选调整说明

  • 如果你需要第二个饼图的百分比显示为「占全球总病例的比例」而非「占非中国病例的比例」,只需要自定义autopct的计算函数,将每个国家的病例数除以全球总病例数后格式化输出即可
  • 如果不想要并排双图,也可以实现嵌套子母饼图:主饼图展示中国+其他国家合计占比,在主饼图旁拉出一个小半径的子饼图展示其他国家的细分占比,但对于20个分类的场景,并排双图的可读性远高于嵌套饼图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 06:24:29