2.PGPLOT の簡単な使い方

2.1 はじめに

この章では、具体的な例を示しながら、PGPLOT を使ってグラフを描くために必要な、いくつかの基本的なサブルーチンについて説明する。ただし、ここで説明すること以外にも pgplot には種々の機能があるので、それらについては後の章を参照願いたい。

まず初めに、グラフというのは、幾つかの『要素』から成っている。たとえば、グラフの輪郭を与えたりスケールを示すために必要な外枠や座標軸、目盛りやラベル、そしてデータを示すための点や記号、線などである。グラフを描く際に、pgplot では以下の4つの機能(サブルーチン)を呼ぶことが必要である(ただし、サブルーチンの呼び方などは違えど、以下の考え方自体は多くの作図ソフトウェアに共通である):

  1. PGOPEN (PGBEG でも可) : pgplot による作図を開始し、作図結果を出力したいデバイスを指定する、
  2. PGENV : グラフの座標範囲やスケールを定義し、ラベルや軸を描く、
  3. 具体的な作図部分: PGPT または PGLINE または、その他、あるいはそれらの組み合わせ
        点(記号)を打つ(PGPT)、線を引く(PGLINE)、・・・・ (作図内容に応じて使い分ける)、
  4. PGCLOS (PGEND でも可) : pgplot による作図を終了する。

同じデバイスに2つ以上のグラフを描く時(1つのページに複数のグラフを描いたり、複数ページにグラフを描いたりする場合)は、上の2〜3番目の手続きを必要な回数繰り返せば良い(つまり、何ページにわたって幾つ図を書こうが、同じデバイスを使う限り、最初の PGOPEN と最後の PGEND はプログラムの最初と最後に各々1度だけ呼べば良い)。ここで『同じデバイスを使う』というのは、一度のプログラム実行で一つのデバイスだけ(画面なら画面、プリンタ出力用ファイルならそのファイルだけ)を使うことを意味する。

2-3 節以下では、これら4つの段階について、きわめて単純な例を使って説明する。

2.2 引数についての注意

サブルーチンの中には、しばしば "引数" を必要とするものがある。また、PGPLOT に限らず、ある決まった計算や処理をサブルーチンにまとめて、それとメインプログラムの間で引数を通してデータや情報をやり取りすることが良くある。

このような場合、

引数には総て「型」(整数型、実数型、文字型など)があり、サブルーチン側とメインプログラム側で型が一致していないと、プログラムは正しく動かない。

ということに注意しておいて欲しい。

PGPLOT も、(皆さんにはソースコードは見えないが)実体はサブルーチンや関数副プログラムの群であり、それらの各々について、引数をとる物、とらない物が決まっている。また、引数をとる物については、それぞれの引数をどのような型で与えなければならないかも予め決まっている。

たとえば、PGENVというサブルーチンは

     CALL PGENV ( 0., 10., 0., 20., 0, 1 )

のように6つの入力引数を必要とするが、このうち最初の4つは実数(または実数型変数)、残りの2つは整数(または整数型変数)でなければならない。これを、例えば

     CALL PGENV ( 0, 10, 0., 20., 0, 1. )

のように与えてしまうと、うまく動かない(初めの2つの引数が整数に、また最後の引数が実数になっていることに注意! 小数点を伴う数字は Fortran では実数である)。

ここで実数型変数とは、プログラム内で REAL 文で宣言されている変数を指し、整数型変数とは INTEGER (または INTEGER*4)文で宣言されている変数を指す。また、引数が配列の場合は、メインプログラムでも配列として宣言されていなければならない。

また、引数には、入力(サブルーチンに与えるもの)用の引数と出力(サブルーチンから返されるもの)用の引数がある。

各サブルーチンの説明において、(input) と記されているものが入力用の引数、(output) と記されているものが出力用の引数を意味する。入力用の引数には、サブルーチンを呼び出す時に適宜、数値が入っていなければならない。

2.3 例

pgplot の典型的な作図例として、グラフにデータをプロットしたり、それと比較するために理論曲線を引いたりする場合が挙げられる。本章では、そのようなプロットを描くための簡単なプログラムについて説明する。

いま仮に、5つの測定データがあって、これをグラフにプロットし、さらに理論曲線 y = x² を重ね書きして測定データと比べたい、という場合を考えてみよう。これを行うための Fortran のプログラムの ソースコード は、以下のようになる:

           PROGRAM SIMPLE
     c
           INTEGER I, IER, PGBEG
           REAL XR(100), YR(100)
           REAL XS(5), YS(5)
     c
           DATA XS/1.,2.,3.,4.,5./
           DATA YS/1.,4.,9.,16.,25./
     c
           IER = PGBEG(0,'?',1,1)
           IF (IER.NE.1) STOP
     c
           CALL PGENV(0.,10.,0.,20.,0,1)
     c
           CALL PGLAB('(x)', '(y)', 'A Simple Graph')
     c
           CALL PGPT(5,XS,YS,9)
     c
           DO 10 I=1,60
               XR(I) = 0.1*I
               YR(I) = XR(I)**2
        10 CONTINUE
           CALL PGLINE(60,XR,YR)
     c
           CALL PGEND
     c
           END

