Gnuplot入門クイックツアー 二次元グラフ描画で困らなくなるまで

[投稿日] 2015年10月10日
[最終更新] 2016年8月10日

本記事は、Linuxなどですぐにインストールして使えるグラフ描画ソフト、Gnuplotの入門記事です。インストールについては特に解説しませんが、二次元グラフを実際に描画することを通して、ざっと使えるようになることを目指します。

スポンサーリンク

はじめに

この記事は、私が大学生だったとき…すなわちもう数年前のことですけれど(遠い目)、同期や他の人が効率よくGnuplotで必要な知識を学べるようにと作成した資料をネタ元にしています。したがって、内容としては若干古いのですが、Gnuplot自体が古いソフトウェアですので、内容に関しては問題ないと思います。長く使える知識です。

二次元のグラフを描画し、保存して利用するのに、私が必要だと思う知識について、なるべく最初の段階から(インストールは他記事に譲りますが)わかりやすく記述したつもりです。手元に実行できる環境をおいて、まずは実際に手を動かしながら一通り通せば、後はなんとなりなるだろうと思います。元の資料では三次元グラフの描画についても書いていたのですが、中途半端であったことと、私自身が現在三次元グラフをまるで描く機会がなく使っていないので、三次元グラフについては本記事の対象外とします。

目標

Gnuplotは古いソフトウェアですから、そのコマンド体系は決してわかりやすいとは言えませんが、昨日の新機能が明日陳腐化するこのIT業界において、なお生き残っている稀有なプロッターでもあります。その機能は膨大であり、とても1記事で書けるようなものではありませんし、また私もそんなに習熟していません。この記事の目標は、これからGnuplotを始める人が、最初の壁とも言えるとっかかりを超えて、後は自分でなんとなりできる状態になるようになることです。

なお、Gnuplotはクロスプラットフォームなので、Windowsでも使用することができますが、当記事ではUnixで使用することを前提としています。まぁ、インストールして環境変数さえしっかり設定すれば、大して変わらないと思いますが。

起動・終了方法

起動および終了方法について。

起動方法

端末より、gnuplot と入力することで、gnuplotを起動できます。

$ gnuplot

あらかじめファイルを作っておくことで、非対話的に実行することもできます(参考:「非対話的なgnuplotの実行」)。しかし、そのようなときはたいてい別にスクリプトがあり、外部プログラムとしてGnuplotを呼ぶと思いますので、私はあまり使いません。また、本記事はあくまでgnuplotの操作方法そのものについての記事ですので、非対話的な使い方についてはこれ以上言及しません。

終了方法

gnuplotを起動したら、quitコマンドで終了することができます。

quit

quitコマンドには省略形が存在し、以下のように q と入力しても終了することができます。

q

このように、Gnuplotのたいていのコマンドには省略形が存在します。文字数が少なくなり、見た目にもスッキリするのでオススメです。知らない人に読ませる上での可読性の面では最悪かもしれませんが…どうしてもそういう面はあります。

関数式からグラフを描画

基本として、まずはsin(x)のような関数式からグラフを描画します。

グラフ描画…plot(p),replot(rep)

plotコマンドで正弦波を書きます。

plot sin(x)

描けました。plotにも省略形があり、pと表記できます。

p sin(x)

ちなみにグラフを表示しているウィンドウがアクティブウィンドウの状態ならば、キーボードからでもqで閉じることができます。グラフを閉じたら、replotコマンド、あるいはその省略形のrepで、同じ図形をもう一度描けます。よく使うコマンドです。

rep

折れ線グラフ、棒グラフetcの描き方(with lines,with boxes,etc…)

グラフは折れ線で書いたり、棒グラフにしたり、離散的に描いたりできます。

p sin(x) with impulses ← 離散的
p sin(x) with lines ← 折れ線グラフ
p sin(x) with dots ← 散布図
p sin(x) with boxes ← 棒グラフ

まずは上の四つを覚えておけばだいたい対応できると思います。また、上三つは次のように省略可です。

p sin(x) w i
p sin(x) w l
p sin(x) w d

同時に複数のグラフを描く

同時に複数のグラフを描きたいときは、,(カンマ)を使います。

