Python使用subplot绘制多幅饼图报错AttributeError如何解决?
报错原因说明
你遇到的'numpy.ndarray' object has no attribute 'pie'报错,是因为调用plt.subplots(3,2)生成的子图对象是一个shape为(3,2)的二维numpy数组,存储了所有子图的Axes实例,不能直接对整个数组调用pie()方法,需要先索引到单个子图的Axes对象再执行绘制操作。
注意Python2.7兼容的matplotlib最高版本为2.2.x,若运行代码出现版本相关报错可先确认matplotlib版本符合要求
3行2列饼图排布实现代码
# -*- coding: utf-8 -*- import matplotlib.pyplot as plt # 替换为你自己的6组饼图数据 pie_datasets = [ [35, 25, 40], [15, 55, 30], [20, 30, 50], [45, 25, 30], [10, 60, 30], [30, 35, 35] ] # 饼图公共配置,可根据需求修改 pie_labels = ['分类1', '分类2', '分类3'] pie_autopct = '%1.1f%%' # 创建画布与3行2列子图 fig, axes = plt.subplots(nrows=3, ncols=2, figsize=(9, 12)) # 将二维子图数组展平为一维,方便批量遍历 axes = axes.flatten() # 循环遍历绘制所有饼图 for idx in range(len(pie_datasets)): axes[idx].pie(pie_datasets[idx], labels=pie_labels, autopct=pie_autopct) axes[idx].set_title('第{}组数据分布'.format(idx + 1)) # 自动调整子图间距避免内容重叠 plt.tight_layout() plt.show()
代码简化建议
- 将所有饼图的数据源统一存入列表批量遍历,避免重复编写6次独立的饼图绘制逻辑
- 调用
flatten()方法将二维子图数组转为一维,省略嵌套循环定位子图的步骤 - 饼图的公共参数(标签、百分比格式、颜色等)统一提取为变量,无需每次调用
pie()时重复传参 - 后续需要调整所有饼图的样式时,直接在循环内修改一次即可,不用逐个子图调整
内容的提问来源于stack exchange,提问作者getting it
相关产品推荐
相关产品推荐

