Как я могу построить отдельные карты данных, используя plt.subplots? - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь построить отдельные карты для шести разных временных шагов моего набора данных. Мой код показан ниже.

import matplotlib.pyplot as plt
import time
import cartopy.crs as ccrs
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
from cartopy.util import add_cyclic_point
import cartopy.feature as cfeature
from netCDF4 import Dataset
import numpy as np

#open dataset
myfile = 'gfs20191010.0p25.nc'
fh = Dataset(myfile, mode='r')

#select variables
h5001 = fh.variables['h5'][0:24,:,:]
h5002 = fh.variables['h5'][25:48,:,:]
h5003 = fh.variables['h5'][49:72,:,:]
h5004 = fh.variables['h5'][73:96,:,:]
h5005 = fh.variables['h5'][97:120,:,:]
h5006 = fh.variables['h5'][121:144,:,:]
lats = fh.variables['lat'][:]
lons = fh.variables['lon'][:]

#take mean of 500mb heights for the first 24 hours
day1 = np.mean(h5001,axis=0)
day2 = np.mean(h5002,axis=0)
day3 = np.mean(h5003,axis=0)
day4 = np.mean(h5004,axis=0)
day5 = np.mean(h5005,axis=0)
day6 = np.mean(h5006,axis=0)

fcst_crs = ccrs.PlateCarree()
fig = plt.figure(figsize=(5,5))

ax0 = plt.axes(projection=ccrs.PlateCarree())
ax0.set_extent([230,300,20,90],ccrs.PlateCarree())
ax0.coastlines()
ax0.add_feature(cfeature.BORDERS)
ax0.add_feature(cfeature.STATES)
ax0.set_title('Mean 500mb Heights (dam)', fontsize=12)
fig = plt.subplot(ax0)

mean1 = fig.contour(lons,lats,day1[0,:,:],levels=60,extend='both',transform=fcst_crs)
mean2 = fig.contour(lons,lats,day2[0,:,:],levels=60,extend='both',transform=fcst_crs)
mean3 = fig.contour(lons,lats,day3[0,:,:],levels=60,extend='both',transform=fcst_crs)
mean4 = fig.contour(lons,lats,day4[0,:,:],levels=60,extend='both',transform=fcst_crs)
mean5 = fig.contour(lons,lats,day5[0,:,:],levels=60,extend='both',transform=fcst_crs)
mean6 = fig.contour(lons,lats,day6[0,:,:],levels=60,extend='both',transform=fcst_crs)

fig1 = plt.contour(mean1, colors = 'black')
fig2 = plt.contour(mean2, colors = 'black')
fig3 = plt.contour(mean3, colors = 'black')
fig4 = plt.contour(mean4, colors = 'black')
fig5 = plt.contour(mean5, colors = 'black')
fig6 = plt.contour(mean6, colors = 'black')

plt.savefig('500mbHGT.png')
plt.show(fig1)
plt.show(fig2)
plt.show(fig3)
plt.show(fig4)
plt.show(fig5)
plt.show(fig6)                                                                                                                                        

Когда я запускаю приведенный выше код, все мои данные отображаются на одной карте. Я попытался внести несколько корректировок на основе документации, представленной здесь: https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.subplots.html Я также попытался использовать несколько примеров кода с использованием подзаговоров для различных целей. Я до сих пор не могу построить отдельные карты, но, насколько я понимаю, подзаговоры - это то, как я должен подходить к этой проблеме, так что, надеюсь, я на правильном пути.

1 Ответ

0 голосов
/ 23 октября 2019

Путем генерации подзаговоров в начале с помощью plt.subplots, например:

import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap

fig, axes = plt.subplots(2, 1)

axes[0].set_title("Hammer projection")
map = Basemap(projection='hammer', lon_0 = 10, lat_0 = 50,           ax=axes[0])

map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color='coral',lake_color='aqua')
map.drawcoastlines()

axes[1].set_title("Robinson projection")
map = Basemap(projection='robin', lon_0 = 10, lat_0 = 50,        ax=axes[1])

map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color='coral',lake_color='aqua')
map.drawcoastlines()

plt.show()
...