授業資料/12 の変更点


#CONTENTS

//  第 12 回 -- gnuplot

* gnuplot [#ob9b9900]

gnuplot とは,対話的にも非対話的にも用いることの出来る,CUI を通じた由緒正しいグラフ作成ツールである((1986頃には既に存在したはず)).
どちらかというとアプリケーションだが,コマンドラインから指示を出せるため機械的に大量にグラフを作成する際などはパイプの間に挟むコマンド風に用いることが可能である.
特徴としては,

&br;&br;
- 普通に使うには CUI 処理.全てをコマンドで指示するので明快.
- コマンドとしても使える.
- できることは,主に,函数をグラフにすることと,データをグラフにすること.
- Postscript 形式や SVG 形式で出力できる.これはグラフをベクター形式で出力できることを意味する.
- TeX と相性が良い.TeX 用の特殊な設定をすることも可能((普通は Postscript を使ったほうが素直で扱いやすいが,TeX のコードで図を書きたい時などにはとても便利.)).
&br;&br;

というところが挙げられる.

&br;&br;
** Reference: 参考資料 [#vef19809]

&br;
- [[&ref(/materials/JNorth_arrow-right-sm.png); gnuplot:http://www.gnuplot.info]]
… gnuplot 本家 web. 最新版もドキュメントもここにある.最新バージョンは現時点では 4.7cvs.

&br;
- [[&ref(/materials/JNorth_arrow-right-sm.png); gnuplot のページ(Takeno Lab):http://takeno.iee.niit.ac.jp/~foo/gp-jman/gp-jman.html]]
… gnuplot のマニュアルの日本語訳.ほぼ最新版まで揃っている.ありがたく読ませてもらおう.

&br;
- [[&ref(/materials/JNorth_arrow-right-sm.png); GNUPLOT - not so Frequently Asked Questions - :http://t16web.lanl.gov/Kawano/gnuplot/index.html]]
… gnuplot の入門だけでなく,「こうしたい時には」という howto が沢山書いてある.ひと通り目を通したい.

&br;&br;
他にも,web 上には gnuplot について書いたものや,書籍が沢山ある.
自分にあったものを探してみよう.
ちなみに,&color(red){gnuplot に関する日本語書籍は希少};なので,見かけたら買っておくぐらいの勢いが必要だ((そうしないと必要なときには入手できず,後悔すること必至である)).

ちなみに,&color(red){gnuplot に関する日本語書籍は希少である};ので,見かけたら買っておくぐらいの勢いが必要だ((そうしないと必要なときには入手できず,後悔すること必至である)).


&br;&br;
** 101 of gnuplot: 基礎 [#c804e0ce]

*** Ability: なにが出来るのか [#l2398a2d]

上の本家 web の ''demo gallery'' へアクセスし,どのようなことが出来るのかざっと見ておこう.
文字を読まずにざっと図を見るだけでも,何が出来るかおおよそ把握できると思う.


*** begin, end and help: 起動,終了,ヘルプ [#k407a75a]

- gnuplot を起動するには,コマンドラインで
> ''gnuplot''
<
と入力すれば良い.
gnuplot が起動して,コマンド受付モードになる(プロンプトが変わるのでわかるだろう).
//
- gnuplot を終了するには,gnuplot のコマンドとして
> ''exit''
<
もしくは
> ''quit''
<
でよい.
//
- gnuplot のヘルプは,gnuplot を起動してから,CUI ならそのコマンドとして
> ''help''
<
もしくは
> ''?''
<
とする.
GUI アプリケーションとして実体を持っているならばヘルプボタンがあるだろうからそれを押しても良いだろう.
&br;
いずれにしてもヘルプは多層構造になっていてちょっと読みにくいので,上の本家 web からマニュアルをダウンロードして読む方が良い(マニュアルは普通の作りで読みやすい).

* The easiest example: ごく簡単な例 [#hc7e7b7a]

以下のようにして,まずは試してみよう.

&br;&br;
&ref(/materials/notes.png); 実習: 
以下の手順に従い gnuplot を動かしてみる.&br;

+ まず,gnuplot を起動する.
&br;&br;
+ 次に,gnuplot の中で次のコマンドを一行ずつ打ち込もう.
>''set&#9251;samples&#9251;300''
>''plot&#9251;[-30:30]&#9251;sin(x)/x''
>''set&#9251;term&#9251;png''
>''set&#9251;output&#9251;"sample-01.png"''
>''replot''
>''exit''
<
&br;&br;
+ 問題がなければ,sample-01.png という,&br;
&ref(./gnuplot-sample.png);&br;
画像ファイルができているので,見てみよう.
(阪大教育用システムが画像閲覧ツールをどう設定しているか不明なので) GUIでそのファイルをマウスでダブルクリックするのが安全だろう.

* Plot of functions: 函数を描く [#f650ece1]

上の例からわかるように,gnuplot は ''plot'' コマンドで与えた函数をそのままグラフに描くことができる.
函数は既に与えられているもの(''help&#9251;functions'' で見ることが出来る)の他に,自分でも作ることができる.
&br;
例えば,
>''f(x)=x*x+2*x+1''
<
とすると函数 f(x) として x^2+2x+1 を定義したことになり,
>''plot&#9251;f(x)''
<
とすればこの二次多項式のグラフを描くことが出来る.

** Options for function plot: 函数を描く時のオプション [#a36c79a9]

plot に対して,細かくいろいろ変えたいという場合は次のようにすればよい.

&br;&br;
- もう一度(同じ関数等を)描きたい.&br;
>''replot''
<
とすれば, 最も最近の plot か splot(後述) を再実行する.
&br;&br;
- グラフの描き方を変えたい. &br;
gnuplot に関数を描かせると通常は線分で繋がれるが,これを点で表したい時などは次のようにすればよい((with points と真面目に書かずに, w p とするだけでも良い.)).
> ''plot&#9251;sin(x)&#9251;with&#9251;points''
<
with に続けて使えるオプションには points の他に lines, linespoints, impulses, steps, dots, boxes などがある.
&br;&br;
- 描画する範囲を変えたい.&br;
> ''plot&#9251;[-3:3]&#9251;[-1.2:2.0]&#9251;sin(x)''
<
等とすればよい. 一つ目の [a:b] が x軸の範囲を表し,二つ目が y軸の範囲を表す.
&br;&br;
- 表示に使う「点」の数を増やしたい.&br;
「点」の数が少なすぎてグラフが粗くなって,正しく表示されないというような場合は, plot の前に
>''set&#9251;samples&#9251;使う点数''
<
を入力しておけば良い.
&br;&br;
- 二つ以上の関数を同時に表示したい.&br;
> ''plot&#9251;sin(x),&#9251;cos(x)''
<
などと ,(カンマ) で区切って書くだけで良い.

&br;&br;
&ref(/materials/notes.png); 実習: 
上の様々なオプションを試してみよう.

* Plot of 3D functions: 3次元グラフを函数で描く [#e0aa44cf]

さらに,''splot'' というコマンドを使うと3次元グラフを描くことが出来る.
例えば gnuplot 中で
> ''splot&#9251;x**2+y**2''
<
としてみよう.
さらに,出てきたグラフをマウスで掴んで動かしてみよう.
様々な視点から3次元グラフを自由に見ることが出来るはずだ.

** Options for 3D function plot: 3D で函数を描く時のオプション [#o8f32256]

splot に対して,細かくいろいろ変えたいという場合は次のようにすればよい.

&br;&br;
- 描画する範囲を変えたい. &br;
> ''plot&#9251;[-3:3]&#9251;[-1.2:2.0]&#9251;[-2:3]&#9251;x**2+y**2''
<
等とすればよい. 一つ目の [a:b] が x軸の範囲を表し,二つ目が y軸の範囲を, 三つ目が z軸(高さ)の範囲を表す.
&br;&br;
- 表示に使う「点」の数を増やしたい. &br;
「点」の数が少なすぎてグラフが粗くなって,正しく表示されないというような場合は, splot の前に
> ''set&#9251;isosamples&#9251;使う点数''
<
とすれば良い.
処理が重くなるので,あまり大きな数字を与えないように.
&br;&br;
- 等高線を表示したい.&br;
splot の前に
> ''set&#9251;contour''
<
もしくは
> ''set&#9251;contour&#9251;both''
<
と入力しておけばよい. both をつけないと底面にのみ等高線図が描かれ, both をつけると面表示にも等高線が描かれる.
&br;
> ''unset&#9251;contour''
<
とすれば,これ以降は等高線は描かれない.
&br;&br;
- 隠面処理をしたい. &br;
> ''set&#9251;hidden3d''
<
としてから splot すると隠面処理が行なわれる.&br;
> ''unset&#9251;hidden3d''
<
とすれば隠面処理は無効になる.
&br;&br;
- 視点を変えたい.&br;
> ''set&#9251;view&#9251;45,&#9251;80,&#9251;0.8''
<
などとしてから splot すると,指定した視点と縮尺で3次元グラフが描かれる. 最初の 45 は z軸(高さ軸)と視線の角度を, 次の 80 は上から見たときの x軸と視線の角度を, 最後の 0.8 はグラフの高さのスケール比を表す. 
&br;&br;
- 高さに色を付けて見たい. &br;
> ''set&#9251;pm3d''
<
としてから splot すると高さに応じた色で面を塗ってくれる.
少し処理は重くなる.
> ''unset&#9251;pm3d''
<
とすれば元に戻る.

&br;&br;
&ref(/materials/notes.png); 実習: 
上の様々なオプションも試してみよう.

* Plot of data: データをグラフに [#vc27ccac]

もちろん,函数だけでなく,データをグラフにすることも出来る.
次のようにして確かめてみよう.

&br;&br;
&ref(/materials/notes.png); 実習: 
次の指示に従って試してみよう.

+ テキストエディタ等で,次の内容を持つファイルを作成する.
ファイル名は dummy.dat としておこう.
    1   1.0
    2   4.0
    3   9.2
    5   8.3
&br;&br;
+ gnuplot を起動.
&br;&br;
+ gnuplot 中で,
> ''plot&#9251;"dummy.dat"''
<
としてみる.
4つの点が打たれたグラフが描かれるはずだ.
&br;
これだと見にくいなあ,という場合は
> ''plot&#9251;"dummy.dat"&#9251;w&#9251;l''
<
とすれば,データ点を繋いだ線グラフになるし,さらに
> ''plot&#9251;"dummy.dat"&#9251;w&#9251;lp''
<
とすればデータに点も打たれる.

&br;&br;
&ref(/materials/notes.png); 実習: 
自分で適当なデータファイルを作成し,そのデータを数値グラフ化してみよ. 

* Save graph files: グラフをファイルに保存 [#hb24466b]

得られた画像をファイルに出力したい,というときは,
&br;&br;
+ 保存する画像形式を指定する.
+ 保存するファイル名を指定する.
+ もう一度画像を描く
+ 画像形式とファイル名を「リセット」する. リセットしないと,次に画像を描いたときに動作がわからなくなる.

&br;
という手順が必要である.
&br;&br;
残念なことに,基本的には&color(red){今見えている画像をただちにファイルへ保存する機能は存在しない};ので,この手順を理解しよう.

** How to set "file format": 画像形式の指定とリセットの方法 [#s615ee85]

まず,保存する画像の形式を指定する必要がある.
その為には,gnuplot 上で
> ''set&#9251;terminal&#9251;画像形式&#9251;オプション''
<
として指定する((使える画像形式とオプションは非常に多いので,ヘルプとマニュアルを確認しておこう.)). 
&br;
簡単にリストアップしておこう.
&br;&br;

■ 画像形式の指定とリセットの例 ■
| 画像形式  | コマンド組み合わせ |h
| png  | ''set&#9251;terminal&#9251;png'' |
| Postscript  | ''set&#9251;terminal&#9251;postscript&#9251;eps&#9251;22'' |
| リセット (unix の場合)  | ''set&#9251;terminal&#9251;x11'' |
| リセット (windows の場合)  | ''set&#9251;terminal&#9251;wxt''&br; もしくは&br; ''set&#9251;terminal&#9251;windows'' |

** How to set "file name": 画像ファイル名の指定とリセットの方法 [#jd04377e]

保存する画像のファイル名も指定する必要がある.
その為には,gnuplot 上で
> ''set&#9251;output&#9251;ファイル名''
<
として指定する.
&br;&br;
ファイル名のリセットには,
> ''unset&#9251;output''
<
とすればよい.

** ... What?: 結局どうすれば良いのか [#r793a6e9]

よく分からん… という者も多いだろうから,unix での例をあげておこう(Windows の場合は下記の x11 という部分を win としておけばよい). 
今描かれている図をファイルに保存したい,という時はとにかく次のようにすればよい.
&br;&br;

■ グラフをファイル化するコマンド組み合わせ例 ■
| 画像形式  | コマンド(順番に実行する) |h
| png  | &br;''set&#9251;terminal&#9251;png&#9251;color''&br; ''set&#9251;output&#9251;'hoge.png'''&br; ''replot''&br; ''set&#9251;terminal&#9251;x11''&br; ''unset&#9251;output''&br; |
| Postscript | &br;''set&#9251;terminal&#9251;postscript&#9251;eps&#9251;22''&br; ''set&#9251;output&#9251;'hoge.eps'''&br; ''replot''&br; ''set&#9251;terminal&#9251;x11''&br; ''unset&#9251;output''&br; |

&br;&br;
&ref(/materials/notes.png); 実習: 
適当なグラフを作り,png 形式や postscript 形式で保存しよう.

* How to use the gnuplot as a command: 非対話的に gnuplot を使う [#i009c61a]

gnuplot を非対話的に使う(コマンドとして使う)のは簡単だ.
対話的に入力するのと同じ内容をファイルに書いておき,そのファイル名をコマンドのオプションとして与えれば良い.
わかりやすく実習を通じて試してみよう.

&br;&br;
&ref(/materials/notes.png); 実習: 
+ sin2png.gpl という名前のファイルを作り,以下の内容を書き込む.
  set term png
  set output "f_sin.png"
  plot sin(x)**2
&br;&br;
+ このファイルがあるディレクトリにて,
> ''gnuplot&#9251;"sin2png.gpl"''
<
として gnuplot をコマンドとして使おう.
このように指示書を与えると,gnuplot はコマンド的に扱える.
&br;&br;
+ 問題がなければ,f_sin.png という画像ファイルができているので,見てみよう.

&br;&br;
この機能があるので,シェルスクリプトなどから gnuplot を呼び出して機械的にグラフ画像ファイルを作ることが簡単にできる.

&br;&br;
* Report: レポート [#mc75a908]

以下の課題について能う限り賢明な調査と考察を行い,
&br; 
''AppliedMath7-Report-12''
&br;
という題名をつけて e-mail にて教官宛にレポートとして提出せよ. なお,レポートを e-mail の代わりに TeX で作成した書面にて提出してもよい.  

** Exercises: 課題 [#ra06ea15]

+ sin(x), sin(x+0.1), ... sin(x+1.0) の 11個の函数グラフを同時に描いたグラフをひとつ作る.
次に,始点を少しずらした
sin(x+0.1), ... sin(x+1.0), sin(x+1.1) の11個の関数グラフを同様に同時に描いたグラフをひとつ作る.
これを繰り返し,
sin(x+1.0), ... sin(x+1.9), sin(x+2.0)
の11個の関数グラフを同様に同時に描いたグラフをひとつ作るところまでやる.
この一連の作業をなるべく楽にやるにはどうしたらよいか考えよ.
&br;
&br;
+ 前回の内容で gnuplot を用いている.
その用い方について解説せよ.
&br;
&br;
+ 毎日一度ずつ,シェルスクリプトを通じて gnuplot を呼び出してグラフ画像ファイルを作らせておくとよさそうな例を考えよ.

&br;&br;
* about Icons, ClipArts [#p358b0f4]

For details, see [[&ref(/materials/JNorth_arrow-right-sm.png); this>materials]].

// ━┃┏┓┛┗┣┳┫┻╋


// コマンドライン入力は「行頭を > で始める」.
// コマンドライン出力は「行頭をブランクで始める」.

// 実習アイコン
// &ref(/materials/notes.png); 

// 注意アイコン
// &ref(/materials/warning.png);

// Link アイコン
// &ref(/materials/JNorth_arrow-right-sm.png);

// OK アイコン
// &ref(/materials/OK.png);

// NG アイコン
// &ref(/materials/NG.png);

// サンプルアイコン
// &ref(/materials/Gnome-Preferences.png);

// 大文字での強調 
// CENTER:&size(24){''ほげほげ''};

// programu source 表記
// #highlighter(language=ruby,number=on,cache=on){{}}

// パイプ
// &brvbar;

// 空白記号
// &#9251;

// タブ記号
// &#9225;