循环脚本以生成多个图像
Looping a script to produce multiple images
我有一个 Netcdf 数据集,维度为 [时间、高度、纬度、经度],我用 xarray 打开了它。我写了一个代码,将特定时间戳的所有数据投影到 cartopy 地图上,并将图像保存到我的目录中。我想为每个时间戳创建一个图像,但目前我知道如何做的唯一方法是手动更改时间戳条目并再次 运行 代码。由于有 360 个时间戳,这显然需要一些时间。我知道 Python 对循环很方便,但我对它们很不熟悉,那么有没有一种方法可以将这段代码嵌入一个循环中,这样我就可以一次性保存多张图片?
pv=data1.pv*10000
pv850=pv[:,0,:,:]
lons=pv850.longitude
lats=pv850.latitude
Fig = plt.figure(figsize=[10,8])
ax = plt.axes(projection=ccrs.NorthPolarStereo())
normi = mpl.Normalize(vmin=-1.5, vmax=12)
cs = ax.contourf(lons, lats, pv850[0,:,:], 50,
transform=ccrs.RotatedPole(), extend='both',
cmap='jet')
plt.colorbar(cs)
ax.coastlines()
ax.gridlines(crs=ccrs.Geodetic(), linestyle='--')
theta = np.linspace(0, 2*np.pi, 100)
center, radius = [0.5, 0.5], 0.5
verts = np.vstack([np.sin(theta), np.cos(theta)]).T
circle = mpath.Path(verts * radius + center)
ax.set_boundary(circle, transform=ax.transAxes)
plt.title('Polar Plot 01-01-2018 00:00')
plt.savefig('image1.png')
行ax.contourf(lons, lats, pv850[0,:,:]
控制时间戳,其中'0'对应时间戳条目(范围从0-359)。如果可能的话,我还希望标题中的时间戳随每个情节而变化。最后附上一张最终剧情图
把它放在一个循环中似乎很简单,所以我不确定为什么这么难。不过,您可以尝试以下操作。这里我把一些定义移到了for循环之外,因为你不需要一次又一次地定义它们360次。
theta = np.linspace(0, 2*np.pi, 100)
center, radius = [0.5, 0.5], 0.5
verts = np.vstack([np.sin(theta), np.cos(theta)]).T
circle = mpath.Path(verts * radius + center)
for i in range(360):
Fig = plt.figure(figsize=[10,8])
ax = plt.axes(projection=ccrs.NorthPolarStereo())
normi = mpl.Normalize(vmin=-1.5, vmax=12)
cs = ax.contourf(lons, lats, pv850[i,:,:], 50,
transform=ccrs.RotatedPole(), extend='both',
cmap='jet')
plt.colorbar(cs)
ax.coastlines()
ax.gridlines(crs=ccrs.Geodetic(), linestyle='--')
ax.set_boundary(circle, transform=ax.transAxes)
plt.title('Polar Plot 01-01-2018 00:{:02d}'.format(i))
plt.savefig('image%s.png' %i)
我有一个 Netcdf 数据集,维度为 [时间、高度、纬度、经度],我用 xarray 打开了它。我写了一个代码,将特定时间戳的所有数据投影到 cartopy 地图上,并将图像保存到我的目录中。我想为每个时间戳创建一个图像,但目前我知道如何做的唯一方法是手动更改时间戳条目并再次 运行 代码。由于有 360 个时间戳,这显然需要一些时间。我知道 Python 对循环很方便,但我对它们很不熟悉,那么有没有一种方法可以将这段代码嵌入一个循环中,这样我就可以一次性保存多张图片?
pv=data1.pv*10000
pv850=pv[:,0,:,:]
lons=pv850.longitude
lats=pv850.latitude
Fig = plt.figure(figsize=[10,8])
ax = plt.axes(projection=ccrs.NorthPolarStereo())
normi = mpl.Normalize(vmin=-1.5, vmax=12)
cs = ax.contourf(lons, lats, pv850[0,:,:], 50,
transform=ccrs.RotatedPole(), extend='both',
cmap='jet')
plt.colorbar(cs)
ax.coastlines()
ax.gridlines(crs=ccrs.Geodetic(), linestyle='--')
theta = np.linspace(0, 2*np.pi, 100)
center, radius = [0.5, 0.5], 0.5
verts = np.vstack([np.sin(theta), np.cos(theta)]).T
circle = mpath.Path(verts * radius + center)
ax.set_boundary(circle, transform=ax.transAxes)
plt.title('Polar Plot 01-01-2018 00:00')
plt.savefig('image1.png')
行ax.contourf(lons, lats, pv850[0,:,:]
控制时间戳,其中'0'对应时间戳条目(范围从0-359)。如果可能的话,我还希望标题中的时间戳随每个情节而变化。最后附上一张最终剧情图
把它放在一个循环中似乎很简单,所以我不确定为什么这么难。不过,您可以尝试以下操作。这里我把一些定义移到了for循环之外,因为你不需要一次又一次地定义它们360次。
theta = np.linspace(0, 2*np.pi, 100)
center, radius = [0.5, 0.5], 0.5
verts = np.vstack([np.sin(theta), np.cos(theta)]).T
circle = mpath.Path(verts * radius + center)
for i in range(360):
Fig = plt.figure(figsize=[10,8])
ax = plt.axes(projection=ccrs.NorthPolarStereo())
normi = mpl.Normalize(vmin=-1.5, vmax=12)
cs = ax.contourf(lons, lats, pv850[i,:,:], 50,
transform=ccrs.RotatedPole(), extend='both',
cmap='jet')
plt.colorbar(cs)
ax.coastlines()
ax.gridlines(crs=ccrs.Geodetic(), linestyle='--')
ax.set_boundary(circle, transform=ax.transAxes)
plt.title('Polar Plot 01-01-2018 00:{:02d}'.format(i))
plt.savefig('image%s.png' %i)