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

如何通过调整半径消除Matplotlib多层饼图中间的空白?

解决Matplotlib双层饼图中间空白的问题

你的代码里出现中心空白,是因为内层饼图(大洲分类)的radius减去width后仍大于0,导致中心区域未被填充。要消除空白,只需让内层饼图的内半径为0,同时保证两层饼图无缝衔接。

修改后的可运行代码

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

vals = np.array([[60., 32.], [37., 40.], [29., 10.]])

cmap = plt.get_cmap("tab20c")
outer_colors = cmap(np.arange(3)*4)
inner_colors = cmap([1, 2, 5, 6, 9, 10])

# 内层饼图(大洲):radius等于width,内半径为0,消除中心空白
ax.pie(vals.sum(axis=1), radius=0.9, colors=outer_colors,
       wedgeprops=dict(width=0.9, edgecolor='w'), 
       labels=["Europe","North America","Scandiavia"],
       pctdistance=0.5, labeldistance=0.3)

# 外层饼图(国家):radius为内层radius+width,确保与内层无缝衔接
ax.pie(vals.flatten(), radius=1.8, colors=inner_colors,
       wedgeprops=dict(width=0.9, edgecolor='w'), 
       labels=["Germany","France","USA","Mexico","Finland","Sweden"],
       pctdistance=0.8, labeldistance=0.65)

ax.set(aspect="equal", title='')
plt.show()

关键调整说明

  • 内层饼图参数:将radius设为0.9(与wedgeprops里的width一致),这样内层饼图的覆盖范围是0 ~ 0.9(radius - width = 0),彻底填满中心区域
  • 外层饼图参数:将radius设为1.8(内层radius + 内层width),此时外层饼图的覆盖范围是0.9 ~ 1.8,刚好与内层饼图的外边缘衔接,两层没有间隙
  • 标签位置调整:同步修改labeldistance和pctdistance,适配新的饼图尺寸,避免标签重叠或超出可视范围

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:55:34