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

如何在while循环中遍历matplotlib子图的坐标轴进行绘图?

Matplotlib子图循环切换行的问题解决

问题描述

作为Python新手,我写了一段基于while循环的绘图代码,单独绘图功能正常,但用subplots绘制3x3子图时,每次循环都在第一行重复绘制。希望实现变量i、j、l、m递增时,绘图自动切换到子图的下一行。尝试在while循环内加for循环,问题依旧。

原代码:

import matplotlib.pyplot as plt
import xarray as xr
file="/home/arjun2516/hlrn/JOBS/cy_topo_ref4hr2/OUTPUT/cy_topo_ref4hr2_av_3d.002.nc"
Data=xr.open_dataset(file)

l=150
m=300
i = 75
j = 175
while i and j < 700 and l and m < 800 :
    fig,axs = plt.subplots(ncols=3, nrows=3,figsize=(20,20))
    Data.zusi[i:j,75:175].plot.contourf(ax=axs[0,0])
    print(i,j)
    # plt.show()
    Data.zusi[l:m,250:400].plot.contourf(ax=axs[0,1])
    #  plt.show()
    Data.zusi[l:m,450:600].plot.contourf(ax=axs[0,2])
    # plt.show()
    i += 200
    j += 200
    l += 200
    m += 200
    print(i,j)
print('ok')

问题分析

  1. 重复创建画布:fig,axs = plt.subplots(...)放在while循环内部,每次循环都会生成新的3x3子图画布,导致之前的绘图被覆盖,始终只显示新画布的第一行。
  2. 循环条件错误:i and j <700的写法逻辑错误,Python会先判断i是否为非0值(永远为真),再判断j<700,实际应该同时判断所有变量的范围。
  3. 无行索引跟踪:没有变量记录当前要绘制的子图行,始终固定使用axs[0,*],导致一直画第一行。

修正后的代码

import matplotlib.pyplot as plt
import xarray as xr

file="/home/arjun2516/hlrn/JOBS/cy_topo_ref4hr2/OUTPUT/cy_topo_ref4hr2_av_3d.002.nc"
Data=xr.open_dataset(file)

# 初始化变量
l=150
m=300
i = 75
j = 175
row = 0  # 跟踪当前子图的行索引

# 只创建一次3x3的子图布局
fig, axs = plt.subplots(ncols=3, nrows=3, figsize=(20,20))

# 修正循环条件,确保所有变量都在范围内,同时限制行索引不超过子图行数
while i < 700 and j < 700 and l < 800 and m < 800 and row < 3:
    # 使用当前行索引绘制子图
    Data.zusi[i:j,75:175].plot.contourf(ax=axs[row, 0])
    Data.zusi[l:m,250:400].plot.contourf(ax=axs[row, 1])
    Data.zusi[l:m,450:600].plot.contourf(ax=axs[row, 2])
    
    print(f"当前行: {row+1}, i={i}, j={j}")
    
    # 更新变量
    i += 200
    j += 200
    l += 200
    m += 200
    row += 1  # 切换到下一行

plt.tight_layout()  # 自动调整子图间距
plt.show()
print('ok')

关键修改点

  • 画布只创建一次:将plt.subplots()移到while循环外,确保所有绘图都在同一个3x3子图布局中进行。
  • 修正循环条件:改为i <700 and j <700 and l <800 and m <800,同时增加row <3防止子图行索引越界。
  • 新增行索引变量:用row变量记录当前绘制的行,每次循环后自增,实现切换子图行的功能。
  • 添加布局调整:用plt.tight_layout()自动调整子图间距,避免标签重叠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:10:47