【気象データ】数値予報モデルが出力したGPVデータの取得・読み込み・描画【GRIB】

【気象データ】数値予報モデルが出力したGPVデータの取得・読み込み・描画【GRIB】

前回の記事では,日本付近の気象衛星画像をプロットしてみました。
今回は,数値予報モデルが出力した格子点データ(grid point value: GPVデータ)を地図上にプロットしてみましょう。

数値予報モデルとしては,気象庁が運用中しているGSMや,アメリカ海洋大気庁 (NOAA)のGFS,ヨーロパ中期予報センターのECMWFがあります。
今回は,GFSが出力したGPVデータをサーバから取得し,プロットしてみます。
はじめの一歩として,上空の気温をプロットしてみましょう。
次のような図を作ることが目標です。

  • これによって,天気予報でよく耳にする,「上空の寒気が〜」の意味がわかるようになります!
  • 注意:数値予報モデルが出力したGPVデータは気象予報のもとになる資料です。出力値そのものを鵜呑みにすることは極めてまずいです。適切な背景知識がない場合には,あくまでも自己利用にとどめるのが良いと考えます。さらなる学習の手がかりになれば幸いです。

動作検証済み環境

macOS Monterey 12.6.2, Python 3.9.15, pygrib 2.1.4, MetPy 1.3.1

GPVデータをプロットするために

GPVデータは,数値予報モデル等が出力した,緯度と経度と高さ方向からなる格子上の値を格納したデータです。
今回取り扱う値は格子点上の何らかの気象学的要素を表しています。
気象学的要素をかんたんに運用(他の気象学的要素と組み合わせたり,微分したり)していくために便利なライブラリ,MetPyがあります。
今回は,主役ではありませんが,インストールしておきましょう。

GPVデータは,水平方向には緯度と経度ですが,垂直方向は何で表されているでしょうか。実は,気圧です。
気圧は上空に行くほど低くなる(単調減少)ため,xxメートルと表せるように,xxヘクトパスカルというように気圧を指定して垂直方向の位置を表すことができます。
したがって,GPVデータの読み込みのときは,(例外もありますが)気圧面を指定することになります。
代表的なものは,925 hPa,850 hPa,700 hPa,500 hPa,300 hPaです。

今回は,GPVを出力するモデルとして,GFSを使います。GFSはアメリカの海洋大気庁が運用しているモデルです。2つのデータサーバーがあります:

それぞれウェブブラウザからアクセスできて,ダウンロードすることができます。ファイルサイズが大きいのでダウンロードする際には気をつけてください。

データの形式は GRIB2 という階層データを管理するバイナリ形式です。バイナリ形式ですが,pygrib というGRIBファイルを読むためのサードパーティのライブラリがpip経由でインストールできます。

それでは,データの取得,GRIBファイルの読み込み,データの描画をやってみましょう。

GPVデータの取得

最新〜10日前までのデータの取得

最新のものから10日前までのデータを使用したい場合,

https://nomads.ncep.noaa.gov/

にアクセスします。
スクロールダウンしていくと,表形式でリンクがありますので,使いたいものを選択します。
今回は,GFS 0.50 Degree を使いたいと思います。
https をクリックすると,さらに予報が実行された日,予報初期時刻(00/06/12/18),大気 (atoms) /波 (wave),というように選べます。

例えば,解像度0.5度で初期時刻2023年1月14日の日本時間9時を初期時刻とする12時間後の予報データがほしいときは,gfs.20230114 → 00 → atomos と進んでいって,gfs.t00z.pgrb2.0p50.f012 をダウンロードします。

気をつけないといけないのは,ファイル名に日付が入っていないことです。
したがって,同じディレクトリにダウンロードしてしまうと初期値となった日付がわからなくなってしまいます。

10日前〜半年前までのデータの取得

10日前〜半年前までのデータを使用したい場合,

https://www.ncei.noaa.gov/products/weather-climate-models/global-forecast

にアクセスします。

Data on NCEI Server を展開して,二つ目のGFS Forecasts (GFS Model) から使いたいものを選択します。解像度0.5度の予報データを使う場合上段の一番右,HTTPSをクリックして,予報データのあるディレクトリまで進みます。

例えば,期時刻2022年12月24日の日本時間9時を初期時刻とする12時間後の予報データがほしいときは,202212 → 20221224 と進んでいって,gfs_4_20221224_0000_012.grb2 をダウンロードします。

