見出し画像

温位エマグラム

以前に、エマグラムのコードを紹介しました。2021年11月19日に宗谷地方で発生した暴風事例を検討している際に、温位や相当温位などの鉛直変化を確認したくなり、温位エマグラムのコードを作成しました。今回は、温位エマグラムの簡単な説明と、コードの紹介です。

エマグラムと温位エマグラム

下に例として、同じ高層ゾンデ観測のエマグラムと温位エマグラムの図を示します。エマグラムでは温度と露点温度のプロファイルを図示し、温位エマグラムでは、エマグラムと縦軸・横軸は同じですが、横軸の単位はCelsiusからKelvineに変更され、温位(黒線)と飽和温位(温位計算で温度の代わりに露点温度を利用:紫線)、相当温位(緑線)、飽和相当温位(赤線)の4つのプロファイルを図示しています。

画像1
左がエマグラム、右が温位エマグラム

エマグラムでは、乾燥断熱線と湿潤断熱線、等飽和混合比線が示されています。温位エマグラムでは、横軸を温位とした場合の等飽和混合比線(緑点線)を示しています。この等飽和混合比線を使って、温位と飽和温位プロファイルから凝結高度を算出できます。

温位エマグラムの活用については、気象庁HPで公開されている、加藤輝之さん著の「図解説中小規模気象学」の44から48ページで詳しく解説されています。勉強したい方は、是非ご覧いただければと思います。

エマグラムと温位エマグラムの使い分けについては、エマグラムが基本で様々な検討に利用できます。気象現象の構造を把握する際や、気象学を勉強する方にとってはエマグラムを使って大気の成層状態などを確認することをお勧めします。一方で温位エマグラムは、対流雲の発生・発達に関わる対流不安定や潜在不安定などの安定度や、前線の高度や状況を素早く確認したい時にはとても便利です。

コードの解説

エマグラムの記事で紹介した「MetPyを利用したコード」と大部分同じです。変更・追加部分についてのみ解説していきます。

プロファイルで図示する、温位と飽和温位、相当温位、飽和相当温位を算出は次の通りです。このようにmetpyの関数を利用して簡単に計算できます。

## 温位、飽和温位、相当温位、飽和相当温位の算出
pt = mpcalc.potential_temperature(p,T)
spt = mpcalc.potential_temperature(p,Td)
ept = mpcalc.equivalent_potential_temperature(p,T,Td)
sept = mpcalc.saturation_equivalent_potential_temperature(p,T)

今回のコードで主に追加した内容は、横軸を温位とした等飽和混合比曲線を作成する部分です。metpy.plot.SkewTクラスにインスタントメソッドを追加する形で、次の通り実装しました。物理計算は、MetPyの関数を利用することから、指定された飽和混合比と気圧から飽和温位を求める際、水蒸気圧、露点温度、飽和温位の順に算出しています。

## 温位エマグラムの補助線として、横軸を温位とした等飽和混合比曲線を作成
# metpy.plots.SkewTのクラスに追加する
def plot_mixing_lines_pt(self, mixing_ratio=None, pressure=None, **kwargs):
       r"""Plot lines of constant mixing ratio for Potential Temperature Emagram.

       Adds lines of constant mixing ratio (isohumes) to the
       plot. The default style of these lines is dashed green lines with an
       alpha value of 0.8. These can be overridden using keyword arguments.

       Parameters
       ----------
       mixing_ratio : array_like, optional
           Unitless mixing ratio values to plot. If none are given, default
           values are used.
       pressure : array_like, optional
           Pressure values to be included in the isohumes. If not
           specified, they will be linearly distributed across the current
           plotted pressure range up to 600 mb.
       kwargs
           Other keyword arguments to pass to :class:`matplotlib.collections.LineCollection`

       Returns
       -------
       matplotlib.collections.LineCollection
           instance created

       See Also
       --------
       :class:`matplotlib.collections.LineCollection`

       """
       # Remove old lines
       if self.mixing_lines:
           self.mixing_lines.remove()

       # Default mixing level values if necessary
       if mixing_ratio is None:
           mixing_ratio = np.array([0.0004, 0.001, 0.002, 0.004, 0.007, 0.01,
                                    0.016, 0.024, 0.032]).reshape(-1, 1)

       # Set pressure range if necessary
       if pressure is None:
           pressure = units.Quantity(np.linspace(600, max(self.ax.get_ylim())), 'mbar')

       # Assemble data for plotting
       td = mpcalc.dewpoint(mpcalc.vapor_pressure(pressure, mixing_ratio))
       pt = mpcalc.potential_temperature(pressure,td)
       # 単位を変換しないと
       pt = pt.to(units.degree_Celsius)
       linedata = [np.vstack((t.m, pressure.m)).T for t in pt]

       # Add to plot
       kwargs.setdefault('colors', 'g')
       kwargs.setdefault('linestyles', 'dashed')
       kwargs.setdefault('alpha', 0.8)
       self.mixing_lines = self.ax.add_collection(LineCollection(linedata, **kwargs))
       return self.mixing_lines
#
## メソッドを追加
metpy.plots.SkewT.plot_mixing_lines_pt = plot_mixing_lines_pt

今回のコード作成で困ったのは、横軸をケルビン単位に変更する方法です。単位系を変更する関数があったのですが、動作しないのか、私の使い方が悪いのか動作しませんでした。そこで、横軸の値を直接変更できる関数、skew.ax.xaxis.set_major_formatter()を使って、次のようなコードとなりました。また、合わせて等飽和混合比曲線の描画についてもご確認ください。

## 描画範囲
AxTmax = 320    # Kelvin
AxTmin = 270
AxPtop = 300    # hPa
AxPBot = 1020

## 目盛の表示指定
# 表示範囲の10度毎となるよう設定
XLabel = np.arange(AxTmin, AxTmax, 10) * units.K
AxTmax = AxTmax * units.K
AxTmin = AxTmin * units.K 

## 作図
fig = plt.figure(figsize=fig_size)
# asplectを大きくすると、縦長となる
skew = SkewT(fig, rotation=0, aspect=120)

# 軸の設定
skew.ax.set_xlim(AxTmin, AxTmax)
skew.ax.set_ylim(AxPBot, AxPtop)

# X軸の目盛表示 (これがないと自動でCelsius単位で表示される)
skew.ax.xaxis.set_major_formatter(
          plt.FuncFormatter(lambda x, pos: "%d"%(273.15 + x)))
skew.ax.set_xticks(XLabel)
skew.ax.set_xlabel('Kelvin')

# 等飽和混合比曲線(横軸:相当温位)
#   表示する混合比の指定
mr = np.array([0.0004, 0.001, 0.002, 0.004, 0.007, 0.01,0.016, 0.024, 0.032]).reshape(-1, 1)
# 700hPa面より上にも線を引くために指定する
mix_p = np.arange(1000, 99, -20) * units.hPa
skew.plot_mixing_lines_pt(pressure=mix_p, mixing_ratio=mr, linestyle='dotted', color='tab:blue')

# 温位、飽和温位、相当温位、飽和相当温位のプロファイル描画
skew.plot(p, pt, 'black')
skew.plot(p, ept, 'g')
skew.plot(p, sept, 'r')
skew.plot(p, spt, 'purple')

サンプルコード

次のファイルは、Jupyter Notebook用の温位エマグラム作成コードです。年月日や地点番号を書き換えると温位エマグラムを作成できます。試してみてください。

なお、この記事では、MetPy Vesionは1.1を利用しています。

この記事が気に入ったらサポートをしてみませんか?