最低限 Unix / Linux [II] 【7. 付録: gnuplotについて】

  1. 事前準備
  1. シェル
  1. テキストエディタ
  1. シェルスクリプト
  1. [付録] データ圧縮・解凍とアーカイブ
  1. 本日の課題
  1. [付録] gnuplot について
  1. [付録] 昭和基地における観測
情報実験第 3 回トップへ

gnuplot(ニュープロット, グニュープロット)は, オープンソースのグラフ描画ソフトウェアです. Linux, Windows, MacOS で利用でき, 数式からのグラフ描画とデータファイルからのグラフ描画に対応し, 様々な出力形式(PNG, JPEG, GIF, EPS, PDF, SVG, etc...)をサポートしています. 本ページでは, gnuplot の簡単な使い方と今年度の INEX 課題で用いられているバッチファイルの中身について簡単に説明します.

gnuplot のインストール

gnuplot は gnuplot.info からインストールファイルをダウンロードできます. また, Debian 系の Linux ならば, apt を用いることもできて,
# apt install gnuplot gnuplot-x11
でインストールができます.

gnuplot とその使い方

今回は簡単な例として, $y=\frac{\sin x}{x}$のグラフを描画し, そのグラフを PNG 画像で出力する例を取り上げます. 何らかのウィンドウシステム上で gnuplot を用いていることを仮定します.

gnuplot の対話モードの起動

シェル上で,
$ gnuplot
と打ち込みます. すると,
	    G N U P L O T
	    Version 5.4 patchlevel 1    last modified 2020-12-01

	    Copyright (C) 1986-1993, 1998, 2004, 2007-2020
	    Thomas Williams, Colin Kelley and many others

	    gnuplot home:     http://www.gnuplot.info
	    faq, bugs, etc:   type "help FAQ"
	    immediate help:   type "help"  (plot window: hit 'h')

	    Terminal type is now 'qt'
	    
	    gnuplot>
	  
と表示され, gnuplot> というプロンプトが返ってきます. これで gnuplot の対話モードが起動します. 対話モードでは, gnuplot のコマンドをキーボードで入力してグラフの描画を行います. ちなみに, gnuplot の対話モードを終了して通常のシェル画面に戻るためには, exit と入力します.
gnuplot> exit

グラフの描画

早速, $y=\frac{\sin x}{x}$のグラフを描画しましょう. 2 次元のグラフを描画するためには, plot コマンドを使います. plot のあとにスペースを入れてその後に数式($x$の式)を書けば, 新しい窓が出てきてグラフが描画されます.

gnuplot> plot sin(x)/x
Fig. 1: 表示されるグラフ.

式には, +(加法), -(減法), *(乗法), /(除法), **(累乗)などの二項演算子が使えます. また, 関数として, 三角関数, 双曲線関数, 逆三角関数, 指数・対数関数, 特殊関数(例えばガンマ関数など)が使えます.

レーダーチャート(Spiderplot)の描画

関数をプロットするだけでなく, gnuplotは様々な形式のグラフを作成することができます. 今回は課題でも出てきたレーダーチャートとその作成について紹介します. なお, ここで紹介するやり方はgnuplot 5.4 で新しく実装されたものであり, それ以前のバージョンでは動作しない可能性があります. 皆さんが使用する情報実験機にはgnuplot 5.4 がインストールされている筈ですので問題はありませんが, 自分の環境で課題をこなそうとする人は注意してください. レーダーチャートとは, 中心を0とし, 各軸を放射状に配置したグラフのことで, 値が大きくなるほど外側にプロットされます. 今回は風向と日数をプロットし, 観測地での卓越風向を図示するために利用しました. 以下は, gnuplotで同じディレクトリにあるexam.csvというファイルをもとにレーダーチャートを描画するスクリプトと, その出力例です.
- exam.csv -
Score1,Score2,Score3,Score4,Score5
56,72,74,60,75
gnuplot>set spiderplot #レーダーチャートを作成するという宣言
gnuplot>set datafile separator "," #読み込むファイルの区切り文字を","に設定
gnuplot>set style spiderplot fillstyle transparent solid 0.2 border #内部を塗りつぶすという命令
gnuplot>set for [i=1:5] paxis i range [0:100] #表示する値の範囲を設定
gnuplot>set paxis 1 tics font ",9" #1番目の軸には目盛を表示
gnuplot>plot for [i=1:5] 'exam.csv' using i title columnhead linewidth 3 #exam.csvを読み込み, レーダーチャートを作成する
詳しい説明は, gnuplot documentationにあるので, 興味のある人は確認してみてください.

Fig. 2: gnuplotで作成したレーダーチャートの例

描画設定と再描画