ファイル名にある gfs_4 の 「4」 は解像度が0.5度予報データであるということを意味しています。「3」 の場合は解像度が1度のものです。

GRIBデータの読み込み

ダウンロードしたファイルは grib形式で保存されています。これをpython上で読み込むためには,pygribというライブラリが使えます。pip経由でダウンロードすることができます。気象要素の計算に便利なライブラリMetpyもインストールしておきましょう。

$ pip3 install pygrib
$ pip3 install metpy

Pythonで読み込みと描画を実装

GPVデータの取得とデータの読み込み,プロットをするプログラムをpythonでコーディングしてみます。どちらかのサイトで,データを適当なディレクトリ(ここでは,~/Desktop/LabCode/python/gfs-temperatureとします。)にダウンロードしておきましょう。

実装例を示します。このプログラムをplot-gfs-tempeature.pyとして,データをダウンロードしたディレクトリ(~/Desktop/LabCode/python/gfs-temperature)に移動します。

以下のコードではGFSのデータとして二番目のサイトからダウンロードしてきた gfs_4_20221224_0000_048.grb2 を使用することを想定しています。

import datetime

import pygrib
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.patheffects as path_effects
from metpy.units import units
import numpy as np
from scipy.ndimage import gaussian_filter


#------------------------------------------------------------------------------
# 読み込むデータのファイルパス
fname_gfs = "gfs_4_20221224_0000_012.grb2"

# 最大,最小の緯度と経度
lon_min = 90
lon_max = 180
lat_min = 10
lat_max = 70

#------------------------------------------------------------------------------
# NOAA GFS 予報データの読み込みと平滑化など
# データの読み込み
print("*** GFSデータを読み込みます:", fname_gfs)
with pygrib.open(fname_gfs) as gribin:
    # 500 hPa 温度
    tmpr_500, lat, lon = gribin.select(name='Temperature', level=500)[0].data(lat1=lat_min, lat2=lat_max, lon1=lon_min, lon2=lon_max)
    
    # 初期値の日付と予報時間
    dtm_ini_gfs = gribin.select(name='Temperature', level=500)[0].analDate
    dtm_fcst_gfs = gribin.select(name='Temperature', level=500)[0].validDate
    
    # 850 hPa 温度
    tmpr_850, _, _ = gribin.select(name='Temperature', level=850)[0].data(lat1=lat_min, lat2=lat_max, lon1=lon_min, lon2=lon_max)


# 予報時間を計算
fcst_hrs = dtm_fcst_gfs - dtm_ini_gfs

# ガウシアンフィルタで平滑化する
tmpr_500 = gaussian_filter(tmpr_500, sigma=1.0)
tmpr_850 = gaussian_filter(tmpr_850, sigma=1.0)

# 単位をつける
lat = lat * units('degrees_north')
lon = lon * units('degrees_east')
tmpr_500 = tmpr_500 * units('K')
tmpr_850 = tmpr_850 * units('K')


#------------------------------------------------------------------------------
# プロット
fig = plt.figure(figsize=(210/25.4, 294/25.4), dpi=100)
out_fig_path = f'plot-gfs-ini{dtm_ini_gfs.strftime("%Y%m%d%H")}-fcst{dtm_fcst_gfs.strftime("%Y%m%d%H")}-500-850-temperature.png'

fig.text(0.10, 0.97, f"NOAA GFS (resolution 0.5 deg)", fontsize=14)
fig.text(0.10, 0.95, f"initial: {dtm_ini_gfs.strftime('%Y/%m/%d %H')}UTC", fontsize=14)
fig.text(0.10, 0.93, f"forecast: {dtm_fcst_gfs.strftime('%Y/%m/%d %H')}UTC (initial + {fcst_hrs/datetime.timedelta(hours=1)}hrs)", fontsize=14)

# 地図用の変換
crs_map = ccrs.NorthPolarStereo(central_longitude=140.0, true_scale_latitude=60.0) # 気象庁「日々の天気図」に近いもの

# データ用の変換
crs_data = ccrs.PlateCarree()