p sin(x) w d,cos(x) w i

x,yの範囲を指定…set xrange,yrange

xとyの範囲設定を行います。以下のコマンドを実行してみましょう。

p sin(x)
set xrange [-pi:pi]
set yrange [0.0:2.0]
rep

set ?rangeで範囲指定ができるということです。なお、piは円周率です。

設定の初期化…reset

一度設定すると、再設定するまでそのままです。元に戻したくなるときもあります。そんなときはresetです。

set xrange [-pi:pi]
p sin(x)
reset
rep

この後にでてくるsetなんちゃら系はすべてresetで初期化できます

対数グラフを描く

対数グラフも描けます。

p log(x) ←自然対数
p log10(x) ←常用対数
set logscale x
set xrange [1:10]
p log10(x)

残念ながらlog2()とかはありません。log10()あれば全部書けますが。

データ点の数の設定…set samples

次にsin(x^2)を描いてみます。ベキ乗は^ではなく**を使います

p sin(x**2)

するとこんなグラフができます。

9830682df5c91cae

明らかに何かが違います。次のコマンドを打ってみましょう。

set samples 1000
rep

すると下のようなグラフができます。

466bf0a5951926f9

グラフが滑らかになっています!どうも、gnuplotは初期設定だとデータ点100でグラフを描くみたいで、グラフによっては角張ってしまいます。グラフによっては全然違うグラフになってしまうことも…。そんなときに、set samplesはデータ点の数を変更するコマンドです。式でグラフを描くときはデータ点の数に留意しましょう。

データファイルを読み込んで描画する

実際にgnuplotを使うときには、取得したデータのファイルを読み込んで描画することが多いと思います。というわけで、次のテキストファイル ‎data.txt を読み込んでみます。適当にテキストファイルにでも落としてください。

データファイルを読み込んでグラフを描画(plot)

ではdata.txtを読み込んでグラフとして描画してみることにします。gnuplotを立ち上げるのですが、このときdata.txtがカレントディレクトリにある状態でgnuplotを起動させます。そうしないといけないわけじゃないけど、そうしないとdata.txtがどこにあるかをいちいち指定しなくてはなりません。

早速plotします。

p "./data.txt"

このとき、ファイル名の入力はtabキーで補完できます。

p "d

この時点でタブキーを押せば、上のp “./data.txt”に自動的に補完されるというわけです。このへん端末と同じですね。一応補足ですが、”./”の”.”はカレントディレクトリを表します。つまり「カレントディレクトリのdata.txtというファイル」という意味です。./がないと、gnuplotはカレントディレクトリの中を探してくれずdata.txtが見つからない…ということもなく、端末と違いgnuplotはカレントディレクトリを標準で探してくれるので、実は./は必要というわけでもないのですが、ただカレントディレクトリの中にありますよということを明示してるんだと思えばよいです。なお、ダブルクォーテーションはシングルクォーテーションでも問題ありません。

さて、グラフですが、一周期の正弦波が描かれたはず。ただ前節の「p sin(x)」と違って、折れ線表記じゃなく点を一つ一つプロットした形で表示されます。「折れ線にしたいぞー」という場合も多いと思うので、そんなときは前節の内容を思い出して、グラフの形状を設定します。with lines、すなわちw lです。

p "./data.txt" w l

もちろん「w i」ならインパルス状の棒で表現されます。

指定の列を読み込む…using(u)

ここで一度data.txtの中身を見てみることにします。半角スペースで区切られた形で、3列分のデータがあります。これがgnuplotoのデータファイルの標準形式(もちろんカンマ区切り、すなわちcsvなども読み込めますが設定の変更が必要、後述)。1列目がx軸、2列目がy軸として読み込まれてるということ。では3列目は?デフォルトの設定では、無視されます。1列目をx軸、3列目をy軸にするにはどうするのかというと、usingを使います。

p "./data.txt" using 1:3 w l

これで3列目が読み込まれて、余弦波が表示されます。usingはuとも省略されます。次に、2列目と3列目を同時に表示してみます。

p "./data.txt" u 1:2 w l, "./data.txt" u 1:3 w i

このようにして、データファイルは読み込めます。

