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