# プロット枠の設定
ax01 = fig.add_axes([0.10, 0.50, 0.80, 0.40], projection=crs_map)
cb01 = fig.add_axes([0.80, 0.50, 0.01, 0.40])
ax02 = fig.add_axes([0.10, 0.05, 0.80, 0.40], projection=crs_map)
cb02 = fig.add_axes([0.80, 0.05, 0.01, 0.40])


# ----- プロット その1 500hPa 気温
# 海岸線や国境を描画する
ax01.add_feature(cfeature.COASTLINE, linewidth=0.5, color="green")
ax01.add_feature(cfeature.BORDERS, linewidth=0.5, linestyle=':', color="green")

# 地図を描く緯度経度の範囲の設定
ax01.set_extent([117.0, 156.0, 18.0, 61.0], crs_data)

# 500 hPa 気温
clevs_tmpr_500 = np.arange(-54, 15, 3)
cs01 = ax01.contour(lon, lat, tmpr_500.to(units.degC), clevs_tmpr_500, 
                    colors='black', transform=crs_data, linewidths=0.5, linestyles='dashed')
clbls01 = ax01.clabel(cs01, fmt='%d')

plt.setp(clbls01, path_effects=[path_effects.withStroke(linewidth=2, foreground="w")])

# 雪の目安の等温線を塗る
ax01.contour(lon, lat, tmpr_500.to(units.degC), [-36.0, -30.0],
             colors=['purple', 'blue'], transform=crs_data, linewidths=[3.0], linestyles='solid', alpha=0.5)


# cflevs_tmpr_500 = np.arange(-24, 0, 6) # 夏用
cflevs_tmpr_500 = np.arange(-54, 3, 3) # 冬用
norm = mpl.colors.BoundaryNorm(cflevs_tmpr_500, 256)

cf = ax01.contourf(lon, lat, tmpr_500.to(units.degC),
                   cflevs_tmpr_500, norm=norm,
                   cmap='PuOr_r', transform=crs_data, extend='both', alpha=0.5)
mpl.colorbar.ColorbarBase(cb01, cf, ticks=cflevs_tmpr_500,
                          orientation='vertical', 
                          label=u'temperature at 500hPa ($^\circ$C)',
                          ).minorticks_off()

# グリッドを描く
ax01.gridlines(xlocs=np.arange(100, 180, 10), 
               ylocs=np.arange(10, 90, 10),
               linestyle='dashed', color='green', linewidth=0.5)


# ----- プロット その2 850hPa 気温
# 海岸線や国境を描画する
ax02.add_feature(cfeature.COASTLINE, linewidth=0.5, color="green")
ax02.add_feature(cfeature.BORDERS, linewidth=0.5, linestyle=':', color="green")

# 地図を描く緯度経度の範囲の設定
ax02.set_extent([117.0, 156.0, 18.0, 61.0], crs_data)

# 850 hPa 気温
clevs_tmpr_850 = np.arange(-45, 30, 3)
cs02 = ax02.contour(lon, lat, tmpr_850.to(units.degC), clevs_tmpr_850, 
                    colors='black', transform=crs_data, linewidths=0.5, linestyles='dashed')
clbls02 = ax02.clabel(cs02, fmt='%d')

plt.setp(clbls02, path_effects=[path_effects.withStroke(linewidth=2, foreground="w")])

# 雪の目安の等温線を塗る
ax02.contour(lon, lat, tmpr_850.to(units.degC), [-12.0, -6.0],
             colors=['purple', 'blue'], transform=crs_data, linewidths=[3.0], linestyles='solid', alpha=0.5)

# cflevs_tmpr_850 = np.arange(-24, 24, 6) # 夏用
cflevs_tmpr_850 = np.arange(-33, 33, 3) # 冬用
norm = mpl.colors.BoundaryNorm(cflevs_tmpr_850, 256)

cf = ax02.contourf(lon, lat, tmpr_850.to(units.degC),
                   cflevs_tmpr_850, norm=norm,
                   cmap='PuOr_r', transform=crs_data, extend='both', alpha=0.5)
mpl.colorbar.ColorbarBase(cb02, cf, ticks=cflevs_tmpr_850,
                          orientation='vertical', 
                          label=u'temperature at 850hPa ($^\circ$C)',
                          ).minorticks_off()

# グリッドを描く
ax02.gridlines(xlocs=np.arange(100, 180, 10), 
               ylocs=np.arange(10, 90, 10),
               linestyle='dashed', color='green', linewidth=0.5)


