GNUPLOT

- not so Frequently Asked Questions -

update 2004/9/16

図を描いたその後は...(その3)

1 | 2 | 3

Color PostScriptで出力したグラフの色を変えたい.

出力をカラーのPostScriptにするとき,線や記号の色をgnuplotから直接 与える方法は無いようです.別の色を使う簡単な方法は,gnuplotから直接 Color PostScriptを生成するのではなく,一旦tgifのファイルに出力し,それ をtgifで編集する方法です.

もう少し反則技に近い方法として,出来上がったPostScriptを直接編集す る手があります.gnuplotが生成するPostScriptファイルは,案外読みやすい ように出来ています.まず,何番の線が何色に対応するのかを調べるために, カラーのインデックスを作ってみましょう.testコマンドで調べるのが簡単で すが,ちょっと手間をかけて次のようにしてみました.

gnuplot> set term postscript enhanced color
gnuplot> set output "colorindex.ps"
gnuplot> set size 0.5,0.5
gnuplot> set noborder
gnuplot> set nokey
gnuplot> set linestyle  1 linetype  1 linewidth 8
gnuplot> set linestyle  2 linetype  2 linewidth 8
gnuplot> set linestyle  3 linetype  3 linewidth 8
gnuplot> set linestyle  4 linetype  4 linewidth 8
gnuplot> set linestyle  5 linetype  5 linewidth 8
gnuplot> set linestyle  6 linetype  6 linewidth 8
gnuplot> set linestyle  7 linetype  7 linewidth 8
gnuplot> set linestyle  8 linetype  8 linewidth 8
gnuplot> set linestyle  9 linetype  9 linewidth 8
gnuplot> set linestyle 10 linetype 10 linewidth 8
gnuplot> # for gnuplot ver.4
gnuplot> # set style line 1 line type 1 linewidth 8
gnuplot> # ... etc
gnuplot> set noxtics
gnuplot> set ytics nomirror 1
gnuplot> set yrange [ -1.5 : 10.5 ]
gnuplot> plot  1 w l ls  1,  2 w l ls  2,  3 w l ls  3, 4 w l ls  4,\
gnuplot>       5 w l ls  5,  6 w l ls  6,  7 w l ls  7, 8 w l ls  8,\
gnuplot>       9 w l ls  9, 10 w l ls 10, -1 w line -1, 0 with line 0
gnuplot> pause -1

PostScript出力では線種は1から9までが定義されており,それ以降は1から の繰り返しになります.上の例では,y=1からy=10までの直 線をlinestyleを変えながら引いています.色が分かりやすいように,線を 太くしています.

同じ事をモノクロのPostScript出力でもやってみましょう.上の1行目に ある"color"というキーワードを外し,結果を"monoindex.ps"というファイル に出力します.この monoindex.psと,最初に作った colorindex.ps の何処が 違うのかをUNIXのdiffコマンドで調べると,表題と作成時間の違い以外は, PostScriptファイルの12行目にある /Color true def /Color false def の部分だけです.つまり,この /Color {true |false}の部分を書き換えてしまえば,モノクロPSからカラーPSへ(また はその逆)の変更が,gnuplot終了後でもできるわけです.

さて,本題に戻りましょう.出力されたPSファイルをざっと眺めると, 色を定義している部分がわかります.40行目あたりに,次のような部分が ある筈です(見やすいように空白を入れて縦を揃えています).