なお、一列しかない場合、自動的にx軸は「0,1,2,3…」という風に割り振られます

データファイルを作るときには形式を意識してつくったほうが後が楽ですね。

データファイルの数値をいじる

データファイルの数値は、変数としていじることができます。たとえば、次に下のように打ってみます。

p "./data.txt" u ($1*(1000/64)):2

x軸が一気に変わります。列番号に$をつけることで、データファイルの数値を変数として扱えるわけで、スケール変換や単位変換などを楽にこなせます。

補足:カンマ区切り、csvのファイルを読み込む

例としてスペース区切りの標準形式のファイルを用意しましたが、実際にはデータはcsvであることが多いです。まぁ、csvをスペース区切りに変換してもよいのですが、できればそのまま読み込めたほうが手間がないですね。以下のコマンドで、csv形式を読み込むようになります。

set datafile separator ','

このコマンドを使えば、様々なデリミタに対応できます。

補足2:yyyy/mm/dd 形式などの時系列データを読み込む

X軸が2015/10/10など、時刻表記になっていることもよくあります。そのときは、次のように指定することが可能です。

set xdata time
set timefmt '%Y/%m/%d %H:%M:%S'
set format x '%m/%d\n%H:%M'
#set xrange ['2015/10/10 10:00:00':'2015/10/10 12:00:00']

set xrangeは必要に応じて。

補足3:複数の軸を使いたい

たとえば、複数のグラフをプロットしたとき、左のy軸と右のy軸で異なる単位を使いたい、などということもあります。この記事ではやや範囲を逸脱するので詳しくは述べませんが、「gnuplotで日付・時刻の書かれた時系列データをグラフに描いて保存するシェルスクリプト : 或る阿呆の記」に実行例がありますので、知りたい人は参考にどうぞ。

グラフの体裁を整える

前節までで描きたいグラフが描けるようになったとして、今度は軸に名前をつけたりグラフにタイトルつけたり、体裁を整える方法を書いていきます。

グラフにタイトルを付ける…set title

グラフにタイトルを付けるにはset titleを使います。

set title 'sin wave'
p sin(x)

x軸、y軸にラベル(名前)をつける…set xlabel,ylabel

軸には名前をつけることも必要です。そんなときはset ?labelで引数に軸名をつけます。

p sin(x)
set xlabel 'time[t]'
set ylabel 'amplitude'
rep

このコマンドは、非常にオプションが多く、文字サイズ変えたりとか添字使ったりなどもできます。しかし、まず最初はこれだけで良いと思います。

目盛りの刻み幅を変える…set ?tics

目盛りはデフォルトだと細かすぎたり、大雑把すぎたりします。これもset ?ticsを使うことによって、自分で調整できます。例によって正弦波で試してみます。

p sin(x)
set xtics 2 ←刻み幅2
set ytics 0,0.1,0.5 ←0から0.5までの間を0.1刻み
rep

最後のyticsで、終点は指定しなくても問題ありません。

小目盛りを付ける…set m?tics

小目盛りをつけたいときには、set m?ticsを使います。これは大目盛りを何分割するかという風に使います。

p sin(x)
set mxtics 2
set mytics 3
rep

凡例の名前を変更する…ti

凡例というのは、デフォルトだと右上にある「sin(x)」などのことです。なぜかkeyと呼ばれています。

38eade26174a9a6a

デフォルトでは、式の名前や読み込んだデータファイルの名前が表示されるのですが、これは必ずしも嬉しくありません。凡例を自由に決めさせてほしいときには、tiを使います

p sin(x) ti "sin wave"

これで凡例が「sin wave」になりました。

凡例を枠の外に出す…set key outside

凡例にグラフが重なることもあります。場所を移動させる方法は色々あるのですが、ひとまず枠の外に出してしまうのがもっともお手軽で簡単でしょう。

set key outside

凡例を消す…unset key

むしろ凡例がいらないということもよくあるでしょう。凡例を消すにはunset keyを使います

unset key
p sin(x)

サイトや本によってはset nokeyと書かれていたりしますが、unset keyです。きっと古いバージョンではそうだったんでしょう。以下でunsetシリーズが連発されますが、いずれも同じことが言えます。

