如何在Matplotlib子图饼图中添加网格线?
解决Matplotlib饼图无法显示网格线的问题
问题原因
Matplotlib绘制饼图时,默认会自动隐藏子图的坐标轴(包括轴脊、刻度等元素),而网格线依附于坐标轴存在——没有坐标轴,自然无法显示网格线。你之前调用grid()或修改rcParams的操作之所以无效,核心原因就在这里。
解决方案
要让饼图显示网格线,核心是先恢复子图的坐标轴可见性,再开启网格线。同时可以调整饼图的大小/位置,避免和网格线过度重叠。
以下是优化后的完整代码(同时用循环简化了你原本重复的子图绘制逻辑):
import matplotlib.pyplot as plt import numpy as np # 模拟你的counts_list数据,替换成你自己的数组即可 counts_list = [np.random.randint(1, 10, size=3) for _ in range(8)] fig, axes = plt.subplots(4, 2, figsize=(15, 15)) # 遍历所有子图和对应数据 for ax, counts in zip(axes.flat, counts_list): # 绘制饼图,缩小半径避免和网格重叠 ax.pie(counts, radius=0.8) # 恢复坐标轴可见性(饼图默认会关闭坐标轴) ax.axis('on') # 开启网格线,自定义样式提升可读性 ax.grid(True, linestyle='--', alpha=0.7) # 确保饼图保持圆形比例 ax.set_aspect('equal') plt.tight_layout() plt.show()
关键细节说明
ax.axis('on'):强制显示子图的坐标轴,这是网格线能显示的必要前提;radius=0.8:缩小饼图半径,避免饼图覆盖网格线;linestyle='--', alpha=0.7:将网格线设为虚线并降低透明度,减少对饼图主体的干扰;axes.flat:把二维的axes数组展平为一维,循环遍历更简洁,替代你原本逐个索引子图的冗余写法。
内容的提问来源于stack exchange,提问作者Muhammad Haris
相关产品推荐
相关产品推荐

