python - 循环创建子图/Python

标签 python loops cartopy

我在创建子图循环时遇到了一些问题。

以下代码显示了我对一个图的结果......因此它以日循环而不是小时循环(8 个时间步长)开始。

如果我运行代码,我会得到一个带有颜色条的漂亮 QUiver 图。

for dd in range(1,15):
  day=str(dd)
  readfile=fns[files_indizes[dd]]
  if dd < 10:
      nc_u_comp = NetCDFFile(ROOT+u_comp1+'0'+day+comp)
      nc_v_comp = NetCDFFile(ROOT+v_comp1+'0'+day+comp)
  else:
      nc_u_comp = NetCDFFile(ROOT+u_comp1+day+comp)
      nc_v_comp = NetCDFFile(ROOT+v_comp1+day+comp)

  time = nc_u_comp.variables['time'][:]

  index=readfile.find(comp)
  index=index+len(comp)
  date=readfile[index-14:index-6]
  plt.clf()

  for tt in range(0,len(time)):
      if tt < 10:
          h =str(0)+str(tt)
      else:
          h=str(tt)

      varU=nc_u_comp.variables['u10'][tt,:,:]
      varV=nc_v_comp.variables['v10'][tt,:,:]
      lat = nc_u_comp.variables['latitude'][:]
      lon = nc_u_comp.variables['longitude'][:]

      plt.rcParams["figure.figsize"] = [10,10]
      #plane projection of the world
      #map with box size (defintion on the top)
      box = sgeom.box(minx=llcrnrlon, maxx=urcrnrlon, miny=llcrnrlat, maxy=urcrnrlat)
      x0, y0, x1, y1 = box.bounds

      #Map plot. The middel of the map is central_longitude 
      #proj = ccrs.PlateCarree(central_longitude=0)
      proj=ccrs.PlateCarree()

      #Change middelpoint of the map
      box_proj = ccrs.PlateCarree(central_longitude=0)


      ax2 = plt.axes(projection=proj)
      ax2.set_extent([x0, x1, y0, y1], box_proj)
      ax2.add_feature(cartopy.feature.BORDERS, linestyle='-', alpha=.5)
      ax2.coastlines(resolution='50m')

      #Definition of the scale_bar
      gl = ax2.gridlines(ccrs.PlateCarree(), \
                      linestyle='--', alpha=1, linewidth=0.5, draw_labels=True)
      gl.xlabels_top = False
      gl.ylabels_right = False
      gl.xformatter = LONGITUDE_FORMATTER
      gl.yformatter = LATITUDE_FORMATTER

      magnitude = (varU ** 2 + varV ** 2) ** 0.5
      strm =plt.streamplot(lon , lat , varU, varV, linewidth=2, density=2, color=magnitude)
      cbar= plt.colorbar()
      cbar.set_label('$m/s$')
      name='Wind in 10 m '+ date + h+' UTC'
      ax2.set_aspect('auto')
      plt.title(name, y=1)

现在我想创建一个 2x4 子图数组,并将颜色条分配给完整的子图数组。

我在互联网上找到了一些信息,但它不能与我的代码一起运行。也许有人可以帮助我?

最佳答案

这展示了如何绘制 4 行 2 列的简单 Cartopy map 数组。还展示了如何绘制颜色条以配合 map 数组。希望对您有所帮助。

import numpy as np
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import matplotlib as mpl

# create figure with figsize big enough to accomodate all maps, labels, etc.
fig = plt.figure(figsize=(8, 10), tight_layout=False)

# define plot array's arrangement
columns = 2
rows = 4
# set projection to use
projex = ccrs.PlateCarree()

# set the colormap and norm for
# the colorbar to use
cmap1 = mpl.cm.magma
norm1 = mpl.colors.Normalize(vmin=0, vmax=100)

def plotmymap(axs):
    # your plot specs of each map should replace this
    img = np.random.randint(100, size=(15, 30))  # 2d array of random values (1-100)
    # render image on current axis
    plims = plt.imshow(img, extent=[-180,180,-90,90], alpha=0.5, cmap=cmap1, norm=norm1)
    axs.set_global()
    axs.coastlines()
    # add title to the map
    axs.set_title("Map_"+str(i))
    return plims  # for use by colorbar

for i in range(1, columns*rows +1):
    # add a subplot into the array of plots
    ax = fig.add_subplot(rows, columns, i, projection=projex)
    plims = plotmymap(ax)  # a simple maps is created on subplot

# add a subplot for vertical colorbar
bottom, top = 0.1, 0.9
left, right = 0.1, 0.8
fig.subplots_adjust(top=top, bottom=bottom, left=left, right=right, hspace=0.15, wspace=0.25)
cbar_ax = fig.add_axes([0.85, bottom, 0.05, top-bottom])
fig.colorbar(plims, cax=cbar_ax)  # plot colorbar

plt.show()  # this plot all the maps

结果图:

map_array

关于python - 循环创建子图/Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51481536/

相关文章:

javascript - 带有循环和var的多个元素的jQuery切换类

python - 使用 ccrs.epsg() 使用 EPSG 4326 坐标系绘制邮政编码周长形状文件

python - Cartopy map 可视化错误: unknown projection

python - 如何比较两个 Dataframe 并更新其中一个 Dataframe 中的特定列?

python - 结合 ctypes 和 swig

python - 通过 "for"循环(即 "for x in list:")访问列表时,有没有办法在同一循环中访问列表中的 "x+1"项?

python - 如何使用 matplotlib 在 cartopy 极地立体图中获得平滑的网格线?

python - 在Python中使用外部图像

python - 如何按降序打印频率?

java - 使用嵌套扫描仪检查空白输入,但必须按两次 [Return] 键