軸、目盛りを消す…unset border,?tics

グラフだけ欲しいんだ、軸も目盛りも邪魔なんだ、という状況で、軸も目盛りも消してしまうには?凡例はunset keyで消すことができた…ということは、まぁ、想像つくと思います。

unset key
unset border
unset xtics
unset ytics
p sin(x)

それぞれset なんちゃらで復活します。

グラフを画像ファイルとして出力

ここまでで、一通りGnuplotの操作について記述しました。で描いたグラフを画像ファイルとして保存します。この保存が、Gnuplotでは案外と鬼門で、このためにGnuplotの第一印象は悪くなりがちなのではないかとも思うほどです。この項目だけ見てもわかるように丁寧に解説しようと思います。多分。

png(jpg)形式で保存

まずはpng。以下の流れで正弦波のグラフを保存します。

set terminal png
set output "sin_wave.png"
plot sin(x)
set output
set terminal x11

なにしてるのか一個一個みていきます。

set terminal png

これでファイル形式を指定。terminalはtermでもよい。ファイル形式というか、出力先を決めている、というのがほんとのところで、普通に描画する場合は、x11とかqtになります。

set term pngのときに、サイズを指定することで、画像の大きさを変更することが可能です。デフォルトは640×480ですが、たとえばこれを800×480にしたい場合、以下です。

set term png size 800,480

pngではなくjpgにしたい場合は、以下です。

set term jpg

どんな形式が使えるのか知りたかったら、set term で一覧が得られます。

set term

さて、set output 部分ですが。

set output "sin_wave.png"

これは出力するファイル名を指定してます。ダブルクォーテーションはシングルクォーテーションでもよいです

plot sin(x)

ここで描きたいグラフを出力。通常ならsin(x)のグラフが新しくウィンドウをひらいて描画されるはずですが、今は「set terminal png」で出力先が変っているので、コマンドを入力してもなにもウィンドウに描画されません。

set output

これで出力先クリア。ここまでやって初めてファイル完成。これ以上ファイルには保存しないよ、ということであれば、出力先を元に戻します。

set terminal x11

x11は言わずと知れたX Window Systemのことですね。OSXだと不具合あるかも。qtとか指定できたら、そっちのほうがよいかもしれません。いずれにせよ、これで元通り。次にplot sin(x)とかしたら、普通にウィンドウにグラフが描画されます。なお、Windowsの場合は

set terminal windows

となるそうですが、私は使ったことはありません…。

eps形式で保存

基本形式

pngとかjpgとかgifとかは上記のやり方でOKです。しかしながら、たとえばTeXを使いたい時など、epsのようなpostscriptファイルにすることもあります。こちらもだいたい同じです。

set term postscript eps
set output "sin2_wave.eps"
plot sin(x)
set output
set term x11

postscriptがなんだかけったいな感じがしますが、必要です。というより、postscriptが本体でepsがオプションというのが本当のところのようです。デフォルト設定だとepsなので、epsはなくてもだいじょうぶだと思いますが、ここは明示しておくほうがわかりやすいかな、と。

カラー出力や文字サイズ変更など

さて、出力ファイルをみてみると、色が白黒になってます。論文など、白黒のほうが都合がいいこともあります。複数のグラフがある場合は、自動的に破線とかが使われてとても便利な機能です。しかし、もちろんカラー出力したい、ということもあるでしょう。やってみます。

set term postscript eps color
set output "sin3_wave.eps"
plot sin(x)
set output
set term x11

前節と何が違うかというと、当然オプション”color”です。これがデフォルトでは”monochrome”に設定されているということです。

せっかくですので、set term postscriptの形式を以下に。

set term postscript モード 色 線 'フォント' フォントサイズ
モード…eps,ps,etc...
色…monochrome(白黒),color(フルカラー)
線…dashed(破線、デフォルト),solid(実線)
'フォント'…Helveticaがデフォ
フォントサイズ…14とか数字

epsというのはpostscriptで指定するモードだったわけです。色を変えるにはcolorを指定するし、デフォルトの破線が気にいらなければsolidを指定すればいい。ちなみに文字サイズの変更の例を下におきます。

