Yamamoto's Laboratory
 
PGPLOT
 
gnuplot
 
 

PGPLOT

PGPLOTは,C言語から呼び出すことができるライブラリーである.gunplotも,C言語から呼び出すことが可能であるが,パイプをつかうことになり,不便なところがある.計算途中でグラフを書かせる場合,PGPLOTの方が便利そうである.このような理由で,PGPLOT を使ってみることにする.仕入れた知識やテクを忘れないように,このページにメモを残す.

目次


インストール方法

インストール

PGPLOTのバイナリファイルを見つけることができなかったので,ソースからインストールした.配布元のwebページにインストール方法が詳しく書かれているので,難しくない.そこに書かれている通りにして,pgplot をインストールした.以下に,その順序を示す.

  1. ファイルをダウンロードする.インストールについてを記述しているページの先頭付近にダウンロードの方法が書かれている.ftpを使ってのダウンロード方法を説明しているが,そんなもの使わなくても,マウスの右クリックでダウンロードできる.
  2. ダウンロードしたファイル(pgplot5.2.tar.gz)は,/usr/local/src に入れておく.ファイルのあるディレクトリーに移動して,解凍を行う.
    # cd /usr/local/src
    # gunzip -c pgplot5.2.tar.gz | tar xvof -
  3. ターゲットディレクトリーの作成
    # mkdir /usr/local/pgplot
  4. ドライバーリストの作成を行う.解凍したpgplotの中に,drivers.listがあるのでそれを編集する.このリストの各行には,様々なドライバーが書かれている.リストの先頭の行のびっくりマーク(!)を除くことにより,必要なドライバーが使用可能になる.中には,問題のあるものがあり,コンパイル時にエラーが発生する.エラーメッセージを見ると,問題のあるドライバーがわかるので,それを使わないようにする.そのドライバーの先頭にびっくりマークを再度付ければよい.参考に,私のドライバーリストを載せておく.
    # cd /usr/local/pgplot
    # cp /usr/local/src/pgplot/drivers.list .
    # emacs drivers.list
  5. makefileの作成.環境の応じて引数が異なる.ほとんどのlinuxは,以下で問題ないはず.
    # /usr/local/src/pgplot/makemake /usr/local/src/pgplot linux g77_gcc
  6. makeする.問題のあるドライバーがある.コンパイルエラーが発生したら,ドライバーを使用不可にする.
    # make
  7. 以降使わない不要なファイルが大量にあるので,きれいにする.
    # make clean
  8. C bindingをインストールする.
    # make cpg
  9. 環境設定を行う..bashrc に以下を記述する.当然,ユーザー毎に設定が必要.
    export PGPLOT_DIR=/usr/local/pgplot/
    export PGPLOT_DEV=/xwindow
    export LD_LIBRARY_PATH=/usr/local/pgplot

これで,インストールは完了.あとは,デモプログラムで確認する.

デモプログラム

デモプログラムが用意されているので,問題なくインストールできたことを確認する.

  1. まずは,.bashrcの設定を反映させるために,以下のコマンドを実行する.
    $ source ~/.bashrc
  2. デモプログラムは,次のようにして実行する.
    $ /usr/local/pgplot/pgdemo1
  3. 他にもデモプログラムはある.いろいろと実行すると,面白い.

デモプログラムはソースを見ることができるので,プログラムを作成するときの参考になる.

作図方法

C言語から,PGPLOTを呼び出して使う方法をまとめる.

ヘッダーファイルとコンパイル方法

C言語で PGPLOT を使うためには,ヘッダーファイル cpgplot.h をインクルードする必要がある.このヘッダーファイルには,pgplot で使う関数のプロトタイプが書かれている.

#include "cpgplot.h"

コンパイルは,以下のようにして行う.

$ gcc -c -I/usr/local/pgplot sin_wave.c
$ g77 -o sin_wave sin_wave.o -lcpgplot -lpgplot -lX11 -lgcc -lm -L/usr/local/pgplot

いちいち,こんなコマンドを打つのは大変なので,Makefileを書くことを勧める.例 えば,以下のように書けばよい.これで,make だけで実行ファイルができあがる.

TARGET 	= sin_wave
OBJS  	= $(TARGET).o

CC 	= gcc
FC	= g77
CFLAGS 	= -Wall
INCDIRS = -I/usr/local/pgplot
LIBDIRS = -L/usr/local/pgplot
LIBS 	= -lcpgplot -lpgplot -lm -lX11

all: $(TARGET)

$(TARGET): $(OBJS)
	$(FC) -o $(TARGET) $(OBJS) $(CFLAGS) $(LIBDIRS) $(LIBS)

$(TARGET).o:$(TARGET).c
	$(CC) -c $(TARGET).c $(CFLAGS) $(INCDIRS)

clean:
	rm -f *.o

開始・終了

開始と出力デバイス設定

PGPLOTはオープンではじめて,クローズで終了する.オープンするためには,cpgopen() 関数を使う.引数は出力デバイスで,戻り値はデバイスの識別子(整数)である.通常は,次のように書く.

if((plot1 = cpgopen("/xserv")) <= 0)exit(1);

引数の/xservで,出力デバイスをX Windowとしている.ここは,device/type あるい は,file/type と書く.

plot.gif/gif gifファイル

戻り値は,正の値の場合はデバイスの識別子,ゼロまた負の値の場合はエラーをあら わす.

終了

終了処理のクローズは,以下のように書く.

cpgclos();

注意事項

  • PGPLOTのルーチン(関数)を呼び出すときにわたす実数型の引数は,floatである.しかし,普通,C言語の実数の計算では double を使う.値渡しの場合は,自動的に folat に変換してくれるので問題ない.一方,配列のようにアドレス渡しの場合は,そのままわたすことができない.プログラマーが float に変換する必要がある.

プログラム例

使い方の参考のために,てきとうなサンプルプログラムを作成して載せる.

アニメーション

デモプログラムの pgdemo11.f を参考に,アニメーションのプログラムを作成した.プログラムを実行させると,下図のようなグラフが現れ,動き出す.下のグラフのstart ボタンを押すと,プログラムと同じ動作をする.3周期,振動する定在波となっている.


参考

  1. 配布元.PGPLOT Graphics Subroutine Library
  2. 東京大学の今野さんのPGPLOTでグラフを描く
  3. 東京大学応用流体工学研究室PGPLOT サブルーチン解説.サブルーチンの解説が書かれていて便利.
  4. 物理のかぎしっぽの中のグラフ・解析ツールにも PGPLOT の使い方の説明があります.
  5. 奥村晴彦さんのLinux Wikiの中のPGPLOT
  6. 東北大学の木津さんのPGPLOT利用の手引き.ここにあるPGPLOTのマニュアルは,User's manualの日本語訳で,大体の機能を把握することができる.


no counter