#------------------------------------------------------------------------------
# 図の保存
plt.savefig(out_fig_path, transparent=False)

プログラムを試してみる前に

#------------------------------------------------------------------------------
# 読み込むデータのファイルパス
fname_gfs = "gfs_4_20221224_0000_048.grb2"

この部分は読み込むデータのファイルパスを設定する部分ですが,本文執筆時(2023年1月16日)に有効であった部分です。自分がダウンロードしてきたデータのファイルパスを指定してください。

プログラムを実行する

ターミナルを開き,

$ cd Desktop/LabCode/python/gfs-temperature

と入力し,先程プログラムを保存したディレクトリに移動します。あとは以下のコマンドで plot-gfs-tempeature.pyを実行するだけです。( $マークは「プロンプト」です。入力する必要はありません。)

$ python3 plot-gfs-tempeature.py

実行結果

~/Desktop/LabCode/python/gfs-temperature にplot-gfs-ini2022122400-fcst2022122600-500-850-temperature.pngというファイルができて,以下のようになっていれば成功です!

図の見方を説明します。

上段は500 hPa面の気温,下段は850 hPa面の気温を表しています。

天気予報の解説でよく聞く,「上空の寒気が〜」と言っているのは,500 hPa面(上空約5000 m)や 850 hPa面(上空約1500 m)の寒気のことを言っています。

上のスクリプトでプロットされているのは,日本時間2022年12月24日9時を初期時刻とする2日後の26日9時の予報です。寒気が強く,太平洋側でも一部雪の懸念もありました。上空の寒気が南下し,降水があれば平地でも雪の目安となる500 hPa –30度の等温線や,850 hPa面で–6度の等温線の南下が予想されていたことがわかります。

南下していると言われても実感がわかないと思いますので,2023年1月14日の予報時間00時(つまり初期時刻に使った解析データ。「予報」ではない)をプロットしてみます。データをダウンロードしてきてファイルパスを変更して,実行すればよいです。次のような結果が得られました。

この日は季節外れの高温になりました。ニュースでも「4月並みの気温」等の表現がみられ,雪崩などの災害もありました。500 hPa と 850 hPaの両方で,先程みた等温線がかなり北にあることがわかります。
前線を伴った低気圧が通過し,暖かい空気が南から流れ込んできたからです。

コードの解説

上に書いたソースコードの解説をしていきます。

import datetime

import pygrib
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.patheffects as path_effects
from metpy.units import units
import numpy as np
from scipy.ndimage import gaussian_filter

まず,必要なモジュールをインポートします。

#------------------------------------------------------------------------------
# 読み込むデータのファイルパス
fname_gfs = "gfs_4_20221224_0000_048.grb2"

# 最大,最小の緯度と経度
lon_min = 90
lon_max = 180
lat_min = 10
lat_max = 70

読み込むデータのファイルパスを設定します。2番目のサイトからダウンロードしてきたファイルを指定しています。
初期時刻は2022年12月24日,日本時間9時で48時間後の予報データが入っているファイルを指定しています。

下の段はデータ読み込みの範囲を指定しています。日本付近を描画したいので,必要最小限の領域を指定しています。

#------------------------------------------------------------------------------
# NOAA GFS 予報データの読み込みと平滑化など
# データの読み込み
print("*** GFSデータを読み込みます:", fname_gfs)
with pygrib.open(fname_gfs) as gribin:
    # 500 hPa 温度
    tmpr_500, lat, lon = gribin.select(name='Temperature', level=500)[0].data(lat1=lat_min, lat2=lat_max, lon1=lon_min, lon2=lon_max)
    
    # 初期値の日付と予報時間
    dtm_ini_gfs = gribin.select(name='Temperature', level=500)[0].analDate
    dtm_fcst_gfs = gribin.select(name='Temperature', level=500)[0].validDate
    
    # 850 hPa 温度
    tmpr_850, _, _ = gribin.select(name='Temperature', level=850)[0].data(lat1=lat_min, lat2=lat_max, lon1=lon_min, lon2=lon_max)


# 予報時間を計算
fcst_hrs = dtm_fcst_gfs - dtm_ini_gfs

# ガウシアンフィルタで平滑化する
tmpr_500 = gaussian_filter(tmpr_500, sigma=1.0)
tmpr_850 = gaussian_filter(tmpr_850, sigma=1.0)

