GNUPLOT

- not so Frequently Asked Questions -

update 2004/9/5

ラベルあれこれ (その2)

1 | 2 | 3

ラベルを表示するときの座標は?

gnuplotでは,グラフに任意の直線・矢印・文字列を書き込むときの位置 や凡例の位置を表すのに,4つの座標系が使われます.これらは,"first", "second", "graph", "screen",と呼ばれ,それぞれ,グラフの左のY座標と下 のX 座標,右のY2座標と上のX2座標,グラフ内部の相対的な位置,画面内の相 対的な位置を表しています.座標系を指定しないときはfirstの座標系,つま り図のY軸が使われます.座標系を指定するときは,x,y座標を与えるときに, graph x, screen y の様に,使う座標系を前に置きます.

簡単なテストをしてみましょう.各々の座標系の原点になる所に文字を 書いてみます.

gnuplot> set label "(0,0) first"  at first  0, first  0
gnuplot> set label "(0,0) graph"  at graph  0, graph  0
gnuplot> set label "(0,0) screen" at screen 0, screen 0
fig/sample4.4a

最初のラベル("first")は,図の中央付近にある軸の原点に置かれます. プロットの数値と座標系が一致しているので,図に矢印やコメントを描き込む ときに便利です."graph"の原点は,枠線(border)の左下のコーナーになって います.右上のコーナーがgraph座標系の(1,1)になります.図中の位置を相対 的に決定して与えたいときに使います.例えば,graph 0.5, graph 0.5 なら 常に枠の中央になります."screen"は表示画面の左下で,一部画面外に出てし まっています.画面の右上がscreenでの(1,1)です.プロットの大きさに関係 なく画面全体に対する相対的な位置を決めるのに使います.


firstの座標系で指示したラベルは,図のXY軸の数値が変わればそれに伴って 位置が変化します.その他のラベルの位置は,軸の数値で変わりません.

gnuplot> set xrange [-10:4]
gnuplot> set yrange [-10:4]
gnuplot> replot
fig/sample4.4b

図全体を右上にずらしてみましょう.図の原点を変えるには set origin x,y を使います.このx,y座標は"screen"座標系で与え ます.全体を20%づつ右上にずらすには,次のようにします.

gnuplot> set origin 0.2,0.2
gnuplot> replot
fig/sample4.4c

screenで与える原点は常に左下ですが,originを変えるとgraphの原点が移 動します.


up

図中に矢印を描き込みたい.

図の中に説明のための矢印を描き込むことがよくあります.gnuplotでは, set arrow を使って矢印や線分を作成します.一番簡単な例は, set arrow from 1,2 to 2,4 の様な書き方で,(1,2)という座標から (2,4)に向かう矢印が表示されます.この座標は,何も指 定しなければfirstの座標系になり,X軸Y軸の目盛に依存します.常に同じ位 置に矢印を置くには,graphやscreen座標系で座標を与え ます.

arrowを定義するたびに,gnuplotはそれぞれの矢印に順番に番号をふって いきます.最初に定義された矢印のタグが1,その次が2,という風になっており, この番号は,後で矢印を再定義する場合や消去する場合に使われます. このあたりの定義方法は,set labelと全く同じです.

gnuplot> set arrow from 0,0 to 1,1
gnuplot> set arrow from 0,0 to 1,2
gnuplot> set arrow from 0,0 to 1,3

この様に3つの矢印を定義すると,原点から(1,1)に向かう矢印が1番, (1,2)に向かうのが2番になります.2番の矢印を消し,3番の矢印の終点を (1,5)に変えるには次のようにします.

gnuplot> set noarrow 2
gnuplot> set arrow   3 to 1,5

最初の定義の時に, set arrow 1 のようにユーザが直接タグと なる番号を与えることもできます.こちらの方法の方が間違いが少ないかもし てません.定義した矢印はshow arrow で確認することができます. なお, nohead のキーワードを付けると,終点にく矢じりが描かれ ず,単純な線分になります.また,lw (linewidth)ls (linestyle)のキーワードで,線分の太さや線種を変えることもできます.

関数をプロットするときに,コメントを付けるために描き込む矢印の座標が すぐには分かりにくい場合があります.関数が簡単なら,次のような方法が使えます.

まず,表示する関数を最初に定義します.ここではy=x**2とy=1-(1-x)**2 の2つのグラフを描いて,X=0.5での2つの関数の間の部分に矢印を入れる例を 示します.まず,2つの関数を定義します.

gnuplot> f(x)=x*x
gnuplot> g(x)=1-(1-x)*(1-x)

矢印はX=0.5での座標を計算すれば良いのですが,これを矢印の定義のときに行います.

gnuplot> set arrow 1 from 0.5,f(0.5) to 0.5,g(0.5)
gnuplot> plot f(x),g(x)
fig/sample4.5

この方法では,set arrowを実行した時点で矢印の座標が計算さ れるため,その後でf(x)やg(x)を変更しても矢印の座標は自動的に変わっては くれません.関数を変更したら,もう一度矢印も定義し直す必要があります.


線分の両端に矢じりを付ける方法は無いようです.無理にやるなら,from とtoをひっくり返した矢印を定義して,2つの矢印を重ね描きする方法でしょ うか...

gnuplot> set arrow 1 from 1,2 to   1,4
gnuplot> set arrow 2 to   1,2 from 1,4
up