GNUPLOTを用いたグラフ作成

GNUPLOTは,各種の数式グラフやデータ集計グラフを描画するための科学技術系グラフ描画ツールである.ここでは,GNUPLOTを用いた様々なグラフ作成方法を実習する.

参考文献:「使いこなすGNUPLOT」大竹つよし著 テクノプレス ISBN4-924998-11-7

とても参考になるWebページ: http://t16web.lanl.gov/Kawano/gnuplot/

警告!

HTMLファイルなど各種ファイルを作成する時に「ひらがなや漢字を含む日本語」をファイル名に用いている者が散見される.Webページを構成するファイルに日本語を用いた場合,ブラウザでのアクセス・表示に支障が出る(例えば,Safariでは見えるがFirefoxでは表示出来ないなど)などロクな事にならない.また,C言語やJava言語のプログラミングにおいても日本語ファイル名は色々なトラブルを引き起こす.

きちんと技術的に分っていれば,「どのような場合にファイル名に日本語を用いても大丈夫」なのか判断できるが,それが理解できるようになるには,コンピュータの原理・仕組みをかなり熟知する必要がある.そのため,作成・保存するファイル名にはアルファベット英数字(「英数」キーを押して日本語変換オフ状態で入力される文字)だけに限定しておく事を強く強く勧める.(もちろん,課題のWebページがWebブラウザ画面で表示出来なければ「未提出」として扱われるし,採点者がSafariを使うとは限らない.)

GNUPLOTの起動と二次元グラフ描画

GNUPLOTは,本来はUNIX上のX-Window System向けに開発されているプログラムである.CSE環境では,これをMac OS X向けの改造が加えられたGNUPLOTを用いる.

これから,様々なファイルを作成するので,それらを置いておくディレクトリplotをホームディレクトリに作成しておこう.Finder上から新しいフォルダを作成しても良いし,ターミナルを一枚開いて以下のコマンドを実行しても良いだろう.

mkbka001(601)$ cd
mkbka001(602)$ mkdir plot

ディレクトリが準備出来たら,GNUPLOTを起動してみよう.CSE環境上でGNUPLOTを起動するには,「アプリケーション」フォルダのgnuplot.appをダブルクリックして開く.

新しいターミナルが一枚開かれて,

gnuplot>

というプロンプトが表示されるので,ここにGNUPLOTへの指示コマンドを「キーボードからタイプ」することで操作する.また,各種グラフを描画すると自動的にX-Window System (XQuartz.app)が起動するようになっている.(XQuartz.appの起動には少し時間が掛かるので,気長に待つべし.)

ここで,起動直後はカレントディレクトリがホームディレクトリになってしまっているので,以下の指示コマンドcdを実行して,GNUPLOTで作業するカレントディレクトリをplotディレクトリへ変更しておこう.

gnuplot> cd "plot"

