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