# 単位をつける
lat = lat * units('degrees_north')
lon = lon * units('degrees_east')
tmpr_500 = tmpr_500 * units('K')
tmpr_850 = tmpr_850 * units('K')

GFSデータを読み込む部分です。pygrib.open()gribinとしてファイルをオープンし,gribin.select(name=’’, level=)[0]でそれぞれ,ほしいデータにアクセスします。それぞれ

  • name=‘Temperature’ :温度データを指定
  • level=500 or 850:気圧面を指定

しています。東西方向の風のデータがほしければ,name=’U component of wind’とします。

data()メソッドで値と緯度,経度を返します。lat1,…を指定しないと全領域のデータが返ってきます。処理が重くなるので,必要最小限を指定しておくのが良いと思います。

analDateで初期値となった解析データの日付,時刻を,validDateで予報時間を返します。datetimeオブジェクトとなっています。予報時間(何時間後の予報か)は上の2つを引き算することで計算できます。

取得したGPVデータはgaussian_filter()としてガウシアンフィルタで平滑化しておきます。sigmaは平滑化の程度(カーネルの大きさ)を決めるパラメータです。大きくするとより滑らかになります。

最後に計算や単位変換でミスが起きないように,metpy.unitsで単位を付けておきます。

#------------------------------------------------------------------------------
# プロット
fig = plt.figure(figsize=(210/25.4, 294/25.4), dpi=100)
out_fig_path = f'plot-gfs-ini{dtm_ini_gfs.strftime("%Y%m%d%H")}-fcst{dtm_fcst_gfs.strftime("%Y%m%d%H")}-500-850-temperature.png'

fig.text(0.10, 0.97, f"NOAA GFS (0p50)", fontsize=14)
fig.text(0.10, 0.95, f"initial:{dtm_ini_gfs.strftime('%Y/%m/%d %H')}UTC", fontsize=14)
fig.text(0.10, 0.93, f"forecast:{dtm_fcst_gfs.strftime('%Y/%m/%d %H')}UTC (initial + {fff_gfs}hrs)", fontsize=14)

# 地図用の変換
crs_map = ccrs.NorthPolarStereo(central_longitude=140.0, true_scale_latitude=60.0) # 気象庁「日々の天気図」に近いもの

# データ用の変換
crs_data = ccrs.PlateCarree()

# プロット枠の設定
ax01 = fig.add_axes([0.10, 0.50, 0.80, 0.40], projection=crs_map)
cb01 = fig.add_axes([0.80, 0.50, 0.01, 0.40])
ax02 = fig.add_axes([0.10, 0.05, 0.80, 0.40], projection=crs_map)
cb02 = fig.add_axes([0.80, 0.05, 0.01, 0.40])

出力する図の設定をします。また,初期時刻および予報時刻を図の上の方に書いておくようにします。

気象データをプロットするためには,座標の変換が必要です。ポーラーステレオ図法(気象庁が提供する「日々の天気図」に近い図法)でプロットすることとします。
データプロットの際に transform の引数に与える crs_data を定義しておきます。これは,どんな図法を使うときも PlateCarreeを使います。

最後にプロット枠を定義しておきます。

# ----- プロット その1 500hPa 気温
# 海岸線や国境を描画する
ax01.add_feature(cfeature.COASTLINE, linewidth=0.5, color="green")
ax01.add_feature(cfeature.BORDERS, linewidth=0.5, linestyle=':', color="green")

# 地図を描く緯度経度の範囲の設定
ax01.set_extent([117.0, 156.0, 18.0, 61.0], crs_data)

# 500 hPa 気温
clevs_tmpr_500 = np.arange(-54, 15, 3)
cs01 = ax01.contour(lon, lat, tmpr_500.to(units.degC), clevs_tmpr_500, 
                    colors='black', transform=crs_data, linewidths=0.5, linestyles='dashed')
clbls01 = ax01.clabel(cs01, fmt='%d')

plt.setp(clbls01, path_effects=[path_effects.withStroke(linewidth=2, foreground="w")])

# 雪の目安の等温線を塗る
ax01.contour(lon, lat, tmpr_500.to(units.degC), [-36.0, -30.0],
             colors=['purple', 'blue'], transform=crs_data, linewidths=[3.0], linestyles='solid', alpha=0.5)


