多DataFrame子图绘制遇AttributeError报错,求解决方案
问题解决思路
错误原因分析
你遇到的AttributeError本质是对ax对象的误用:
- 当用
plt.subplots(2,3)创建子图时,ax是一个2行3列的numpy数组,每个元素是单个子图的Axes对象 - 但你在循环里执行了
ax = ax.plot(row,col),这行把ax重新赋值成了plot方法返回的线条对象,后续再调用ax.plot自然会报错,因为numpy数组/线条对象没有plot方法
另外代码里还有其他致命问题:
- 循环中把原列表
dataFrameList重新赋值成单个DataFrame,彻底覆盖了原始数据集列表 - 循环变量更新错误:
data +=1是对DataFrame对象做加法,应该是计数器i +=1 plt.show()放在循环内部,会导致每次循环只显示一个子图,无法呈现2x3的布局
修正后的代码
import matplotlib.pyplot as plt import pandas as pd numRows = 2 numCols = 3 figure, ax = plt.subplots(numRows, numCols) i = 0 # 确保dataFrameList里每个元素都是DataFrame(如果导入时已经是,下面的pd.DataFrame可以省略) for data in dataFrameList: # 用新变量存储当前DataFrame,不要覆盖原列表 df = pd.DataFrame(data) # 计算当前子图的行列索引 row = i // numCols col = i % numCols # 获取当前子图的Axes对象 current_ax = ax[row][col] # 在当前子图上绘图,直接用当前df的列 current_ax.plot(df['a'], df['b']) current_ax.set_title(f"DataFrame Name = {i}") # 更新计数器 i += 1 # 调整布局要在所有子图绘制完成后执行 plt.tight_layout() # 只调用一次plt.show()展示所有子图 plt.show()
额外注意事项
- 如果你的
dataFrameList导入时已经是DataFrame对象,那么df = pd.DataFrame(data)这行可以直接去掉,直接用data['a']和data['b'] - 如果子图数量超过DataFrame数量,空白子图可以通过
current_ax.axis('off')来隐藏
内容的提问来源于stack exchange,提问作者Na.Az
相关产品推荐
相关产品推荐