このプログラムを実行して得られる図は、Figure 2.1 の通りである。図を見ながら、以下の説明を読んで頂きたい。

2.4 データの初期化

まず、

     REAL XR(100), YR(100)
     REAL XS(5), YS(5)
     DATA XS/1.,2.,3.,4.,5./
     DATA YS/1.,4.,9.,16.,25./

の部分では、5対のデータ(それぞれにつき、物理量 "x" に対して物理量 "y" が得られている)の x 座標と y 座標を、それぞれ、配列 XS と配列 YS に格納(代入)している。ここでは便宜上 DATA 文を使ってデータを両配列に代入しているが、もっと一般的には、別に作ってあるファイルからデータを読み込む場合もあるだろう。

一方、配列 XR と配列 YR は、理論曲線を書くために使う(詳しくは後述)。

2.5 PGPLOT を始める

データの用意が出来たところで、作図のために先ず行わなければならないのは、pgplot を開始し、出力用のデバイスを指定することである。上の例では

     INTEGER PGBEG
     IER = PGBEG(0,'?',1,1)
     IF (IER.NE.1) STOP

の部分が、これに当たる。PGBEG の代わりに PGOPEN でも良く、むしろ最近のバージョンの pgplot では後者を推奨しているらしい。PGOPEN を使う場合は、上の部分の代わりに、

     INTEGER PGOPEN
     IF (PGOPEN('?') .LE. 0) STOP

のように書く。どちらの場合も STOP 文への IF 分岐を含んでいるが、これは『pgplot を開始しようとして、もし何らかの理由により pgplot が使えない状態であった時は、プログラムの実行を中止せよ』という意味である。大事なことは、PGOPEN であれ PGBEG であれ、必ずプログラムの冒頭で整数型変数として宣言する、ということである。これは、PGBEGPGOPEN も Fortran の関数プログラム(cf. FUNCTION 文で定義される)であり、関数プログラムは必ず型を宣言しなければ使えない、という Fortran の約束事によるものである。

引数についての詳しい説明は、ここでは省略する。必要なものについては後々説明するが、リファレンスマニュアルの該当部分を参照して頂いても良い。

2.6 グラフのスケールを決め、座標軸を描く

前節の要領で PGPLOT を開始したら、次に必要なのは図に描く変量の範囲とグラフのスケールを決めることである。これを最も簡単に行ってくれるサブルーチンが、PGENV である。PGENV では又、ラベルやグラフの外枠や軸などを描くか描かないかを引数(第6引数)で指定することが出来るので、必要に応じて使い分けられる。ちなみに、上の例では

     CALL PGENV(0.,10.,0.,20.,0,1)

の部分がこれに当たっていて、結果的に x 軸方向には 0.0〜10.0 (各々、第1引数と第2引数で与えられている)を、y 軸方向は 0.0〜20.0 (各々、第3引数と第4引数)をグラフに描くことを指定している。

PGENV には6つの引数がある。このうち、初めの4つは今説明した通りで、

である。第5引数と第6引数は整数で、それぞれの意味は以下の通り:

2.7 座標軸にラベル(タイトル等)を付ける

PGENV の後で PGLAB を呼ぶと、x 軸や y 軸にラベル(たとえば、測定量の名前など)を書かせたり、図の上端にタイトルを入れたりすることが出来る。上の例では
     CALL PGLAB('(x)', '(y)', 'A Simple Graph')
の部分がこれに当たり、3つの引数(すべて文字(character)型)が順に、 を表している。どれかを書きたくなければ、それに対応する引数を空白文字列(' ')で与えれば良い。


2.8 記号(グラフマーカ)を描く

PGPT を使うと、グラフ内の任意の場所に1つまたは複数の記号(PGPLOT の用語では graph markers と呼ぶ)を描くことが出来る。上の例では

     CALL PGPT(5,XS,YS,9)

の部分で5つのデータをプロットするのに用いられている。PGENV で定義した範囲を超える場所にデータがある場合、そのデータはプロットされない。PGPT にわたす引数は4つで、

2.9 線を引く

PGPLOT で線を引くには、PGLINE を使うのが最も簡単である。上の例では、

          DO 10 I=1,60
             XR(I) = 0.1*I
             YR(I) = XR(I)**2
      10 CONTINUE
           CALL PGLINE(60,XR,YR)

の部分がこれに当たる。ここでは先ず、理論曲線上の60個の点の x 座標と y 座標を計算し、これをサブルーチン PGLINE を使って結ぶことにより、"曲線"を描いている。正確に言うと PGLINE は与点を真っ直ぐな線分で順番に結んでいくだけなので、十分なめらかにして"曲線"っぽく見せるためには、それだけ細かく点を与えることが必要である(粗く与えれば折れ線になる)。

記号の場合と同じく、PGENV で指定した範囲外に線がはみ出す場合、その部分は描かれない。PGLINE に与える引数は3つで、それぞれ

である。

2.10 PGPLOT を終了する

すべての作図が終了したら、最後に PGPLOT を終了させる。これは、PGCLOS または PGEND のサブルーチンで行う。具体的には、

     CALL PGCLOS

または

     CALL PGEND

と書く。どちらの場合も引数はない。


Previous: 第1章   Next: 第3章   目次へ