基于Python的Grib數據可視化
利用Python語言實現Grib數據可視化主要依靠三個庫——pygrib、numpy和matplotlib。pygrib是歐洲中期天氣預報中心(ECMWF)的GRIG API C庫的Python接口,通過這個庫可以將Grib數據讀取出來;numpy是Python的一種開源的數值計算擴展,這種工具可用來存儲和處理大型矩陣;matplotlib是python著名的繪圖庫,它提供了一整套和matlab相似的命令API,十分適合交互式地進行制圖;在數據可視化過程中,我們常需要將數據在地圖上畫出來,所以還需要matplotlib的一個子包basemap,負責地圖繪制。
一、庫的安裝
(一)matplotlib安裝
- matplotlib依賴
- nose
- numpy
- pyparsing
- python-dateutil
- cycler
- pkg-config
- freetype
- libpng
- 安裝過程
這里我都是通過源碼包安裝的,大家也可以再終端里通過pip install 命令來安裝
1、安裝nose
解壓縮后,進入命令提示符 運行
- python3 setup.py install
2、安裝numpy
解壓縮后,進入命令提示符 運行
- python3 setup.py install
3、安裝pyparsing
解壓縮后,進入命令提示符 運行
- python3 setup.py install
4、安裝python-dateutil
解壓縮后,進入命令提示符 運行
- python3 setup.py install
5、安裝cycler
解壓縮后,進入命令提示符 運行
- python3 setup.py install
6、安裝pkg-config
- ./configure --with-intermal-glib
- make && date
- sudo make install && date
7、安裝freetype
- ./configure
- make && date
- sudo make install && date
8、安裝libpng
- ./configure
- make && date
- sudo make install && date
9、安裝matplotlib-1.5.0
解壓縮后,進入命令提示符 運行
- python3 setup.py install
(二)basemap安裝
- basemap依賴
- geos
- pyproj
- 安裝過程
1、安裝GEOS
- ./configure
- make && date
- sudo make install && date
2、安裝pyproj
- python3 setup.py install
3、安裝basemap
- python3 setup.py install
(三)pygrib安裝
- pygrib依賴
- Jasper
- GRIB API
- numpy
- pyproj
- 安裝過程
由于之前已經安裝了numpy和pyproj,這里只需安裝Jasper和GRIB API即可安裝pygrib
1、安裝Jasper
- ./configure
- make && date
- sudo make install && date
2、安裝GRIB API
- ./configure --with-jasper='/usr/local/'
- make && date
- sudo make install && date
3、安裝pygrib
安裝pygrib之前首先要根據自己的實際情況修改文件目錄下的setup.cfg文件,最主要的就是修改grib_api_dir和jasper_dir,這兩個是剛剛安裝的Jasper和GRIB API的路徑,如果這兩個地址不正確安裝會報錯
修改好就可以正常安裝了
- python3 setup.py install
二、grib數據讀取
雖然我做的東西和氣象沾邊,但是我本身并不是氣象專業出身,所有這些東西都是我慢慢研究琢磨出來的,所以有些方面可能講的比較外行,有不對的地方歡迎大家留言指正。
(一)導入pygrib模塊
- >>> import pygrib
(二)打開Grib文件
- >>> grbs = pygrib.open('/Users/Kallan/Documents/data/echhae50.082')
(三)提取文件信息
- >>> grbs.seek(0)
- >>> for grb in grbs:
- grb
- 1:Geopotential Height:gpm (instant):regular_ll:isobaricInhPa:level 500:fcst time 24 :from 201507081200
信息解讀
1 :數據列表的行號,有的文件可能包括多個數據
Geopotential Height:數據的名稱
gpm (instant):數據的單位
regular_ll:常規數據,其實這個字段我也不清楚
isobaricInhPa:這個字段表示的是數據屬性,此處表示是以hPa為單位的等壓面
level 500:這個字段表示的是高度層
fcst time 24 :預報時效
from 201507081200 :起報時間
綜合上面的信息可以得出,這個文件是從2015年7月8日12時開始的24小時后500hPa等壓面高度場數據
(四)導出文件數據
- >>> grb = grbs.select(name='Geopotential Height')[0]
- >>> data = grb.values
- >>> print(data.shape,data.min(),data.max())
- (37, 37) 5368.6796875 5941.0390625
- >>> lat,lon=grb.latlons()
- >>> print(lat,'\n',lon)
- [[ 0. 0. 0. ..., 0. 0. 0. ]
- [ 2.5 2.5 2.5 ..., 2.5 2.5 2.5]
- [ 5. 5. 5. ..., 5. 5. 5. ]
- ...,
- [ 85. 85. 85. ..., 85. 85. 85. ]
- [ 87.5 87.5 87.5 ..., 87.5 87.5 87.5]
- [ 90. 90. 90. ..., 90. 90. 90. ]]
- [[-90. -87.5 -85. ..., -5. -2.5 0. ]
- [-90. -87.5 -85. ..., -5. -2.5 0. ]
- [-90. -87.5 -85. ..., -5. -2.5 0. ]
- ...,
- [-90. -87.5 -85. ..., -5. -2.5 0. ]
- [-90. -87.5 -85. ..., -5. -2.5 0. ]
- [-90. -87.5 -85. ..., -5. -2.5 0. ]]
三、grib數據可視化
(一)導入需要的模塊
- >>> import matplotlib.pyplot as plt
- >>> from mpl_toolkits.basemap import Basemap
- >>> import numpy as np
(二)創建一個figure
- >>> plt.figure()
- <matplotlib.figure.Figure object at 0x107e65198>
(三)創建一個basemap實例
- >>> m=Basemap(projection='mill',lat_ts=10,llcrnrlon=lon.min(), \
- urcrnrlon=lon.max(),llcrnrlat=lat.min(),urcrnrlat=lat.max(), \
- resolution='c')
- >>> m.drawcoastlines(linewidth=0.25)
- <matplotlib.collections.LineCollection object at 0x1091c1f28>
- >>> m.drawcountries(linewidth=0.25)
- <matplotlib.collections.LineCollection object at 0x10621d0f0>
- >>> m.fillcontinents(color='coral',lake_color='aqua')
- >>> m.drawmapboundary(fill_color='aqua')
- <matplotlib.patches.Rectangle object at 0x10918b3c8>
- >>> m.drawmeridians(np.arange(0,360,30))
- >>> m.drawparallels(np.arange(-90,90,30))
(四)將lat,lon的數據格式轉換成投影需要的格式存入x,y
- >>> x, y = m(lon,lat)
(五)繪制等值線
- >>> cs = m.contour(x,y,data,15,linewidths=1.5)
(六)命名并顯示圖像
- >>> plt.title('Geopotential Height Contour from Grib')
- <matplotlib.text.Text object at 0x10918bda0>
- >>> plt.show()
(七)圖像展示