7gydF4y2Ba
\ begingroup美元gydF4y2Ba

大家好,地球江南体育网页版科学界,gydF4y2Ba

我是一个初学者Python程序员,试图在我的mac (mac OS Mojave 10.14.6)上绘制从ECMWF ERA5再分析单级数据集中抓取的10米地面风数据的单个时间步。我在底图上的风矢量密度上遇到了一些麻烦,因为我的代码产生的结果图几乎是黑屏。下面是我正在工作的代码。作为说明,该图还显示了一个时间步长的平均海平面压力,我已经能够成功地绘制出这个图。gydF4y2Ba

导入pygrib导入numpy如np导入matplotlib。Pyplot作为PLT从mpl_toolkits。从mpl_toolkits中导入basemap。技术进口shiftgrid  #--------------------------------------------------------------------------------------------- # 有用的链接,我发现这些代码# https://confluence.ecmwf.int/display/CKB/How + +情节+格丽+ + + Python +和+ matplotlib #文件//www.hoelymoley.com/questions/7012/plotting-wind-barbs-in-python  #----------------------------------------------------------------------------------------- 无花果= plt plt.clf()。图(figsize =(10,10)) #--------------------------------------------------------------------------------------------- #设置底图投影的经纬度坐标(默认投影=柱面等距)lllon = -170 lllon = 10 urlon = -110 urlat = 61 #设置经纬度坐标以及绘制经纬度的绘图间隔作为绘图轴latmin=0 latmax=70 lonmin=-180 lonmax=-100 latinterval=20 loninterval=20#--------------------------------------------------------------------------------------------- # 创建基础图和添加一些地理内容为绘图数据创建一个好的起点bmap =基础图(llcrnrlon = lllon llcrnrlat = lllat urcrnrlon = urlon urcrnrlat = urlat分辨率= f, epsg = 3311) bmap.drawcoastlines(线宽= 2,zorder = 1) bmap。Drawstates (linewidth=2,zorder=1) bmap.drawcountries(linewidth=2,zorder=1) bmap.drawlsmask(land_color='white',ocean_color='white',lakes='false',resolution='f')排列(latmin, latmax, latinterval), label = [1,0,0,0],color='k',textcolor='k',linewidth = 2, fonts =14)不等(lonmax铂金生产商lonmin loninterval),标签=[0,0,0,1],颜色=“k”,输入textcolor =“k”,线宽= 2,字形大小= 14 ) #--------------------------------------------------------------------------------------------- # 读ERA5格丽= '下载文件并抓住MSLP值文件。grb ' grbs = pygrib.open(file) grb_mslp = grb_mslp. select()[2] #MSLP for 2012-03-26 @00UTC data = grb_mslp。在Pa值# MSLP值  #--------------------------------------------------------------------------------------------- # 设置绘图参数经度和背阔肌。移动长度,使投影从-180到180(而不是0-360)#使用第一个到最后一个网格点创建均匀间隔的长度。int(grb[Ni]) = 1440 (360/0.25) lons = np.linspace(float(grb_mslp['longitude deoflastgridpointindegrees ']), \ float(grb_mslp['longitude udeoflastgridpointindegrees ']), int(grb_mslp['Ni'])) #使用第一个到最后一个网格点创建均匀间隔的lats。int(grb[Nj]) = 721(180/。25+ 1) lats = np.linspace(float(grb['latitudeOfFirstGridPointInDegrees']), \ float(grb['latitudeOfLastGridPointInDegrees']), int(grb_mslp['Nj']) ) #Grid shifting of lons. Not exactly sure how function works. data, lons = shiftgrid(180., data, lons, start=False) grid_lon, grid_lat = np.meshgrid(lons, lats) #regularly spaced 2D grid. Still not sure how this works. #--------------------------------------------------------------------------------------------- #Plotting MSLP on basemap x,y = bmap(grid_lon,grid_lat) #Pass ERA5 lat/lon to basemap cs = bmap.contour(x,y,data/100,10,colors='r') #Plot MSLP contours. Divide by 100 = mb plt.clabel(cs,inline=1,inline_spacing=5,fontsize=10,fmt='%1.1f') #Add labels to contours #--------------------------------------------------------------------------------------------- #Repeat process for other parameters until I figure out a better method grb_uwind = grbs.select()[0] #U 10m wind component for 2012-03-26 @00UTC grb_vwind = grbs.select()[1] #V 10m wind component for 2012-03-26 @00UTC data_uwind = grb_uwind.values #U 10m wind values in m/s data_vwind = grb_vwind.values #V 10m wind values in m/s #--------------------------------------------------------------------------------------------- #Plotting wind on basemap x,y = bmap(grid_lon,grid_lat) #Pass ERA5 lat/lon to basemap barbs = plt.quiver(x,y,data_uwind,data_vwind) #Plot 10m wind in m/s

