You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:03:29