数据不适合底图
Data not fitted to Basemap
当我尝试使用 Grib 文件中的底图绘制数据时,地图不适合正在绘制的数据。我将下面使用的代码和 link 发布到下面的输出图像中。我认为投影类型可能是问题所在。
我还尝试使投影成为圆柱形,同时保持其余代码相同,但这也不起作用(虽然它看起来好一点),我也为此向输出图像发布了一个 link 。也许这有助于可视化哪些投影适合数据?
对于您认为可能出错的任何想法,我们将不胜感激。
from pprint import pprint
import pygrib
from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from ncepgrib2 import Grib2Decode
file = 'hrrr.t00z.wrfsfcf00.grib2'
gr = pygrib.open(file)
msg = gr[32] #Temperature values in Kelvin
#print(Grib2Decode(msg.tostring(),gribmsg=True))#Similar to printing all info for netCDF file
Temp = msg.values
lat, lon = msg.latlons()
m=Basemap(projection='lcc',llcrnrlon=lon.min(), \
urcrnrlon=lon.max(),llcrnrlat=lat.min(),urcrnrlat=lat.max(), \
lat_0 = float(msg['latitudeOfFirstGridPointInDegrees']),lon_0 =float(msg['longitudeOfFirstGridPointInDegrees']) ,resolution='c')
x,y = m(lon,lat)
#m = Basemap(width=11297120.0,height=8959788.0,
# resolution='c',projection='lcc',\
# lat_ts=40,lat_0=lat_0,lon_0=lon_0)
fig = plt.figure(figsize = (18.6,10.5))
cs = m.pcolormesh(x,y,(Temp-273.15)*9/5 +32,cmap = plt.cm.jet)
m.drawcoastlines()
m.drawstates()
m.drawcountries()
plt.colorbar(cs,orientation='vertical')
plt.title('Temperature F')
plt.savefig('plot')
plt.show()
Image of output using lcc projection
Image of output using cylindrical projection
Link to HRRR data containing Grib file. All are in the exact same format, projection, etc... so you could download any one of them and get the same results (just different Temperature values)
有多种方法可以解决您的问题:
- 设置 xlim 和 ylim,这对您来说是最简单的方法:
plt.xlim([min_lon, max_lon])
plt.ylim([min_lat, max_lat])
- 使用cfgrib+xarray直接从xarray对象中绘图
当我尝试使用 Grib 文件中的底图绘制数据时,地图不适合正在绘制的数据。我将下面使用的代码和 link 发布到下面的输出图像中。我认为投影类型可能是问题所在。 我还尝试使投影成为圆柱形,同时保持其余代码相同,但这也不起作用(虽然它看起来好一点),我也为此向输出图像发布了一个 link 。也许这有助于可视化哪些投影适合数据? 对于您认为可能出错的任何想法,我们将不胜感激。
from pprint import pprint
import pygrib
from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from ncepgrib2 import Grib2Decode
file = 'hrrr.t00z.wrfsfcf00.grib2'
gr = pygrib.open(file)
msg = gr[32] #Temperature values in Kelvin
#print(Grib2Decode(msg.tostring(),gribmsg=True))#Similar to printing all info for netCDF file
Temp = msg.values
lat, lon = msg.latlons()
m=Basemap(projection='lcc',llcrnrlon=lon.min(), \
urcrnrlon=lon.max(),llcrnrlat=lat.min(),urcrnrlat=lat.max(), \
lat_0 = float(msg['latitudeOfFirstGridPointInDegrees']),lon_0 =float(msg['longitudeOfFirstGridPointInDegrees']) ,resolution='c')
x,y = m(lon,lat)
#m = Basemap(width=11297120.0,height=8959788.0,
# resolution='c',projection='lcc',\
# lat_ts=40,lat_0=lat_0,lon_0=lon_0)
fig = plt.figure(figsize = (18.6,10.5))
cs = m.pcolormesh(x,y,(Temp-273.15)*9/5 +32,cmap = plt.cm.jet)
m.drawcoastlines()
m.drawstates()
m.drawcountries()
plt.colorbar(cs,orientation='vertical')
plt.title('Temperature F')
plt.savefig('plot')
plt.show()
Image of output using lcc projection Image of output using cylindrical projection Link to HRRR data containing Grib file. All are in the exact same format, projection, etc... so you could download any one of them and get the same results (just different Temperature values)
有多种方法可以解决您的问题:
- 设置 xlim 和 ylim,这对您来说是最简单的方法:
plt.xlim([min_lon, max_lon])
plt.ylim([min_lat, max_lat])
- 使用cfgrib+xarray直接从xarray对象中绘图