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

for循环生成matplotlib子图报错:numpy.ndarray对象无plot属性

错误原因
  • 调用plt.subplots(3, (measurements+2)//3)创建的是3行3列的子图网格,此时返回的axs是形状为(3, 3)的二维numpy数组,而非一维的子图对象数组
  • 代码中直接写axs[0].plot()时,axs[0]取到的是第一行3个子图组成的数组,不是单个Axes绘图对象,自然没有plot方法
  • 之前生成3个子图时运行正常,是因为当时子图为3行1列或1行3列的单维布局,axs本身就是一维数组,按索引取到的就是单个Axes对象
修正方案

先将二维的axs数组展平为一维,再按索引匹配对应的子图和DataFrame,同时可以将所有dfrld存入列表简化重复代码:

measurements = 9
# 将所有dfrld存入列表,避免重复写9次调用代码
dfrld_list = [dfrld_1, dfrld_2, dfrld_3, dfrld_4, dfrld_5, dfrld_6, dfrld_7, dfrld_8, dfrld_9]
fig, axs = plt.subplots(3,(measurements+2)//3, sharey=False, gridspec_kw={'wspace': 0.1},figsize =(20, 10))
# 将二维子图数组按行展平为一维,顺序为第一行左到右、第二行左到右、第三行左到右
axs_flat = axs.flatten()

for i in range(measurements):
    current_ax = axs_flat[i]
    current_dfrld = dfrld_list[i]
    try:
        # 注意:列名从1开始,所以需要i+1匹配列名
        current_ax.plot(current_dfrld[f'RLD date({i+1})'], current_dfrld['Depth'], lw=2, color=next(red1))
    except KeyError:
        pass
plt.show()

如果不想展平数组,也可以直接通过行、列索引定位子图,替换current_ax = axs_flat[i]为:

row_idx = i // 3
col_idx = i % 3
current_ax = axs[row_idx, col_idx]

两种写法效果完全一致。

内容的提问来源于stack exchange,提问作者Etiende

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:24:05