7gydF4y2Ba
\ begingroup美元gydF4y2Ba

你好地球科学江南体育网页版社区,gydF4y2Ba

我是一个初学者Python程序员试图阴谋一个时间步长10米表面风从ECMWF ERA5我抓起的数据再分析单一数据集在Python 3.8.1 mac (mac OS莫哈韦10.14.6)。我有一些麻烦,我技术上的风矢量图的密度,从我的代码产生的情节附近产生一个黑色屏幕。下面是我在工作的代码。注意,情节也会显示平均海平面压力从一个时间步,我已经能够情节这成功。gydF4y2Ba

进口pygrib进口numpy np matplotlib导入。pyplot mpl_toolkits plt。技术从mpl_toolkits进口技术。技术进口shiftgrid # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #有用链接https://confluence.ecmwf.int/display/CKB/How,我发现这些代码# + +和+ +情节+格丽+文件Python +和+ matplotlib # //www.hoelymoley.com/questions/7012/plotting-wind-barbs-in-python # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - plt.clf()图= plt。图(figsize =(10,10)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #设置基础图的纬度/经度坐标投影(默认投影=圆柱equadistant) lllon = -170 lllat = 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(线宽= 2,zorder = 1) bmap.drawcountries(线宽= 2,zorder = 1) bmap.drawlsmask (land_color =‘白’,ocean_color =‘白’,湖泊=‘假’,分辨率= f) bmap.drawparallels (np。不等(latmin latmax latinterval),标签=(1,0,0,0),颜色=“k”,输入textcolor =“k”,线宽= 2,字形大小= 14)bmap.drawmeridians (np。不等(lonmax铂金生产商lonmin loninterval),标签=[0,0,0,1],颜色=“k”,输入textcolor =“k”,线宽= 2,字形大小= 14)# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #读ERA5格丽= '下载文件并抓住MSLP值文件。格丽的grb = pygrib.open(文件)grb_mslp = grbs.select () [2] # MSLP 2012-03-26 = grb_mslp @00UTC数据。值# MSLP值在Pa # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #设置绘图参数经度和背阔肌。转变朗投影是-180年到180年(0 - 360)#创建均匀间隔的使用,网格点的经度。int (grb (Ni)) = 1440(360/0.25)朗= np.linspace(浮动(grb_mslp [' longitudeOfFirstGridPointInDegrees ']), \浮动(grb_mslp [' longitudeOfLastGridPointInDegrees ']), int (grb_mslp['倪']))#创建等间距的背阔肌使用的第一个网格点。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

倒刺= plt.quiver (x (:: 50), y (:: 50), data_uwind [:: 50], data_vwind[:: 50]) #情节每50 10 m风m / sgydF4y2Ba

但是这个结果没有几乎没有地图。会有人有一个想法,我怎么可能接近这个问题不正确?会是最好的试着猜和检查各种值情节而不是每50点?gydF4y2Ba

我衷心地感谢任何建议如何继续。谢谢你花时间读这篇文章。gydF4y2Ba

Google Drive格丽文件链接:gydF4y2Bahttps://drive.google.com/file/d/1XEuatdp5piyTIiADgZhxFHQ1_WghMwPJ/view?usp=sharinggydF4y2Ba

\ endgroup美元gydF4y2Ba
8gydF4y2Ba
  • \ begingroup美元gydF4y2Ba 你能把你的样品格丽文件的地方,这样它可以下载吗?gydF4y2Ba \ endgroup美元gydF4y2Ba
    - - - - - -gydF4y2BagansubgydF4y2Ba
    2020年1月18日,22gydF4y2Ba
  • 1gydF4y2Ba
    \ begingroup美元gydF4y2Ba 谢谢你的评论!我只是添加了一个Google Drive与一种文件格式文件。让我知道如果你有任何问题。gydF4y2Ba \ endgroup美元gydF4y2Ba
    - - - - - -gydF4y2BamariandobgydF4y2Ba
    2020年1月18日在3:57gydF4y2Ba
  • \ begingroup美元gydF4y2Ba 谢谢。我以后再看一看它,除非有人更快达到你的问题gydF4y2Ba \ endgroup美元gydF4y2Ba
    - - - - - -gydF4y2BagansubgydF4y2Ba
    2020年1月18日,在开场后gydF4y2Ba
  • \ begingroup美元gydF4y2Ba 你好我是能够产生风倒刺情节但我的代码是非常不同的。我使用matplotlib cartopy和没有技术。gydF4y2Ba \ endgroup美元gydF4y2Ba
    - - - - - -gydF4y2BagansubgydF4y2Ba
    2020年1月18日15时gydF4y2Ba
  • 1gydF4y2Ba
    \ begingroup美元gydF4y2Ba 你想让我展示我的解决方案,使用matplotlib和cartopy吗?因为现在技术已经弃用了一段时间,每个人都使用cartopygydF4y2Ba \ endgroup美元gydF4y2Ba
    - - - - - -gydF4y2BagansubgydF4y2Ba
    2020年1月18日下午gydF4y2Ba