# cflevs_tmpr_500 = np.arange(-24, 0, 6) # 夏用
cflevs_tmpr_500 = np.arange(-54, 3, 3) # 冬用
norm = mpl.colors.BoundaryNorm(cflevs_tmpr_500, 256)

cf = ax01.contourf(lon, lat, tmpr_500.to(units.degC),
                   cflevs_tmpr_500, norm=norm,
                   cmap='PuOr_r', transform=crs_data, extend='both', alpha=0.5)
mpl.colorbar.ColorbarBase(cb01, cf, ticks=cflevs_tmpr_500,
                          orientation='vertical', 
                          label=u'temperature at 500hPa ($^\circ$C)',
                          ).minorticks_off()

# グリッドを描く
ax01.gridlines(xlocs=np.arange(100, 180, 10), 
               ylocs=np.arange(10, 90, 10),
               linestyle='dashed', color='green', linewidth=0.5)

一段目のプロットをしている部分です。

contour()を使って,500 hPa 面の等温線をプロットします。clevs_tmpr_500 はどの値からどの値まででんな間隔で等温線をプロットするかを決めている部分です。
-54度から15度までを3度刻みでプロットします。tmpr_500 の単位は絶対温度ですから,to(units.degC) でセルシウス温度に変換しています。clabel() で等温線に温度の値を書かせます。
plt.setp()では,等温線に書かせた温度の値が見にくいので,周りを白で縁取る処理をしています。

また,雪の目安となる特別な等温線にはcontour()を使って,等温線を色付きで上書きします。

contourf() は等温線の間に色を塗ります。cmapでカラーマップの設定(値の範囲に対応する色の設定)を行っています。mpl.colorbar.ColorbarBase()では,右側の凡例を設定している部分です。

# ----- プロット その2 850hPa 気温
# 海岸線や国境を描画する
ax02.add_feature(cfeature.COASTLINE, linewidth=0.5, color="green")
ax02.add_feature(cfeature.BORDERS, linewidth=0.5, linestyle=':', color="green")

# 地図を描く緯度経度の範囲の設定
ax02.set_extent([117.0, 156.0, 18.0, 61.0], crs_data)

# 850 hPa 気温
clevs_tmpr_850 = np.arange(-45, 30, 3)
cs02 = ax02.contour(lon, lat, tmpr_850.to(units.degC), clevs_tmpr_850, 
                    colors='black', transform=crs_data, linewidths=0.5, linestyles='dashed')
clbls02 = ax02.clabel(cs02, fmt='%d')

plt.setp(clbls02, path_effects=[path_effects.withStroke(linewidth=2, foreground="w")])

# 雪の目安の等温線を塗る
ax02.contour(lon, lat, tmpr_850.to(units.degC), [-12.0, -6.0],
             colors=['purple', 'blue'], transform=crs_data, linewidths=[3.0], linestyles='solid', alpha=0.5)

# cflevs_tmpr_850 = np.arange(-24, 24, 6) # 夏用
cflevs_tmpr_850 = np.arange(-33, 33, 3) # 冬用
norm = mpl.colors.BoundaryNorm(cflevs_tmpr_850, 256)

cf = ax02.contourf(lon, lat, tmpr_850.to(units.degC),
                   cflevs_tmpr_850, norm=norm,
                   cmap='PuOr_r', transform=crs_data, extend='both', alpha=0.5)
mpl.colorbar.ColorbarBase(cb02, cf, ticks=cflevs_tmpr_850,
                          orientation='vertical', 
                          label=u'temperature at 850hPa ($^\circ$C)',
                          ).minorticks_off()

# グリッドを描く
ax02.gridlines(xlocs=np.arange(100, 180, 10), 
               ylocs=np.arange(10, 90, 10),
               linestyle='dashed', color='green', linewidth=0.5)

二段目のプロットをしている部分です。
850 hPa面の等温線を一段目と同様にプロットしています。

#------------------------------------------------------------------------------
# 図の保存
plt.savefig(out_fig_path, transparent=False)

最後に図を保存して終了です。

最後に

GPVデータのプロットの手始めとして,上空の気温を取り扱いました。
次回は,より凝ったプロットや,気象要素の計算に便利なMetPyについて,詳しく述べてみたいと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です