如何在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
相关产品推荐
相关产品推荐