1回答gydF4y2Ba1gydF4y2Ba

重置为默认gydF4y2Ba
11gydF4y2Ba
\ begingroup美元gydF4y2Ba

首先从Matplotlib很少人使用技术。从这个链接gydF4y2Bamatplot基础图gydF4y2Ba

技术是不赞成赞成Cartopy项目。在Cartopy看到笔记,新的管理,EoL宣布更多的细节。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

作为一个能使所有的形状都是平等的。其次我生成纬度和经度数组从一种文件格式文件。gydF4y2Ba

当涉及到策划cartopy我们需要选择一个gydF4y2Ba投影gydF4y2Ba。在我的例子中我选择板Carree。欢迎您选择另一个投影取决于您的需求。gydF4y2Ba

所以现在我们将看看完整的代码使用pygrib matplotlib和cartopygydF4y2Ba

进口pygrib进口numpy np matplotlib导入。pyplot plt cartopy进口。crs cartopy.mpl ccr自己。股票行情自动收录器进口LongitudeFormatter LatitudeFormatter sys文件导入= '下载。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切片语法和跳过较小或更多的元素。gydF4y2Ba

在这里输入图像描述gydF4y2Ba

更新gydF4y2Ba

在评论中回应的问题gydF4y2Ba

如果一个实际输出的类型是什么gydF4y2BaggydF4y2Ba在for循环gydF4y2Ba

伽马射线爆的g:打印(类型(g))背阔肌,朗= g.latlons() #拉特-纬度,经度,经度背阔肌,朗= np.array(背阔肌),np.array(朗)gydF4y2Ba

类“pygrib.gribmessage”gydF4y2Ba

类“pygrib.gribmessage”gydF4y2Ba

类“pygrib.gribmessage”gydF4y2Ba

类“pygrib.gribmessage”gydF4y2Ba

类“pygrib.gribmessage”gydF4y2Ba

所以它的类型gydF4y2BagribmessagegydF4y2Ba。事实上它打印五次指出的事实有五格丽格丽文件的消息。每一种文件格式消息包含两个数据和元数据。gydF4y2Ba

你可以如果你希望退出for循环迭代后由于同一经度/纬度是包含在每一种文件格式的信息。gydF4y2Ba

\ endgroup美元gydF4y2Ba
4gydF4y2Ba
  • \ begingroup美元gydF4y2Ba 非常感谢你的详细回复。我想问你几个问题关于你的解决方案。查看代码的第一部分,您收集的信息数据结构的一种文件格式文件,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 谢谢你所有的有用的信息。你给我提供了一个学习的好地方。我接受你的答案。唯一我想说对于任何读这答案是,当打印类型的“g”从一种文件格式文件上面链接,使用for循环@gansub写道,pygrib 5”。信息”应印刷而不是4。gydF4y2Ba \ endgroup美元gydF4y2Ba
    - - - - - -gydF4y2BamariandobgydF4y2Ba
    2020年1月21日,在中午gydF4y2Ba
  • 1gydF4y2Ba
    \ begingroup美元gydF4y2Ba @mariandob啊。有时候我不能正确计数:)gydF4y2Ba \ endgroup美元gydF4y2Ba
    - - - - - -gydF4y2BagansubgydF4y2Ba
    2020年1月21日12:53gydF4y2Ba

你的答案gydF4y2Ba

通过点击“发布你的答案”,你同意我们gydF4y2Ba服务条款gydF4y2Ba并承认您已阅读并理解我们的gydF4y2Ba隐私政策gydF4y2Ba和gydF4y2Ba的行为准则gydF4y2Ba。gydF4y2Ba

不是你要找的答案?浏览其他问题标记gydF4y2Ba或gydF4y2Ba问你自己的问题gydF4y2Ba。gydF4y2Ba