ラベル Gnuplot の投稿を表示しています。 すべての投稿を表示
ラベル Gnuplot の投稿を表示しています。 すべての投稿を表示

2006-09-15

LaTeX 用の PS/EPS ファイルを Gnuplot と m4 で作る

最近、LaTeX に貼り付ける PostScript ファイルを Gnuplot で作る際にやってることをまとめておく。

まずはおさらい。例えば、y = sin x という式を、sin.eps というファイルで保存する場合、

set terminal postscript eps
set output 'sin.eps'

plot sin(x)

上のようなコードを書いて sin.gp というファイルで保存し、次のコマンドを実行するんだった。

$ gnuplot sin.gp

すると、sin.eps というファイルが出来る。

PS ファイルと EPS ファイル

ここで少し脇道に逸れて、set terminal postscript landscapeset terminal postscript eps の違いを説明しやう。前者 (landscape は省略可) は、A4 用紙一杯に横向きで図を描く。後者は、小さめの図を描く。

landscape は印刷するのに向く。その代わり LaTeX に貼るには不向き。図を 90 度回転させたり、小さくする手間がかかるし、図を小さくするとフォントまで小さくなり見難くなる。これを修正する手間が、更にかかる。

一方、eps は図が最初から小さく、landscape のように図を回転させる必要もないので、LaTeX に貼るのに最適。ただし、eps 単体を印刷すると、図の小ささが際立つ。

そろそろ本筋に戻らう。色々と図を作って思ったのは、印刷用の図と LaTeX 用の図を一緒に作っておくと便利ということ。

片方のファイルを先に作っておき、必要に応じてもう一方のファイルを作る、というのは面倒で、しかも、もう一方のファイルが必要になる時に限って、急を要することが多い。最近は、ファイル・ストレージの容量も大きくなってきたので、最初から両方の図を作る方がいいという結論に達した。

そういうわけで、上の sin.gp を、もう少し実戦的に直すと下のやうになる。

#
# sin.gp
#
set xlabel "x label"
set ylabel "y label"
set xrange [0:10]
unset key

# ps
set title 'Sin function'
set size 1.0
set terminal postscript landscape enhanced color
set output "sin.ps"
plot sin(x)
# eps
unset title
set size 0.6
set terminal postscript eps enhanced mono
set output "sin.eps"
replot

landscape/eps に共通な設定を最初に書く。xlabel, ylabel を書いておくのは、図の最低限の嗜み。図によっては、xrange 等の設定を加える。