gnuplot では, 描画範囲, 各軸の書き方などの設定を変更することもできます. ここでは新たな設定を施し, その設定の下で先ほど作成した$y=\frac{\sin x}{x}$のグラフを再描画してみましょう. グラフの様々な設定を変更するためには set コマンドを用います. 先ほどのグラフにはマス目が無かったため, 例えばマス目を設定してみます.
gnuplot> set grid
また, $x$の範囲を$-15\leq x \leq 15$としてみます.
gnuplot> set xrange [-15:15]
これらの設定を先ほどのグラフに適用するには, replot コマンドを用いてグラフの再描画を行います.
gnuplot> replot

Fig. 3: 再描画されたグラフ.

ファイルへの出力と gnuplot の終了

このグラフを画像ファイルへ出力することを試みましょう. これまでは, グラフのデータの出力先 (terminal) はウィンドウ (Linux ならば X-window-system) でした. これを PNG 画像ファイル (pngcairo) とします. pngcairo というのは, cairo というライブラリを用いて PNG 画像へ出力するモードです. 出力先の変更は set コマンドを使って以下のように行います.
gnuplot> set terminal pngcairo

このまま plot してしまうと, 端末に PNG 画像のデータがそのまま表示されてしまいます. そこで, PNG 画像データを格納するファイル名(output)を指定します. ファイル名の指定は set コマンドを用いて以下のように行います.
gnuplot> set output "new.png"
事前にグラフが描かれている状態であったとしても, この状態で再描画を行えば, PNG 画像データがファイルへ書き込まれます.
gnuplot> replot
ただし, このままでは画像ファイルは gnuplot によってアクセスされたままであり, 他のソフトウェアで開くことができない状態となっています. よって, 画像ファイルを別のソフトで閲覧・編集したいときは, gnuplot で開かれている画像ファイルを閉じる必要があります. 画像ファイルを閉じるために, gnuplot 自体を終了しても構いませんが, 例えば
gnuplot> unset output
とするだけでもよいです. 一方, 再び画面 (X-window-system) へのグラフ描画へ戻るだけでも 画像ファイルは閉じられます. そのときは
gnuplot> set terminal x11
とします. また, gnuplot の対話モードを終了して元のシェルに戻りたい場合は
gnuplot> exit
とします.

バッチモード

上記に示した対話モードでは, いちいち順序を追ってコマンドを入力しなければならないため, 例えばグラフの設定を使いまわしたいときには不便です. そんなときにはバッチモードを使います. バッチモードは, gnuplot のコマンドが列挙されているファイル(バッチファイル)を gnuplot 自身が読み込み, そのコマンドを逐次実行するというモードです. バッチモードでグラフを描画する際は, シェルから以下のように gnuplot へバッチファイルを読み込ませます.
$  gnuplot バッチファイルのパス

それではバッチファイルを作成してみましょう. バッチファイルの作り方は簡単で, gnuplot のコマンドたちを実行順に 1 行に 1 つずつ書くだけです. 今回はバッチファイルのファイル名を batch.gpl としましょう.
バッチファイル (batch.gpl) の中身:
set grid
set xrange [-15:15]
plot sin(x)/x
set terminal pngcairo
set output "new.png"
replot
exit
バッチファイルが完成したら, gnuplot へ読み込ませます.
$  gnuplot batch.gplのパス
しばらく時間が経つとプロンプトが戻ってきて, new.png がカレントディレクトリに生成されているはずです.

inex 課題で用いた gnuplot バッチファイルを覗く

ここで, 2023 年第 3 回で出題された課題で用いたバッチファイル (spiderplot.gpl) の中身を見てみましょう. ここでは各行での動作をわかりやすくするために, "#"から始まる説明文を付け加えました. "#"から始まる文は, gnuplot ではコメント文として扱われ, 読み込まれることはありません. なので, 以下の通り"#"が入った状態でバッチファイルを記述しても, 正しく実行されます.

課題で用いたバッチファイル (spiderplot.gpl) の中身:
reset #設定をリセットする
set spiderplot #レーダーチャート(spiderplot)を作成するよ, という指示
set style spiderplot fillstyle transparent solid 0.2 border 
set datafile separator "," #読み込むCSVファイルの書式設定
set title font ",15" #タイトルフォントの設定
set title "Syowa Wind direction 2021" offset 0,1 #タイトルの設定
set for [i=1:16] paxis i range[0:100] #軸の描画範囲を指定
set for [p=2:16] paxis p tics format "" #2-16軸には目盛を表示しない
set for [j=1:16] paxis j label font ",10" #各軸のラベルのフォント設定
set paxis 1 tics font ",10" #1番目の軸には目盛を表示する

#PDFファイルに出力
set terminal pdfcairo
#ファイル名を確定、前のファイルがある際に上書きしないように注意
set output "Syowa_wind_direction.pdf"

#課題1の場合
plot for [i=1:16] 'wind_direction.csv' using i title columnhead linewidth 3 #レーダーチャートの作成

unset output
exit


	



<< 戻る (本日の課題)      次へ >> ([付録] 昭和基地における南極観測)      情報実験 第 3 回 のトップへ >>

最終更新日: 2023/04/26 杉山 玄己 copyright © 2023 inex