如何通过调整半径消除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
相关产品推荐
相关产品推荐