尚,GNUPLOTのプロンプト上でディレクトリを変更する為にcdコマンドを用いる場合,移動先のディレクトリ名は引用符 (")で囲まないと上手く移動できない.

また,GNUPLOTが動作しているカレントディレクトリを確認するには,pwdコマンドを用いる.

gnuplot> pwd

GNUPLOTを終了するには,exit又はquit又はC-dをGNUPLOTのプロンプトに対してタイプしたのち,ターミナルのウィンドウを閉じる.

注意: 自宅でGNUPLOTを利用できるようにMacBookにGNUPLOTをインストールする場合,GNUPLOT.appアイコンは「所定のフォルダ」に置かないと動きません.「所定のフォルダ」については,こちらのページの記載を参照してください.

簡単な二次元グラフの描画

二次元グラフを描かせる場合,

y=xに関する関数式

という形式の関数をまず想定する.そして,この関数式をGNUPLOTのプロンプトに対して

gnuplot> plot xに関する関数式

とタイプすれば良い.

練習:以下の関数のグラフ描画を行ってみよ.

y=x
y=x**2-1

尚,べき乗は ** で表す.

また,

gnuplot> replot

を実行してみよう.ちなみにreplotコマンドは,直前に描画させたグラフを再描画するコマンドである.

更に,

y=sin(x)のグラフ
y=cos(x)のグラフ
y=sin(x)とy=xが両方同時に描画されたグラフ

のグラフを描いてみよう.

ここで複数のグラフを同時に描くには,

gnuplot> plot cos(x), x

というように,それぞれのグラフを表す式をコンマで区切って指示すれば良い.

尚,GNUPLOTへコマンドを入力するときは,Emacsやシェルコマンド操作と同様にC-p,C-n,C-f,C-b,または,矢印キーで過去に実行したコマンドの実行、またはカーソル移動を使うことが出来る.もちろん矢印キーも利用できる.

練習

幾つかの思いつくかぎりの関数グラフ(二次関数,三次関数,三角関数,対数関数など)について,入力して描画してみよ.

グラフ表示の調整

y=sin(x)/xを描画してみよ.このグラフの各軸における表示範囲を変更するには,

gnuplot> set xrange [-20:20]
gnuplot> set yrange [-2:2]

といったコマンドで変更できる.

ここで注意すべきことは,表示範囲を一旦変更すると,その後も引き続いて同じ範囲でグラフが表示され続けることである.例えば,

gnuplot> plot x**2-1

として新しい別のグラフを描いても範囲は変更したままで表示されるので驚かないように.

グラフ描画範囲を初期設定状態に戻すには

gnuplot> set autoscale

とする.

各軸のタイトルの変更

グラフを描画する前に各軸の表題(ラベル)を以下の手順で変更できる.但し,CSE環境で使えるGNUPLOTではラベルに日本語文字は使えない.

gnuplot> set xlabel "X axis"
gnuplot> set ylabel "Y axis"

また,グラフ自体の表題をつけることも出来る.

gnuplot> set label "sample plot in lecture"

練習 ラベルを以下のように変更して,上記の y=sin(x)とy=xが両方同時に描画されたグラフを描画してみよ.

X軸: sample X parameter

Y軸: result

設定状態の保存

描画範囲などの設定を残しておき,後日の利用時に復元させるためには,設定状況をファイルに保存しておく.そのコマンドは

gnuplot> save "sample.plt"

という具合に保存するファイル名を引用符で囲んで指示する.拡張子は.pltでなくてもよいが,あとから分かりやすいようにつけておくことを勧める.

保存しておいた設定の読み込みコマンドは以下の通り.

gnuplot> load "sample.plt"

描画グラフの画像ファイルへの保存

描画グラフは適当な画像ファイルへ保存することができる.set terminal コマンドにより利用可能な出力ファイル形式の種類の表示やフォーマット指定が出来る.例えばラスターグラフィックス・フォーマットの一つであるPNG形式へ保存するなら,

gnuplot> set terminal png
gnuplot> set output "plot_sample.png"

というように出力先ファイルを設定した後,グラフを描画させると画面に表示される代わりに画像ファイルとして保存される.

gnuplot> plot xに関する関数式(又は replot

上記の例では,カレントディレクトリ(plotディレクトリ)にplot_sample.pngファイルが生成される.確認のため生成されたPNGファイルを開いて画面表示してみよう.

また,ファイル出力させた後は,画面にグラフが描画されるように設定し直さないと,いつまでもグラフが同じファイルへ出力されてしまうので注意して欲しい.つまり,画像ファイルへの保存を指示した状態では,グラフを描画するたびに,前のファイルを削除して新しいグラフ画像ファイルに入れ替えられてしまう.

グラフ表示を元の画面表示に戻すには以下のとおりにする.

gnuplot> set terminal x11

注: ファイルへグラフ出力する場合,指示したファイル形式によっては(特に,PDFやPS形式),再描画だけでは画像ファイルが正常に作成されない場合がある.確実に画像ファイルが作成されるようにするには,画像ファイルへの出力を操作した後,一旦,グラフが画面表示となるように戻しておいてから,もう一度,再描画操作を行えば,大丈夫なようである.具体的には,次のような操作手順となる.

gnuplot> set terminal png (PNG形式ファイル出力へ切り替えを指示)
gnuplot> set output "sample.png" (sample.pngという名前のファイルへの出力を指示)
gnuplot> replot (グラフを再描画,ここではファイルへ出力される)
gnuplot> set terminal x11 (一旦,グラフ出力へ画面表示へ切り替える)
gnuplot> replot (念のため,画面上へグラフを再描画)

以上をまとめると,上手く画像ファイルへ出力させるためのコツは,それぞれ描きたいグラフ毎に,

  1. 画面上にグラフを表示させて,正しいグラフになっていることを確認する.
  2. 画像ファイルへ出力することを指示する.
  3. グラフを描画させる.
  4. set terminal x11を実行して,グラフ出力を画面表示に切り替える.
  5. 念のため,もう一度グラフを再描画する.(これでほぼ確実に画像ファイルが作成される.)

という手順を繰り返せば良い.

また,ファイル出力を指示する時に同じファイル名を指示してしまうとファイル内容が上書き保存されて置き換わってしまうので,指定するファイル名が重ならないように注意すること.

尚,出力先ファイルはグラフ出力を画面表示からファイル出力へ切り替える毎に忘れずに指示しておく必要がある.忘れるとGNUPLOTが動いているターミナルへ「標準出力」されてしまって,怪しげな文字がターミナル上に表示されてしまい,最悪の場合はキーボード操作に応答しなくなるから要注意である.
応答しなくなった場合は,止むを得ないのでターミナルウィンドウを一端閉じてからGNUPLOTを改めて起動すること.

課題その1 以下のグラフを描画せよ

y=x**2-2*x-3
    X軸の範囲-5から15まで
    Y軸の範囲-10から20まで

三次元グラフの描画

まず,表示範囲をデフォルト状態(初期状態)に戻しておこう.

gnuplot> reset

あるいは,一旦,GNUPLOTを終了して,再度起動しても初期状態へと戻るが,カレントディレクトリもホームディレクトリへ戻ってしまう事に注意しよう.

3次元グラフの考え方は2次元グラフと同様に描きたい図形を

z = xとyの関数式

という形式の空間図形の方程式で考える.この図形をグラフ表示には,GNUPLOTのコマンドとして

gnuplot> splot xとyの関数式

を実行する.

練習

以下を実行して,三次元グラフを描画してみよ.

gnuplot> splot x**2+y**2
gnuplot> splot sin(x)*cos(y)
gnuplot> splot sin(x)*cos(y), x**2+y**2 with points

三次元グラフ描画状態の調整

三次元グラフもグラフ化したい描画範囲の設定は二次元グラフの場合と同様に設定できる.

gnuplot> set xrange [-20:20]
gnuplot> set yrange [-2:2]
gnuplot> set zrange [-2:5]

また,グラフを眺める視点位置(view point)の角度も,次のように調整する事が出来る.3次元プロットの結果は初期状態ではX軸周りに60度,Z軸回りに30度回転された状態でプロットされる.これはset viewコマンドで変更できる.

gnuplot> set view X軸回りの回転角, Z軸回りの回転角

また,最新版のGNUPLOTでは,3次元プロットの表示回転角を矢印キー,又は,マウスで操作することも出来る.

また,各軸やグラフの表題も二次元の場合と同様に変更する事が出来る.

gnuplot> set xlabel "X axis"
gnuplot> set ylabel "Y axis"
gnuplot> set zlabel "Z axis"

グラフのPDF形式ファイルへの出力(プリンタ印刷などへの利用の場合)

グラフをPDF形式で出力するには,次のように操作する.

gnuplot> set terminal pdf
gnuplot> set output "plot_graph.pdf"

この状態でplotコマンドでグラフ描画する操作を実行すると,印刷に利用できるPDF形式にてグラフがファイルplot_graph.pdfへ保存される.

このPDF形式で保存されたグラフィックスはアウトライングラフィックスになっており,極めて高品質な印刷が出来る.

注: ファイルへグラフ出力する場合,特に,PDFやPS形式への出力の場合,再描画だけでは画像ファイルが正常に作成されないようである.確実に画像ファイルが作成されるようにするには,こちらの箇所を参照してください..

課題その2

まず,グラフの表示範囲を標準状態にリセットせよ.次に,以下のグラフを描画せよ.

z=x**2+y**2の曲面S,及び,Z軸に垂直でSに接する平面Pについて,SとPの両方を三次元グラフとして同時に描いたもの

また,結果グラフをPDFファイルとして保存し,それをプレビュー.appで開いてみて,拡大縮小などの操作を行っても品質が維持されているアウトライングラフィックスとなっている事を確認せよ.

ファイルが正しく出来ている事を確認できたら,そのファイルをlprコマンドを用いてプリンタから印刷せよ.

グラフのスタイル変更

グラフの表示スタイルには,以下のようなものがある.

これらのスタイルでグラフ描画するには以下のように行う.

gnuplot> plot 関数式 with スタイル指定

練習

y=sin(x)のグラフを

で表示してみよ.

尚,グラフ刻みの細かさは

gnuplot> set sample サンプル数

で変更できる.例えば,

gnuplot> set sample 200
    または
gnuplot> set sample 10

などと指定してからグラフを再表示させてみよ.

データプロット

GNUPLOTでは,単に数学的なグラフを作成するばかりでなく,事前に用意しておいたデータファイルを読み取り,そのグラフを描画できる.

この機能を使えば,例えば何かの実験を行って採取した結果を美しくグラフ化し,或いは,それをグラフィックスファイルとして保存して報告書作成に活用するといった作業が行える.

二次元データプロット

二次元データプロット(X-Y平面グラフ)を描画するには,以下のような形(書式)になっているデータファイル(テキストファイル)が必要となる.

#記号で始まる行はコメントとして扱われるので,グラフ描画には無関係な行として無視される.
# 但し"#"は1バイト文字であって,2バイト文字記号"#"ではない!
X座標の値 SPACEまたはTAB(何個でも良い) Y座標の値
X座標の値 SPACEまたはTAB(何個でも良い) Y座標の値
X座標の値 SPACEまたはTAB(何個でも良い) Y座標の値
X座標の値 SPACEまたはTAB(何個でも良い) Y座標の値
X座標の値 SPACEまたはTAB(何個でも良い) Y座標の値
X座標の値 SPACEまたはTAB(何個でも良い) Y座標の値
		(以下省略)

このようなデータファイルが用意できたら,これを以下のようにplotコマンドの引数で与えれば,データプロットされる.

gnuplot> plot "データファイル名"

練習

例えば,以下のような内容のテキストファイルtest_plot.datをEmacsを用いて,現在作業中のカレントディレクトリplotに作成せよ.各データの間は SPACE 又は TAB で区切ること.

# test_plot.dat
-3 9
-2.5 6.25
-2 4
-1.5 2.25
-1 1
-0.5 0.25
0 0
0.5 0.25
1 1
1.5 2.25
2 4
2.5 6.25
3 9

このファイルに対して,GNUPLOTのプロンプトで以下を実行してみよ.(但し,test_plot.datファイルがGNUPLOTの作業ディレクトリに配置されている必要がある.)

gnuplot> plot "test_plot.dat"

また,プロットグラフと関数式グラフを重ねて同時に描くことも可能であり,これにより実験測定値と理論値を比較するようなグラフを得る事が出来る.

例えば,次のように指示する.

gnuplot> plot "test_plot.dat", 2*x

複数のプロットグラフを同時に描画する場合は

gnuplot> plot "test1.dat", "test2.dat"

などとすること.

グラフのスタイルを変更するには

gnuplot> plot "test_plot.dat" with impulses

という具合に指定する.

グラフの連結について

データプロットする際,作成するデータにむやみに改行を加えるとプロット結果に影響を与える事があるから注意が必要である.

先ほど作成したtest_plot.datファイルを再度Emacsで読み込み,以下のように空行を2行ほど追加して保存してみよう.

# test_plot.dat
-3 9
-2.5 6.25
-2 4
-1.5 2.25

-1 1
-0.5 0.25
0 0
0.5 0.25
1 1
1.5 2.25

2 4
2.5 6.25
3 9

上記のようにデータファイルを修正した上で,このファイルに対してlinespointsスタイルでデータプロットするとどのように表示されるだろう?

gnuplot> plot "test_plot.dat" with linespoints

linespointsスタイルで表示されるグラフが部分的に切れた状態になっているはずだ.

以上より分かるように,2次元データプロットをlinespointsスタイルなどで行う場合,データファイルに空行を入れてしまうとグラフの繋がりが切れてしまうから,不必要な空行は入れてはならない.(但し,意図的にグラフを切断して描画したい場合は適切な箇所を狙って空行を入れれば良い.)

課題その3

ある実験データファイル

がある.これはある交流電圧信号を記録したものであり,理論上は正弦曲線 y=10*sin(x) を描くはずだが若干のノイズが含まれていて多少の測定誤差が生じているものと仮定する.

この測定誤差を確認出来るようなグラフを描画せよ.尚,作業にあたっては,このデータファイルを各自の作業ディレクトリにコピーの上,linespointsスタイルでグラフとすること.

課題その4

さらに別の実験データファイル

がある.この実験結果において,xとyの値は理論的にy=10*cos(x)を満たすはずだが,記録されたデータには若干の誤差が含まれていると仮定する.

この実験データと理論値の比較が出来るようなグラフをpointsスタイルで描画せよ.

三次元データプロット

二次元の場合と同じように三次元データ(X, Y, Z各座標値の組)プロットも,以下のような書式データを用意することで可能である.

#記号で始まる行はコメントとして扱われるので,グラフ描画には無関係な行として無視される.
X座標の値 SPACEまたはTAB Y座標の値 SPACEまたはTAB Z座標の値
X座標の値 SPACEまたはTAB Y座標の値 SPACEまたはTAB Z座標の値
X座標の値 SPACEまたはTAB Y座標の値 SPACEまたはTAB Z座標の値
X座標の値 SPACEまたはTAB Y座標の値 SPACEまたはTAB Z座標の値
		(以下省略)

練習

データファイル

を各自の作業ディレクトリへコピーし,このデータファイルの3次元プロットを描いてみよ.コマンドは以下のとおり.

gnuplot> splot "sample_3d.dat"

また,グラフ表示スタイルを色々なスタイルに変更して表示してみよ.

三次元データプロットの連結について

三次元データプロットをlinespointsスタイルなどで表示させたい場合,ちょっとしたコツが必要であるが,これは次のように考えると良い.

プロットした点データのn個をグループにまとめてデータファイルに並べると,それらが表す空間点を順番に直線で結合した折れ線が描画される.そのn個の点座標データが続いた後に「空行を1行空けて」から次のn個の点データグループを並べると,それらの点を結んだ折れ線が描画され,それと同時に,折れ点の1番目同士,2番目同士,....,n番目同士をそれぞれ結んで「折れ面」を描画してくれる.

以下同様にして,n個の点データ行を並べる毎に空行を1行入れることで,3次元曲面(疑似曲面)がプロットされてゆく.

プロットされた結果グラフは,デフォルト状態では画面右下を原点とし,左斜め上方向がX軸,右斜め上方向がY軸,真上方向がZ軸となるように表示される.

次のファイルは上記の考え方に基づいて作成されている.

このファイルを各自の作業ディレクトリにコピーして,linespointsスタイルで三次元プロットしてみよう.表示範囲は適当に調整して良い.

gnuplot> splot "3d.dat" with linespoints

ここで,n個の点データを区切る空行を「2行以上」にしてしまうと,「折れ面の繋がり」が切れてしまう.また,それぞれのグループの点座標データの個数がn個に揃っていないと,特にlinespointsスタイルで描かれるグラフがおかしくなってしまうことに注意する必要がある.

練習

3d.datをEmacsで読み込み,適当な区切り空行を一つ選び,それを2行連続の空行に修正して保存せよ.保存できたら再びlinespointsスタイルで描画してみよ.

さらに3d.datファイル中の空行をさらに3箇所程度を無作為に選び,その個所を2行連続の空行に修正して保存し,その3次元グラフを描画して,グラフがどのように変化するか比べてみよ.

また,データ行をいずれか3ヶ所程度を無作為に選んで削除してから保存せよ.この状態で3次元グラフをプロットすると,グラフはどのようになるか?

提出課題

課題その5

データファイル

を作業ディレクトリに改めてコピーし直して,以下の条件で三次元グラフを描画せよ.尚,グラフのX, Y, Z軸の描画範囲は見やすく適当に調整すること.

視点について,全く回転しない(回転角はX軸・Z軸共に0となり,Z軸方向から原点を見下ろすように描画される).但し,描画スタイルはlinespointsとする.

また,各軸のラベルは

と設定しておくこと.

課題その6

課題その5のグラフの条件を以下のように変更したグラフを描画せよ.

視点について,X軸周りに45度回転した(Z軸の回転角は0)場合,但し,スタイルはimpulsesとする.

課題その7

課題その5のグラフの条件を以下のように変更したグラフを描画せよ.

視点について,Z軸周りに60度回転した(X軸の回転角は0)場合,但し,スタイルはpointsとする.

課題その8

課題その5のグラフの条件を以下のように変更したグラフを描画せよ.

視点について,X軸周りに20度回転,Z軸周りに40度回転した場合,但し,スタイルはlinespointsとする.

課題提出要領

課題2については,生成したPDFファイルをlprコマンドでプリンタ印刷し,各自の学生番号と氏名を記入(手書きでOK)の上,提出すること.(プレビュー.appを使って学生証番号・氏名を書き込んでも良い.)ファイルのプリント方法はこちらの資料ページを参照のこと.

課題2の提出期限: 教員の指示による

課題1, 3, 4, 5, 6, 7, 8については,グラフをPNG形式の画像データとしてファイルに出力して保存せよ(注:スクリーンショットを撮影するという意味ではないので注意すべし).これら合計7枚のPNG形式画像を一枚のページに貼り付けて,各画像がどの課題の結果であるのか判るようにしてWWWページを作成し,でき上がったページは以下の形式のURIでアクセスできるようにしておくこと.

提出期限:教員の指示による

基礎プログラミング演習Iの目次ページへ戻る