1次元図における欠損値処理

地球流体の分野では, 測器にトラブルがあったり観測出来なかったりして, データに欠損が生じることがしばしば起こります. その時, 適当な欠損値を与えて データの継続性を保つことが一般的に行なわれますが, そのようなデータを解 析するのは結構面倒なものです. DCLには, 強力な欠損値処理機能があります. どのように欠損値が処理できるのか, この章ではグラフィクスルーチンに限っ て説明しましょう.

データの中に欠損がある場合には, DclSetParm ルーチンで欠損値処理の指定に関する内部変数 'INTERPRET_MISSING_VALUE'.TRUE. にして, 欠損値処理を有効にします. 欠損値処理の制御は DCL 全体で統一的に行われています.

このように指定すると, データの値が999.であるものは欠損値と見なして, こ れから見るような欠損値処理を行ないます. 欠損値999.が実際のデータ範囲に 入っていて, 別の値にしたい場合には, DclSetParm ルーチンによって実数 の欠損値をあらわす内部変数 'MISSING_REAL' を変更します.
まず, 下のプログラムを例に, 1次元図で欠損値処理がどのように行なわれるか見てみましょう. 正弦関数のデータに欠損値 999.を埋め込みます. データの1/4のと ころでは3点連続して欠損値とし, 3/4のところでは, 有効な点が欠損値データ に挟まれて1点だけ孤立しているように与えます.

欠損値処理をしない(デフォルト)で DclDrawLineDclDrawMarker のルーチン を呼んだ結果が上の2つです. 他のデータと比べて999.は非常に大きな値です から, ポリラインではほぼ真上に線を引いて最大作画範囲を飛び出しています. また, ポリマーカーでもこれらの点は作画範囲を飛び出してしまって描かれま せん.
DclSetParm ルーチンで内部変数 'INTERPRET_MISSING_VALUE'.TRUE. にして, 欠損値処理を行なって描いた結果が下の2つです. ポリラインでは欠損値の前 後を線で結びません. 有効な点が1点だけ孤立している場合には, その点を結 ぶことができないので, そこには何も描かれません. また, ポリマーカーでは 欠損値の点にはマーカーを打ちません. この例では, ポリマーカーの結果はど ちらも同じですが, 欠損値を小さくして2.とすると違いは明らかです.

miss01.f90
program miss01

  use dcl

  integer,parameter :: nmax=40
  real,parameter :: xmin=0., xmax=4*DCL_PI, ymin=-1., ymax=1.
  real :: x(0:nmax), y(0:nmax)

    x = (/( xmax*real(n)/nmax, n=0,nmax )/)
    y = sin(x)

    n1 = nmax/4
    y(n1-1:n1+1) = 999.

    n2 = n1*3
    y(n2-1) = 999.
    y(n2+1) = 999.

    call DclOpenGraphics()
    call DclNewFrame

!-- 欠損値処理なし ----
    call DclSetWindow( xmin, xmax, ymin, ymax )
    call DclSetViewPort(  0.1,  0.9,  0.7,  0.9 )
    call DclSetTransNumber( 1 )
    call DclSetTransFunction

    call DclDrawLine( x, y )

    call DclSetWindow( xmin, xmax, ymin, ymax )
    call DclSetViewPort(  0.1,  0.9,  0.5,  0.7 )
    call DclSetTransFunction

    call DclDrawMarker( x, y, type=3 )

!-- 欠損値処理 ----
    call DclSetParm('INTERPRET_MISSING_VALUE', .true. )

    call DclSetWindow( xmin, xmax, ymin, ymax )
    call DclSetViewPort(  0.1,  0.9,  0.3,  0.5 )
    call DclSetTransFunction

    call DclDrawLine( x, y )

    call DclSetWindow( xmin, xmax, ymin, ymax )
    call DclSetViewPort(  0.1,  0.9,  0.1,  0.3 )
    call DclSetTransFunction

    call DclDrawMarker( x, y )

    call DclCloseGraphics

end program




関連リンク