/LT0 { PL [                                         ] 1   0   0   DL } def
/LT1 { PL [4 dl 2   dl                              ] 0   1   0   DL } def
/LT2 { PL [2 dl 3   dl                              ] 0   0   1   DL } def
/LT3 { PL [1 dl 1.5 dl                              ] 1   0   1   DL } def
/LT4 { PL [5 dl 2   dl 1 dl 2 dl                    ] 0   1   1   DL } def
/LT5 { PL [4 dl 3   dl 1 dl 3 dl                    ] 1   1   0   DL } def
/LT6 { PL [2 dl 2   dl 2 dl 4 dl                    ] 0   0   0   DL } def
/LT7 { PL [2 dl 2   dl 2 dl 2 dl 2 dl 4 dl          ] 1   0.3 0   DL } def
/LT8 { PL [2 dl 2   dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def

どうやらこの部分が線種の1から9に対応しているようです.LT0の右の方 の数値 "1 0 0" がRGB(Red, Green, Blue)と考えれば,これは赤なので,1番 の線の赤と一致します.同様にLT1は緑,LT2は青になっています.そして, "1, 0, 1"(マゼンタ), "0, 1, 1"(シアン),"1, 1, 0"(黄色),"0, 0, 0"(黒), "1, 0.3, 0"(オレンジ色),"0.5, 0.5, 0.5"(灰色),と続きます.ここのRGB の値を変えれば好きな色の線が描けます.ちなみに灰色は呪われていると下に 置けなくなるので注意が必要です(意味不明).

試しに,赤から黄色へ変化するグラデーションを作ってみましょう.RGBの Rは常に1,Bは常に0にして,Gを0から1に徐々に変化させます.

/LT0 { PL [                                         ] 1   0    0   DL } def
/LT1 { PL [4 dl 2   dl                              ] 1   0.1  0   DL } def
/LT2 { PL [2 dl 3   dl                              ] 1   0.2  0   DL } def
/LT3 { PL [1 dl 1.5 dl                              ] 1   0.3  0   DL } def
/LT4 { PL [5 dl 2   dl 1 dl 2 dl                    ] 1   0.4  0   DL } def
/LT5 { PL [4 dl 3   dl 1 dl 3 dl                    ] 1   0.5  0   DL } def
/LT6 { PL [2 dl 2   dl 2 dl 4 dl                    ] 1   0.6  0   DL } def
/LT7 { PL [2 dl 2   dl 2 dl 2 dl 2 dl 4 dl          ] 1   0.7  0   DL } def
/LT8 { PL [2 dl 2   dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1   0.8  0   DL } def

下のイメージは,gnuplotが生成したColor PostScriptと,線の色をPSファ イルを編集して変えたものを並べて比較したものです.これでどんな色で も使えるようになりましたね.

fig/sample8.4a gnuplotで作ったColorPS
fig/sample8.4b PSファイルを編集

tgifでgnuplotの結果を編集した方が画面で色を確認しながらできるので 便利ですが,毎回々々tgifを起動してマウスで操作するのは面倒です.このよ うにPostScriptを直接編集する方法なら,sedやperlで該当部分を書き換える ことが出来るので,何度も同じ図を作成するときに作業が楽になります.

ついでながら先程の線の種類を定義している部分をもう一度眺めてみると, "[4 dl 2 dl]"などと定義されている部分があります.ここは点線や鎖線を作っ ている部分です."[4 dl 2 dl]"なら,線分と空隙の比が4:2の破線になります. "[5 dl 2 dl 1 dl 2 dl]"なら,まず5の長さの線分があり,次に2の空隙,次 に1の線分があって再び2の空隙,となり,これが繰り返されます.ここの部分 を変えれば線のパターンを変えることができます.

また,LT0を定義している部分よりも上にある2行は,

/LTb { BL [] 0 0 0 DL } def
/LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def

となっています.ここは枠に使われる線(LTb)とゼロ軸に使われる線(LTa) を定義しています.RGBが"0 0 0"なので,これらの線は黒で描かれることにな ります.もちろん,ここの数値を変えれば,枠線やゼロ軸の色が変わります.

up

正方形の図を作ると,右に余白ができてしまう.

set size square を使って図を作るとプロット自体は正方形にな りますが,これをEPSにしてTeX等の他のアプリケーションで読み込むと右 側に余白ができてしまいます.これはgnuplotが画面全体を囲むように, BoundingBoxを決めているためです.右の無駄な余白を取るには,エディタ を使ってEPSファイルを直接編集する必要ことになります.生成される PostScriptファイルの最初の部分にBoundingBoxが定義されています.

%%BoundingBox: 50 50 410 302

この410という数字が大きすぎるので,ここを小さくします.どの程度にす るかは,図のラベルやマージンで変わるので,適当な大きさに図が収まる 様になるまで,何度かcut-and-tryする必要があります.この場合は縦が 302なので,320程度にしておけば大丈夫でしょう.

Unix,Linux上でGhostScriptを使っている場合は,ps2pseps2epsというshell scriptがあると思いますので,これを使う のが簡単です.

% eps2eps input.eps output.eps

これだけで,BoundingBoxが適当に修正されたEPSファイルが出来上がります.

from Russell in Universiteit van Amsterdam. Thanks !
up