landscape (#ps 以降) では、title を設定する。印刷した後だと、何のファイル/データを印刷したのか分からなくなりがちなので、ここに情報を書いておき、忘れないようにする。逆に eps (#eps 以降) では、title の設定を無効にする。LaTeX では、そういう情報を caption に書くので、title 部はあるとかえって邪魔。

次にサイズの指定。set size 1.0 はサイズを変えないということ。set size 0.6 は小さめのサイズにするということ。eps のフォントと線は、LaTeX に貼るにはまだ小さく細い。そこで、set size で小さめの図を作る (この時、フォントの大きさと線の太さは変わらない)。そして、LaTeX 側で拡大する。すると、フォントの大きさと線の太さが大きくなるという仕組。縮小率は、0.6 倍位いが適当。

terminal の指定で、enhanced はギリシャ語などを表現する時に使う。color/mono は色付きか白黒か。論文などは白黒がベースなので、eps は白黒で作る。けれど、印刷する時はカラーの方が見易いかな? と思う。ここら辺はお好みで。

m4 を使う

さて、上のコードでは、output ファイル名を sin.ps と sin.eps とした。二つのファイルは、拡張子が違うだけなので、basefile name (拡張子の前の部分) を変数に保存したら、後の編集が楽になる。けれど Gnuplot 4.0 では変数に文字列を代入することは出来ない (4.1 では出来るようになるらしい)。

ぼくは、m4 マクロを使ってこれを解決している。上の例は、m4 を使うと次のように書ける (ここでは、data ファイルをプロットする例を書いた)。

changequote([[,]])dnl
define([[base_filename]],[[sin]])dnl
define([[data_filename]],[['sin.txt','cos.txt']])dnl
define([[PLOT]],[[

# ps
set title 'Sin and Cos'
set size 1.0
set terminal postscript landscape enhanced color
set output "base_filename[[]].ps"
plot data_filename
# eps
unset title
set size 0.6
set terminal postscript eps enhanced mono
set output "base_filename[[]].eps"
replot
]])dnl

dnl --------------------------------------------------------------------------------
#
# sin.gp
#
set xlabel "x label"
set ylabel "y label"
set xrange [0:10]
set style data dots

PLOT

水平線の入るまでが m4 の定義部分。入った後が gnuplot の PS/EPS 共通設定。

m4 から gnuplot 用のファイルを生成し、そこから PS/EPS ファイルを作る Makefile は次の通り。

#
# Makefile for sin
#
all: ps

M4 = m4
M4FLAGS =
GNUPLOT = gnuplot

SRC = sin

ps: $(SRC).ps
$(SRC).ps: $(SRC).gp $(SRC).txt cos.txt
 $(GNUPLOT) $<
$(SRC).gp: $(SRC).m4
 $(M4) $(M4FLAGS) $< > $@

#
# clean
#
RM = rm -f
clean:
 $(RM) *~
distclean: clean
 $(RM) $(SRC).gp
psclean:
 $(RM) *.ps
epsclean:
 $(RM) *.eps
allclean: distclean psclean epsclean

これで、make 一発で ps/eps ファイルが作れる。

2006-01-25

Gnuplot で日々のランキングをグラフにする

Gnuplot で日付を含むデータ (例えば下のようなもの) をグラフに直す Tips について。

2006-01-24      929     56      30
2006-01-23      923     56      30
2006-01-22      1060    58      33
2006-01-21      1245    64      36
2006-01-20      1577    74      41
2006-01-19      2030    80      45
2006-01-18      2794    93      54
2006-01-17      3711    107     61

このデータは clmemo@akaブログランキング ドット ネットでのランキング。昨日のエントリーは、実はこのための前振り。

Gnuplot のバージョンは 4.0。

Gnuplot のスクリプト

まずスクリプトを招介して、後でコードの説明を個別にしやう。スクリプト名は blogranking.net.gp。データは blogranking.net.dat に保存。

unset key
set terminal png
set output 'blogranking.net.png'
set style data linespoints
#
# Time
#
set xdata time
set timefmt "%Y-%m-%d"
set format x "%m/%d"
#
# Ranking
#
set yrange [-4000:0]
set ytics ("1" 0, "500" -500, "1000" -1000, "2000" -2000, "3000" -3000, "4000" -4000)
plot 'blogranking.net.dat' using 1:(-$2)
set style

set style data で、データをプロットすると明示。続く linespoints で、データを + 記号で表示して、それを線で結ぶようにした。Gnuplot のデータ・プロットはデフォールトで散布図となる。この場合、線で結ぶ方が見易いが lines オプションだけではどこに点があるか見難くかったので、記号と線の両方で表示する linespoints を選んだ。

Time

set xdata time で横軸 (x 軸) には時間データを表示させることを明示。続けて、set timefmt "%Y-%m-%d" で時間のフォーマットを Gnuplot に教える。ここで、%Y は 4 桁の年号を、%m は月、%d は日にちを表す。最後に x 軸の目盛に表示されるラベルを編集。デフォールトだと 01/17 00:00 のように表示される。時刻の部分は要らないから set format x "%m/%d"" で月と日にちだけ表示させるようにした。

Ranking

縦軸にはランキングの順位を取った。データ・ファイルの左から「日にち」「総合ランキング順位」「カテゴリー・ランキング順位」「サブカテゴリー・ランキング順位」。今回、「総合ランキング順位」からデータを取るので、using 演算子を使って一カラム目と二カラム目のデータをプロットする。gnuplot はカラムを 1 から数えるので、using 1:2 で plot。

このままプロットすると、右肩下がりのグラフができる。順位は上がってるのだから、右肩上がりのグラフを作りたい。そこで、順位にマイナスをかけてグラフを描くようにした。データをプロット前にいじるには、using 1:f($2) というような書き方をすればいい。今回はマイナスをかけるだけの簡単な演算なので、using 1:(-$2)

データ値がマイナスになったので、あわせて y 軸も調整する。y 軸のレンジは -4000 から 0 まで (set yrange [-4000:0])。目盛は

set ytics ("ラベル" 数値, "ラベル 数値, ...)

という書き方ができるので、マイナスをプラスに強引に書き直した。

以上。

できた図はこんな感じ。

最近一週間の総合ランキング