IT pass HikiWiki - [Exp2022]NetCDF データの可視化 簡単な解析 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

((<"スケジュール表・各回資料 (08/11)"|[Exp2022]スケジュール表・各回資料#08-2F11>))

{{toc}}

ここまでの説明では, NetCDF ファイルに含まれるデータから切り出したりしただけで全く「加工」「処理」「演算」せずに描画してきました.

ここでは, データを簡単に処理/演算した上で描画する方法を説明します.

#============================================================================
= 平均

下のスクリプトは,
((<詳しい指定|[Exp2022]NetCDF データの可視化 詳しい指定>))で説明した ((<tone_yp_1.rb|URL:/exp/fy2022/220811/practice_gphys/tone_yp_1.rb>)) を基に平均操作を行ったものです.

((<tone_yp_mean.rb|URL:/exp/fy2022/220811/practice_gphys/tone_yp_mean.rb>))

    01  #!/usr/bin/ruby
    02  # 使用するライブラリの読み込み. (以下 2 行は「決まり文句」.)
    03  require "numru/ggraph"
    04  include NumRu
    05
    06  # NetCDF ファイル "air.2019.nc" から変数 "air" を読み, GPhys オブジェクト gp に
    07  # 格納
    08  gp = GPhys::IO.open( "air.2019.nc", "air" )
    09
    10  # 経度(lon)軸に対して平均する
    11  gp = gp.mean('lon')
    12
    13  # 画面を開く (open)
    14  #   引数の 1 は画面への描画を表す
    15  #          2 はファイルへの出力を表す
    16  #            (デフォルトでは出力は pdf 形式でファイル名は dcl.pdf)
    17  DCL.gropn(1)
    18
    19  # 描画画面を準備
    20  #   itr の 1 は横軸, 縦軸ともに線形を表す
    21  #          2 は横軸が線形軸, 縦軸が対数軸を表す
    22  #          3 は横軸が対数軸, 縦軸が線形軸を表す
    23  #          4 は横軸, 縦軸ともに対数軸を表す
    24  GGraph.set_fig( 'itr'=> 1 )
    25
    26  # トーン (色付け) で描画
    27  #   第一引数は描画するデータの GPhys オブジェクト
    28  #   第二引数の true はこの時点では「決まり文句」
    29  GGraph.tone( gp, true )
    30  # カラーバーを描画
    31  GGraph.color_bar
    32
    33  # 画面を閉じる (close)
    34  DCL.grcls

((<tone_yp_1.rb|URL:/exp/fy2022/220811/practice_gphys/tone_yp_1.rb>)) から 11 行目を変更しています.
11 行目では mean メソッドを用いて経度 (lon) 軸に対して平均操作を施しています.

上のスクリプトを変更して実行してみると下のような図になるでしょう.

((<URL:/exp/fy2022/220811/practice_gphys/tone_yp_mean.png>))

改めてこの図の「成り立ち」について説明しておきます.
air.2019.nc に保存されている変数 air は, 経度(lon), 緯度(lat), 鉛直層(圧力, level), 時間(time) の 4 次元変数です.
したがって, 8 行目に変数が読み込まれた GPhys オブジェクト gp は 4 次元変数を含んでいます.
その後, gp は平均のメソッド mean によって経度に対して平均しますので, その結果として gp は緯度(lat), 鉛直層(圧力, level), 時間(time) の 3 次元変数となっています.
そしてそれを tone に渡すことで, 最初の 2 次元 (緯度と圧力) の分布が可視化されます. このとき, 3 次元目以降 (時間(time)) の軸は最初の値が採用されます.


なお, 限られた区間のみ平均したい場合には, 切り出すメソッド (cut) と平均するメソッド (mean) を繋げて使うことができます.
例えば, 経度 0 度から 90 度の平均を求めたいならば,

    gp = gp.cut('lon'=>0..90).mean('lon')

のようにすると良いでしょう.


=== 練習問題
* 時間平均した温度の経度-緯度分布を描いてみましょう.
* 時間平均かつ東西平均した温度の緯度-圧力分布を描いてみましょう.


#============================================================================
= 平均からのずれ

大気海洋のような流体を扱う分野では, 流れや温度などの場を平均場 (あるいは基本場) とそれからのずれの成分に分けて考えることがあります.
上で説明した平均操作を用いると平均からのずれの成分も簡単に計算することができます.

((<詳しい指定|[Exp2022]NetCDF データの可視化 詳しい指定>))で説明した ((<tone_xy_coast.rb|URL:/exp/fy2022/220811/practice_gphys/tone_xy_coast.rb>)) を基にして東西平均からのずれの分布を描いてみましょう.

そのためには, ((<tone_xy_coast.rb|URL:/exp/fy2022/220811/practice_gphys/tone_xy_coast.rb>)) において, 変数を読んだ後で,

    gp = gp - gp.mean('lon')

の処理を追加しましょう.

スクリプトを上のように書き換えて実行してみましょう
(((<変更したスクリプト例|URL:/exp/fy2022/220811/practice_gphys/tone_xy_coast_eddy.rb>))).

なお, そのように東西平均からのずれを計算すると, 得られる変数 (GPhys オブジェクトは) 経度, 緯度, 鉛直層(圧力), 時間の 4 次元のままであることに注意しましょう.

実行してみると下のような図になるでしょう.

((<URL:/exp/fy2022/220811/practice_gphys/tone_xy_coast_eddy.png>))


また, 上の方法の代わりに, eddy メソッドを使って計算することもできますので, 好みの方法を使うと良いでしょう.

    gp = gp.eddy('lon')


#============================================================================
= 標準偏差

標準偏差の計算には stddev メソッドを用いることができます.

((<詳しい指定|[Exp2022]NetCDF データの可視化 詳しい指定>))で説明した ((<tone_xy_coast.rb|URL:/exp/fy2022/220811/practice_gphys/tone_xy_coast.rb>)) を基にして時間方向の標準偏差の分布を描いてみましょう.

そのためには, ((<tone_xy_coast.rb|URL:/exp/fy2022/220811/practice_gphys/tone_xy_coast.rb>)) において, 変数を読んだ後で,

    gp = gp.stddev('time')

の処理を追加しましょう.

スクリプトを上のように書き換えて実行してみましょう
(((<変更したスクリプト例|URL:/exp/fy2022/220811/practice_gphys/tone_xy_coast_stddev.rb>))).

実行してみると下のような図になるでしょう.

((<URL:/exp/fy2022/220811/practice_gphys/tone_xy_coast_stddev.png>))

ところで, この図は何を表しているでしょうか?
なぜこのような分布になるのか考えてみましょう.


=== 練習問題
* 春 (3-5 月) の期間の温度の時間に対する標準偏差の経度-緯度分布を描いてみましょう.