- Fortranから使うPLplot入門 #1 - インストールとHello World(この記事)
- Fortranから使うPLplot入門 #2 - 直線・曲線・散布図を描く
はじめに
現代のさまざまなプログラミング環境においては、グラフィカルな機能を備えるプログラミング言語が多いと思われます。例えばR言語、Pythonのmatplotlib、Julia言語のPlots.jlなどが例に挙げられます。数値計算アプリケーションを書くユーザーが、計算処理とデータ処理・グラフの作成をすべて同じ言語で行いたいと考えるのは自然な発想と言えるでしょう。
一方のFortranでは、標準で定められている機能にはそのようなものはありません。しかしながら、グラフや図の作成のためのFortranバインディングが提供されているフリーのライブラリはいくつか存在します。今回紹介するPLplotというソフトウェアはそのうちの一つです。
PLplotは、科学技術の分野でグラフなどの図を作成するために作られたプロットツールのライブラリで、Fortranを含むさまざまなプログラミング言語から利用可能です。このツールはクロスプラットフォームに対応しているので、Unix系のOSだけでなくWindows上でも使うことができます。これはLGPLでライセンスされたフリーソフトウェアです。
これはFortranプログラムから他の言語を使わず直接に(PLplot自体はC言語で開発されていますが)図を描画できる数少ない選択肢の一つなのですが、残念ながら日本語で書かれた情報はほとんど存在しないようなので、今回から数回に分けて記事を書くことにしました。
初回となる本稿では、PLplotのインストールから2次元の簡単な図を作成するところまでをできるだけ詳細に解説します。
前提
Fortran Package Manager(fpm)とGNU Fortranコンパイラ(gfortran)がインストールされていて、ターミナルから利用可能であることを前提に話を進めます。
インストール
ここでは、PLplotのインストール方法について簡単に解説します。
クロスプラットフォームに対応しているので、Windows、Mac、Linux(Ubuntu)でのインストール方法をそれぞれ述べます。インストール方法を確認した環境は次のとおりです。
- Windows 10 Pro 22H2
- macOS Sonoma 14.5 (MacBook Air, Apple M1, 2020)
- Ubuntu 22.04.5 LTS (Jammy Jellyfish)
このソフトウェアは、Fortranのモジュールファイルplplot.modの配置される場所が少しわかりにくいので注意してください。
なお、ソースコードからビルドしてインストールする方法については本稿では扱いませんが、いずれ別の記事で書くかもしれません。
Windows
Windows環境においては、簡単にインストールするにはMinGW-w64/Msys2を使うのが最も簡単です。以下ではIntelの64bitプロセッサで構成されたシステムを想定します。
- Msys2のターミナルを開く。
-
pacman -S mingw-w64-x86_64-plplotを実行する。
これでインストールは完了します。
MSYS2のディレクトリがCドライブ直下のC:\Msys2にある場合、plplot.modはC:\Msys2\mingw64\lib\fortran\modules\plplotディレクトリに配置されます。MSYS2のターミナルでfpm runを実行する時に、--flag "-I/mingw64/lib/fortran/modules/plplot"を指定するとコンパイラがplplot.modを見つけてくれます。もしくは環境変数FPM_FFLAGSとFPM_LDFLAGSに書き込んでもよいでしょう(fpm helpを参照)。
なお、この方法では環境変数の設定の問題のため、このままではPowerShellなどのMsys2ではないターミナルからは利用することはできません。
macOS
Macでは、MacPortsかHomebrewのどちらかのパッケージマネージャを使う方法が簡単です。
MacPorts
管理者権限でsudo port install plplotを実行してインストールします。
MacPortsで管理されるパッケージの標準のインストール先は/opt/localなので、共有ライブラリは/opt/local/libディレクトリに、モジュールファイルは/opt/local/lib/fortran/modules/plplotディレクトリに配置されます。そのため、fpm runの実行時に--flag "-I/opt/local/lib/fortran/modules/plplot"と--link-flag "-L/opt/local/lib"を指定する必要があります。もしくは環境変数FPM_FFLAGSとFPM_LDFLAGSに書き込んでもよいでしょう(fpm helpを参照)。
Homebrew
管理者権限でsudo brew install plplotを実行してインストールします。
HomebrewのパッケージはIntel CPUとApple siliconでインストール先が異なります。そのためインストール後はlocate plplot.modのコマンドなどでモジュールファイルの配置を取得し、fpm runの実行時には、MacPortsの場合と同様に--flag(必要であれば--link-flagも)を指定してください。
Ubuntu
管理者権限でaptコマンドを次のように実行して、インストールします。
sudo apt install libplplot-dev libplplotfortran0 plplot-driver-cairo
この時、plplot.modは/usr/lib/x86_64-linux-gnu/fortran/modules/plplotディレクトリ下に配置されるので、fpm runの実行時には、--flag "-I/usr/lib/x86_64-linux-gnu/fortran/modules/plplot"を指定してください。もしくは環境変数FPM_FFLAGSに書き込んでもよいでしょう(fpm helpを参照)。
ビルド設定
FPMで管理されたプロジェクトのfpm.tomlに、PLplotのモジュールを使うための指示を追加します。[build]セクションに以下の2行を追加してください。
external-modules = ["plplot"]
link = ["plplot", "plplotfortran"]
これらを設定することで、そのプロジェクトで管理されるのプログラム内においてPLplotのライブラリが利用可能になります。
プログラムを書いてプロットを描く
Hello World
まずは簡単な例から始めていきましょう。以下ようなのプログラムを書いたとします。これをコンパイルして実行しますが、use plplot文をimplicit noneの前に記述するのを忘れないでください。
program main
use plplot
implicit none
initialize: block
call plinit
end block initialize
frame: block
real(PLFLT), parameter :: xmin = 0d0, xmax = 1d0
real(PLFLT), parameter :: ymin = -1d0, ymax = 1d0
integer :: just, axis
just = 0
axis = 0
call plenv( xmin, xmax, ymin, ymax, just, axis)
call pllab("x", "y", "Title")
end block frame
plot: block
real(PLFLT) :: cx, cy, dx, dy
call plschr(12._plflt, 1._plflt)
cx = 0.5d0
cy = 0d0
dx = 1d0
dy = 0.5d0
call plptex(cx, cy, dx, dy, 0.5_plflt, "Hello World!")
end block plot
finalize: block
call plend
end block finalize
end program main
このプログラムを実行すると、ターミナルには次のようなプロンプトが表示され、出力デバイス(ファイル形式など)とファイル名について問われます(以下はMacの場合の例です)。
Plotting Options:
< 1> aqt AquaTerm - Mac OS X
< 2> xwin X-Window (Xlib)
< 3> ps PostScript File (monochrome)
< 4> psc PostScript File (color)
< 5> xfig Xfig file
< 6> null Null device
< 7> mem User-supplied memory device
< 8> psttf PostScript File (monochrome)
< 9> psttfc PostScript File (color)
<10> svg Scalable Vector Graphics (SVG 1.1)
<11> pdf Portable Document Format PDF
<12> xcairo Cairo X Windows Driver
<13> pdfcairo Cairo PDF Driver
<14> epscairo Cairo EPS Driver
<15> pscairo Cairo PS Driver
<16> svgcairo Cairo SVG Driver
<17> pngcairo Cairo PNG Driver
<18> memcairo Cairo memory driver
<19> extcairo Cairo external context driver
Enter device number or keyword:
まずは出力先の一覧が表示されるので、その番号またはキーワードを指定します。ここでは出力デバイスにpngcairoを選択すると仮定して、次のように入力します。
Enter device number or keyword: 17
次にファイル名について聞かれますが、ここではhello.pngとすることとして次のように入力します。
Enter graphics output file name: hello.png
これらを終えると、カレントディレクトリに以下のようなhello.pngが作成されるでしょう。
さて、次に上のFortranコードについて、ブロックごとに順番に見ていきます。
initalizeブロック
最初に、plinit手続を呼び出しています。plinitは1つのプロットを初期化して開始します。
frameブロック
2番目にframeブロックでは、プロットする領域を4個の実数型変数を使って定義しています。この際に使用するのがplenv手続で、これにより描画するウィンドウとボックスが設定されます。plenvは6個の引数を取りますが、前の4つは描画する範囲を上下左右端の値を指定します。
frame: block
real(PLFLT), parameter :: xmin = 0d0, xmax = 1d0
real(PLFLT), parameter :: ymin = -1d0, ymax = 1d0
integer :: just, axis
just = 0
axis = 0
call plenv( xmin, xmax, ymin, ymax, just, axis)
call pllab("x", "y", "Title")
end block frame
宣言部で指定しているとおり、上の図の描画領域は$0 \le x \le 1$, $-1 \le y \le 1$の範囲にあることがわかります。
残り2つの引数justとaxisは、0を指定しています。これはそれぞれ、justは座標軸がどのようにスケールされるかの指定された番号を選び、axis はプロットの装飾(ティックマークやグリッド)をどのようにするかの指定された番号を選択します。
-
just-
-1の場合、スケールは設定されないので、ユーザーがplenvを呼び出す前にplvpaやplvaspなどを呼び出して指定する必要があります。 -
0の場合、できるだけスクリーンに一致するように、x軸とy軸は独立してスケールされます -
1の場合、x軸とy軸のスケールは等しくなります。 -
2の場合、x軸とy軸の長さが等しくなり、ボックスは正方形になります。
-
axisの選択肢は30個ほどあるので、説明はここでは割愛しますが、0にすることでボックスと通常のティックマークと数値のラベルが描画されるようになります(詳細はドキュメンテーションのセクション17.23節を参照してください)。
このブロックの最後にpllab手続を呼び出しています。これの3つの引数にはそれぞれ、x軸のラベル、y軸のラベル、図のタイトルを文字列で指定します。
plotブロック
次にplotブロックですが、最初に実数型変数cx, cy, dx, dyを宣言していて、これらはplptex手続で文字列を置く位置を指定するために使用します。実行部の1行目ではplschr手続を引数(12._plflt, 1._plflt)と共に呼び出し、プロットする文字の大きさを12.0mmでスケールを1.0倍とするように指定しています。
plot: block
real(PLFLT) :: cx, cy, dx, dy
call plschr(12._plflt, 1._plflt)
cx = 0.5d0
cy = 0d0
dx = 1d0
dy = 0.5d0
call plptex(cx, cy, dx, dy, 0.5_plflt, "Hello World!")
end block plot
後続の代入文とplptex手続では、文字列を置く座標をcx = 0.5d0; cy = 0d0とし、その傾きを原点と点 dx = 1d0; dy = 0.5d0のなす直線に並行になるように指定しています。
plptexの第5引数は、cx とcyで指定した点に文字を置く際に、文字列のどの位置を基準点にするかを、0.0から1.0の数値(長さの割合)で指示しています。0.0の場合は左端に基準点が、1.0の場合は右端に基準点が置かれます。この例は0.5なので文字列の中央が基準点となっています。
plptexの最後の引数には、プロットする文字列"Hello World!"を指定しています。
finalizeブロック
最後に、plend手続を呼び出してプロットを完了します。
まとめ
PLplotのインストール方法と初歩的なプロットの例について解説しました。FortranコードからPLplotライブラリを使うには、上で書いたように、基本的には次の手順に従います。
-
use plplot文をimplicit noneの前に書く -
plinitを呼び出す - プロットする命令(
plptexなど)を呼び出す -
plendを呼び出してプロットを終了する
今回はHello Worldをプロットして、PLplotのベーシックな使い方を見てきました。次回以降の記事ではより実用的なグラフを書く方法について述べたいと思います。