我尝试过的唯一解决方案是尝试使用以下符号来绘制每50个数据点:gydF4y2Ba

barbs = plt.quiver(x[::50],y[::50],data_uwind[::50],data_vwind[::50]) #以m/s为单位绘制每50个10m风点gydF4y2Ba

然而,这产生了一张几乎没有结果的地图。有人知道我是如何错误地处理这个问题的吗?最好是尝试猜测和检查不同的值来绘制而不是每50个点?gydF4y2Ba

我真诚地感谢任何关于如何继续进行的建议。感谢您花时间阅读这篇文章。gydF4y2Ba

谷歌Grib文件的驱动器链接:gydF4y2Bahttps://drive.google.com/file/d/1XEuatdp5piyTIiADgZhxFHQ1_WghMwPJ/view?usp=sharinggydF4y2Ba

\ endgroup美元gydF4y2Ba
8gydF4y2Ba
  • \ begingroup美元gydF4y2Ba 你能把你的样本文件放到某个地方以便下载吗?gydF4y2Ba \ endgroup美元gydF4y2Ba
    - - - - - -gydF4y2BagansubgydF4y2Ba
    2020年1月18日3:22gydF4y2Ba
  • 1gydF4y2Ba
    \ begingroup美元gydF4y2Ba 谢谢你的评论!我只是添加了一个谷歌驱动器链接与grib文件。如果有任何问题请告诉我。gydF4y2Ba \ endgroup美元gydF4y2Ba
    - - - - - -gydF4y2BamariandobgydF4y2Ba
    2020年1月18日3:57gydF4y2Ba
  • \ begingroup美元gydF4y2Ba 谢谢。我稍后会看一下除非有人能更快地回答你的问题gydF4y2Ba \ endgroup美元gydF4y2Ba
    - - - - - -gydF4y2BagansubgydF4y2Ba
    2020年1月18日4:07gydF4y2Ba
  • \ begingroup美元gydF4y2Ba 你好,我能够生成风倒钩情节,但我的代码是非常不同的。我使用matplotlib和cartopy,没有底图。gydF4y2Ba \ endgroup美元gydF4y2Ba
    - - - - - -gydF4y2BagansubgydF4y2Ba
    2020年1月18日15:00gydF4y2Ba
  • 1gydF4y2Ba
    \ begingroup美元gydF4y2Ba 你想让我展示使用matplotlib和cartopy的解决方案吗?因为basemap已经被弃用一段时间了,现在每个人都使用cartopygydF4y2Ba \ endgroup美元gydF4y2Ba
    - - - - - -gydF4y2BagansubgydF4y2Ba
    2020年1月18日16:30gydF4y2Ba

1回答gydF4y2Ba1gydF4y2Ba

11gydF4y2Ba
\ begingroup美元gydF4y2Ba

首先,现在很少有人使用Matplotlib中的Basemap。从这个链接gydF4y2Bamatplot基础图gydF4y2Ba

为了支持Cartopy项目,不推荐使用Basemap。请参阅Cartopy, New Management和EoL Announcement中的注释了解更多细节。gydF4y2Ba

所以我们要用gydF4y2BacartopygydF4y2Ba另外用matplotlib绘制您所提供的栅格文件。gydF4y2Ba

在我向你们展示生成图表的代码之前,看看数据结构和它们各自的形状可能会有用。gydF4y2Ba

我们基本上在看四种数据结构,即。gydF4y2Ba

纬度,经度,u和v向量。gydF4y2Ba

文件=“下载”。grib' grbs = pygrib.open(file) for g in grbs: lats, lons = g.latlons() # lats - latitude, lons - longitude lats, lons = np.array(lats), np.array(lons) print(lats.shape) print(lons.shape) print(data_uwind.shape) print(data_vwind.shape)

输出结果如下gydF4y2Ba

(721, 1440)gydF4y2Ba

(721, 1440)gydF4y2Ba

(721, 1440)gydF4y2Ba

(721, 1440)gydF4y2Ba

可以看出,所有的形状都是相等的。其次,我将从grib文件生成纬度和经度数组。gydF4y2Ba

当涉及到用cartopy绘图时我们需要选择agydF4y2Ba投影gydF4y2Ba.就我而言,我选择了Carree餐盘。欢迎您根据您的要求选择其他投影。gydF4y2Ba

因此,我们现在将查看使用pygrib、matplotlib和cartopy的完整代码gydF4y2Ba

