Jupyter中如何通过for循环正确绘制并显示多个饼图?
问题原因
原代码每次循环调用plt.pie()时,都会在matplotlib默认生成的同一个画布轴对象上覆盖绘制,Jupyter默认只会在单元格执行完成后渲染最终状态的画布,前两次的绘制内容会被后续操作覆盖,因此最终只能看到最后一张饼图。
水平排列多饼图实现方法
要实现三个饼图水平并排展示,最直接的方式是提前通过plt.subplots()创建1行3列的子图布局,循环时将每个饼图绘制到对应的子轴上即可,可直接运行的代码如下:
import matplotlib.pyplot as plt # 创建1行3列的水平排布画布,设置合适尺寸避免内容挤压 fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(15, 4)) labels = ['part_1', 'part_2', 'part_3'] pie_portions = [5, 6, 7] for idx, ax in enumerate(axes): ax.pie(pie_portions, labels=labels, autopct='%1.1f%%') ax.set_title(f'figure_no : {idx+1}') # 自动调整子图间距,避免标题、标签重叠 plt.tight_layout() plt.show()
其他排布需求参考
- 若需要垂直排列子图:将
plt.subplots()参数修改为nrows=3, ncols=1,同时调整画布尺寸为figsize=(4, 12)即可。 - 若需要逐张垂直输出独立饼图(不做并排):在原循环每次绘图结束后增加
plt.show(),强制Jupyter立即渲染当前画布即可,代码示例:
import matplotlib.pyplot as plt for i in range(3): labels = ['part_1','part_2','part_3'] pie_portions = [5,6,7] plt.pie(pie_portions,labels=labels,autopct = '%1.1f%%') plt.title(f'figure_no : {i+1}') plt.show()
注意:这种逐张show()的方式无法实现水平并排效果,仅适合独立图表逐行输出的场景。
内容的提问来源于stack exchange,提问作者Safat Hossain
相关产品推荐
相关产品推荐

