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

如何在matplotlib中为不同尺寸的饼图设置相等间距

不同尺寸饼图等间距排布解决方案

问题原因

你用plt.subplots创建的5个子图是等分画布宽度的,每个子图的可用区域大小一致,但你给每个饼设置的半径不同,饼图的实际占位会随半径变化,subplots_adjust和tight_layout仅能调整子图之间的空白距离,无法适配子图内部不同大小的饼图,自然无法实现饼外轮廓等间距,同时你设置的饼半径过大超出子图边界,也会导致tight_layout调整失败报错。

解决方案

放弃等分的子图布局,直接在同一个坐标轴上手动控制每个饼的中心坐标和半径,通过计算保证相邻饼的轮廓间距完全相等,实现代码如下:

import matplotlib.pyplot as plt

labels = 'Verkehr', 'Maschinen und Motoren', 'Feuerungen', 'Industrie / Gewerbe', 'Land- und Forstwirtschaft'
# 所有饼图的数值整合为列表方便遍历
sizes_list = [
    [108295, 10107, 7220, 11551, 7220],
    [77882, 6676, 6676, 13351, 6676],
    [55652, 4417, 6184, 15900, 6184],
    [36327, 2642, 4632, 16512, 5944],
    [18781, 1409, 3287, 1878, 4695]
]
colors = ('red', 'darkblue', 'orange', 'yellow', 'green')
# 沿用你原来的饼图半径设置
radii = [4, 0.77*4, 0.61*4, 0.46*4, 0.33*4]
# 自定义相邻饼外轮廓的间距,可按需修改数值调整间距大小
gap = 0.8

# 创建单张画布和坐标轴
fig = plt.figure(figsize=(20, 8))
ax = fig.add_subplot(111)
# 设置坐标轴等比例避免饼图变形,隐藏不需要的坐标轴刻度
ax.axis('equal')
ax.set_axis_off()

# 计算每个饼的中心x坐标,保证相邻饼轮廓间距等于gap
current_x = radii[0] + 0.5  # 第一个饼的x中心,预留0.5单位左边距
x_centers = [current_x]
for i in range(1, len(radii)):
    current_x += radii[i-1] + gap + radii[i]
    x_centers.append(current_x)

# 批量绘制所有饼图
for sizes, r, x_pos in zip(sizes_list, radii, x_centers):
    ax.pie(sizes, startangle=0, colors=colors, radius=r, center=(x_pos, 0))

# 调整画布显示范围,适配所有饼的尺寸,避免截断
plt.xlim(0, current_x + radii[-1] + 0.5)
plt.ylim(-max(radii)-0.5, max(radii)+0.5)
plt.show()

参数调整说明

  • 如需修改饼图间距,直接调整gap的数值即可,数值越大间距越宽
  • 调整figsize的第二个参数(当前为8)可以修改画布高度,避免饼图上下被截断
  • 代码中0.5的边距数值可按需修改,适配你需要的左右、上下留白大小

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:24:03