导入pygrib导入numpy如np导入matplotlib。Pyplot作为PLT导入cartopy。从cartopy.mpl.ticker导入经度formatter,经度formatter导入sys文件= 'download '。grib' grbs = pygrib.open(file) for g in grbs: lats, lons = g.latlons() # lats - latitude, lons - longitude lats, lons = np.array(lats), np.array(lons) grb_uwind = grbs.select()[0] #U 10m wind component for 2012-03-26 @00UTC grb_vwind = grbs.select()[1] #V 10m wind component for 2012-03-26 @00UTC data_uwind = grb_uwind.values #U 10m wind values in m/s data_vwind = grb_vwind.values #V 10m wind values in m/s print(lons.shape) print(lats.shape) print(data_uwind.shape) print(data_vwind.shape) ax1 = plt.axes(projection=ccrs.PlateCarree(central_longitude=180)) ax1.coastlines() ax1.stock_img() ax1.set_xticks([0, 60, 120, 180, 240, 300, 359.99], crs=ccrs.PlateCarree()) ax1.set_yticks([-90, -60, -30, 0, 30, 60, 90], crs=ccrs.PlateCarree()) lon_formatter = LongitudeFormatter(zero_direction_label=True, number_format='.0f') lat_formatter = LatitudeFormatter() ax1.xaxis.set_major_formatter(lon_formatter) ax1.yaxis.set_major_formatter(lat_formatter) ax1.barbs(lons[::50,::50],lats[::50,::50],data_uwind[::50,::50], data_vwind[::50,::50],transform=ccrs.PlateCarree()) plt.savefig('esse.png') plt.show()

最后是这个情节。如果你想要更大或更小的密度,你可以通过使用Python切片语法来调整你想要在barbs函数中跳过的值的数量,并跳过更少或更多的元素。gydF4y2Ba

在这里输入图像描述gydF4y2Ba

更新gydF4y2Ba

在回复评论中的问题gydF4y2Ba

如果要打印的是什么类型gydF4y2BaggydF4y2Ba在这个for循环中gydF4y2Ba

对于grbs中的g: print(type(g)) lats, lons = g.latlons() # lats - latitude, lons - longitude lats, lons = np.array(lats), np.array(lons)gydF4y2Ba

类“pygrib.gribmessage”gydF4y2Ba

类“pygrib.gribmessage”gydF4y2Ba

类“pygrib.gribmessage”gydF4y2Ba

类“pygrib.gribmessage”gydF4y2Ba

类“pygrib.gribmessage”gydF4y2Ba

所以它是有型的gydF4y2BagribmessagegydF4y2Ba.它打印了5次,这表明在这个GRIB文件中有5条GRIB消息。每个GRIB消息既包含数据也包含元数据。gydF4y2Ba

如果您愿意,可以在一次迭代后退出for循环,因为每个GRIB消息中都包含相同的经度/纬度。gydF4y2Ba

\ endgroup美元gydF4y2Ba
4gydF4y2Ba
  • \ begingroup美元gydF4y2Ba 非常感谢您的详细回复。我想就你的解决方案问你几个问题。看看收集了grib文件数据结构信息的第一部分代码,for循环的目的是什么?具体来说,for循环初始化后的第一行是做什么的?我在这里附上了我的想法:gydF4y2Ba链接gydF4y2Ba.我还想问一下,是否需要将经度数据从0-360移动到-180-180在这里不适用?再次感谢!gydF4y2Ba \ endgroup美元gydF4y2Ba
    - - - - - -gydF4y2BamariandobgydF4y2Ba
    2020年1月20日18:14gydF4y2Ba
  • \ begingroup美元gydF4y2Ba @mariandob我添加了额外的信息。关于你的第二个问题,我不这么认为。gydF4y2Ba \ endgroup美元gydF4y2Ba
    - - - - - -gydF4y2BagansubgydF4y2Ba
    2020年1月21日11:44gydF4y2Ba
  • 1gydF4y2Ba
    \ begingroup美元gydF4y2Ba 谢谢你提供的所有有用的信息。你为我提供了一个学习的好地方。我接受了你的回答。我想对阅读这个答案的任何人提到的唯一一件事是,当从上面链接的grib文件中打印“g”类型时,使用“for”循环@gansub写,5”pygrib。应该打印Messages”,而不是4。gydF4y2Ba \ endgroup美元gydF4y2Ba
    - - - - - -gydF4y2BamariandobgydF4y2Ba
    2020年1月21日12:50gydF4y2Ba
  • 1gydF4y2Ba
    \ begingroup美元gydF4y2Ba @mariandob啊。有时我不能正确地计数:)gydF4y2Ba \ endgroup美元gydF4y2Ba
    - - - - - -gydF4y2BagansubgydF4y2Ba
    2020年1月21日12:53gydF4y2Ba

你的答案gydF4y2Ba

点击“发表您的答案”,即表示您同意我们的gydF4y2Ba服务条款gydF4y2Ba,gydF4y2Ba隐私政策gydF4y2Ba和gydF4y2Ba饼干的政策gydF4y2Ba

不是你想要的答案吗?浏览带标签的其他问题gydF4y2Ba或gydF4y2Ba问自己的问题gydF4y2Ba.gydF4y2Ba