set term postscript eps enhanced 30
set output "x3.eps"
p x**3 ti "x^3"
set output
set term x11

けっこう大きくなってるのがわかります。ちなみにデフォルトのサイズは14です。enhancedの解説は次節で。

添字やギリシャ文字などを使う…enhanced

term postscriptでは、軸名や凡例に添字を使うことができます。つまりx^2とかが綺麗に書けるということ。どうするのかというと、先のset term postscript epsにenhancedを付け加えるだけです。すると、TeXのように^で上付き文字、_で下付き文字にできます。試してみます。

set term postscript eps enhanced
set output "x3.eps"
p x**3 ti "x^3"
set output
set term x11

判例で上付き文字が使えてることがわかります。

tgif用に出力

もしもドローツールにtgifを使ってる人なら、gnuplotとtgifの連携は見逃せません…まだいるのかは知りませんが。

set term tgif
set output 'hogehoge.obj'
p sin(x)
set output
set term x11

これでtgif用のファイルとしてグラフが出力されて、捏造…いえ、編集も思いのままです。

設定ファイル

ここまででだいたい、必要なグラフを描けて、かつ必要に応じて保存もできるようになったのではないかと思います。どうでしょうか。面倒臭いでしょうか。面倒臭いですよね。これを毎回やるのはちょっと意味がわかりませんね。というわけで、設定ファイルがあります。

設定ファイルの保存…save

ここまでに頑張ってちまちまやってきたことを保存できます。

save "config1.gp"

これでconfig1.gpという設定ファイルができます。別に拡張子はgpでなくてもいいし、それどころかなくてもいいのですけど、まぁわかりやすいように。中身をみてみると、めまいがするような設定情報の羅列。こんなに設定できることがあるのですね…。

設定ファイルの読み込み…load

保存した設定ファイルはloadコマンドで読み込みます。

load "config1.gp"

設定ファイルの作成

設定ファイルは自分でも作れます。設定ファイルの中身を見たら「いやいや」という感じですが、こんなにかっちりやる必要はなくて、必要なことだけ羅列すれば十分です。以下に、例として config2.gp を作成します。

config2.gp

set xrange [-pi:pi]
set yrange [0:2]
set xtics 0.2
set mxtics 2

これを使って、gnuplotを起動し試してみましょう。

load "config2.gp"
p sin(x)

ちゃんと設定されていることが確認できたはず。よく使うコマンドです。

おわりに

以上で、二次元グラフを描画し、かつ保存するために、必要十分な知識を得られたのではないかと思います。後は、必要になった時にその都度検索すれば、問題なく使いこなせるでしょう。冒頭で述べたとおり、Gnuplotは古いソフトウェアで、その為にコマンドなどは熟れてると言い難いものではありますが、昔から使われているだけあって、豊富な機能があり、また他言語などの外部プログラムからも簡単に利用できます。シェルスクリプト上で実行する応用例としては、「gnuplotで日付・時刻の書かれた時系列データをグラフに描いて保存するシェルスクリプト : 或る阿呆の記」を参考にしてもらえればと思います。時系列データで、単位変換のほか、今回説明をしなかった二軸の設定を用いています。

昔の資料を眺めながら、初めてまともにLinuxを使い出して、悪戦苦闘している自分の姿が見えました。.(ドット)がカレントディレクトリであることをわざわざ強調して書いていたりとか、そういえば自分はこんなところで躓いていたのだなと、懐かしく思いました。今となっては当たり前過ぎて、省略しがちですが、最初はその当たり前が当たり前ではないという、それこそ当たり前のことを忘れがちです。しかしそれは、恐らく人のもつ普遍的な特徴の一つ。つまり、入門記事は入門したての人が書いたものが、一番わかりやすくなるかもしれないということです。

人に間違いを指摘されるのは、やはりどうにも恥ずかしいことですから、「何もこんな自分が偉そうに書かなくても…間違いもいっぱいあるだろうし…」という気持ちがどうしても芽生えてしまいます。しかしそれを押して、自分から情報発信をすることは、案外人のためになるのではないか、なったらいいなと、そんな気持ちでブログを続けています。閑話でした。

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。