ページが長いので「しおり」の仕組みを用意してみました。
「しおり用」と書かれた所をクリックしてからブックマークに入れると、
それはページの先頭ではなく、その箇所へのブックマークになります。
(03/03 2006)
gnuplot Q&A 掲示板 で、松岡@名古屋大 さんから、png terminal (gd ドライバ) で PostScript の Symbol フォントのような記号 (ギリシャ文字や簡単な数式記号) を使いたい場合、Unix の場合はどうするのかという質問がありました (1668 番の記事 「Unix user は png terminal でどうやって symbol を使うのでしょう」)。 色々長い話になりますので、独立して以下にまとめます。
Linux では "Microsoft TrueType core font" という TrueType フォントが広く流布していて、 ここには MS-Windows では有名な Times, Courier, Arial などのフォントが含まれているのですが、 symbol.ttf は含まれていません。 よってこれでは出せないのでは、という話だったようです。
postpcript terminal では、Symbol フォントを指定すれば、 例えば 'abcdefg' という文字列がギリシャ文字の小文字 'αβχδεφγ' が表示されるのですが、 例えば OpenOffice.org 付属の Symbol フォント opens___.ttf は、 Unicode エンコーディングらしく、 gd ドライバではうまくいかない、ということのようでした。
これに対して、松田@東京電機大 さんが、 いくつかのフォントのテストを行った結果を公開されました。
しかし、これを拝見していて、ふと以下のことを疑問に思いました:
うちで gnuplot の EPS 出力を表示する gv (Ghostscript 経由) では Symbol フォントがちゃんと表示されるが、 それは s050000l.pfb のフォントを使って表示されているはずで、 それがなぜ gdlib 経由の gd ドライバだとうまくいかないのかそれで、gnuplot の gd ドライバ、gd ライブラリ、 およびそれが内部で使用している FreeType ライブラリのソースを 見ながらテストしてみると、次のようなことがわかりました。
set label 'αβγ' at 0.1,0.9
font "s050000l.pfb,14" # 16 進
set label 'αβγ' at 0.1,0.9
font "s050000l.pfb,14" # 10 進
のようにして png terminal でも一応使える
set term png enhanced
set out 'test.png'
set label "{/Symbol=14 \141\142\143}" at 0.1,0.9
set label "{/* \141\142\143}" at 0.1,0.8
font "Symbol,14" # どちらも同じ
ただし、この文字列は "" で囲む必要がある
(通常は "" 内だと \\141 のようにしないといけないはず ?)
上のことを確認するのには、 FreeType ライブラリのテストプログラムと gdlib の perl ラッパーである GD.pm を使ったテストプログラムを書いたのですが、 それらを少し修正したものを以下にあげておきます。 使用法は、それぞれ先頭部分にコメントとして書いておきます。
なお、現在の gdlib (2.0.34 以降) では encode charmap は ある程度自動的に選択される (されてしまう) のですが、 Adobe_Custom は指定できるようになっています。 しかし、GD.pm (2.35) ではその指定がまだできません。 よって、その辺りを改良して、Adobe_Custom 以外に Apple_Roman や MS_Symbol の encode charmap も選択できるようにする gdlib 用のパッチ、 そしてそれに対応した GD.pm 用のパッチも作成してみましたので、 それもついでに公開します。
これらを利用して作成したサンプルを以下に置きます。
下の 「情報やメモ (12/03 2007)」 で書いた "splot title 2" のような書き方を行うパッチですが、 CVS 版 gnuplot で採用されました。
下の 「情報やメモ (11/09 2007; no.2)」 で、splot では "title 2" のような使い方ができない、 と書きましたが、 以下のようなパッチを当てると、一応使えるようになるみたいです。
ただし、かなり適当なので、 これを当てることで他の部分で問題が出るかもしれません。 何かこの機能を splot では意図的に使わないようにしているようにも見える ソースコードがあるのですが、その部分をよく理解していませんので、 何か問題が起こる可能性は十分あります。
一応 CVS 版のソースへのパッチですが、 gnuplot-4.2.2 にも当たるようです。 問題がなさそうなら本家にも投げてみたいと思います。
(cf. 「情報やメモ (12/14 2007)」)
2 ちゃんねるの掲示板「gnuplot を使おう。その 2」(アドレスは リンクリスト 参照) に書かれた情報について、多少気になるものがありましたので、 少し書いておきます。
with point で点のデータを書くときに、座標以外のデータ (3 列目) を使って 各点に色を指定することはできますか、という質問がありました (262)。
それに対して、
plot "'<awk '{if ($3 == 1) print}' data" pt 1,\ "'<awk '{if ($3 == 2) print}' data" pt 2,\ ...のようにする
確かにそれらも解の一つなのですが、 awk を使わなくても上と同等のことを行うことも可能ですし、 実は現在の gnuplot-4.2 なら、 もっと柔軟な方法で行うことも可能です。 それらを以下に紹介しましょう。
これは、対象となるデータ以外を無効データとして扱うことで可能となります。 無効データにするには、1/0 を利用します:
choose(n,y,z) = (z==n)?y:1/0 plot 'data' using 1:(choose(1,$2,$3)) with point pt 1,\ '' using 2:(choose(2,$2,$3)) with point pt 2,\ '' using 3:(choose(3,$2,$3)) with point pt 3なお、これなら gnuplot-3.7 でも可能ですが、 点種を変えているので点 (point) の形も変わってしまいます。
gnuplot-4.2 以降には、linetype の指定として色を指定できますが、 その指定の一つに "rgbcolor variable" というものがあり、 これは追加の入力列を必要とし、それを色指定とみなす、というもので、 点毎、線分毎に色を変えて表示を行うことを可能にします。 この方法ならば点の形は共通で、色だけを変えることができます。 詳しくは、"help rgbcolor" を参照してください。 以下に使用例をあげます:
cv(n)=(n==1)?16711680:(n==2)?16753920:(n==3)?6737322:(n==4)?13481421:0 plot 'data' using 1:2:(cv($3)) with points lt rgbcolor variablecv(n) が 3 列目のデータに応じて色を与える関数です。 なにやら大きな数字が書いてありますが、 これは rgbcolor variable がいわゆる 24bit RGB 形式の数字 (RR * 65536 + GG * 256 + BB) であるとみなすためで、 上の 4 つの数字は、それぞれ PNG terminal のデフォルトの色である、 0xff0000, 0xffa500, 0x66cdaa, 0xcdb5cd (help png 参照) を指定したものです。16 進数を直接指定することはできません。
なお、gnuplot-4.2 のマニュアルには、 rgbcolor variable は 3D (splot) でしか使えない、 と書いてあるようですが、一応 plot でも使えるようです。
plot で、x の範囲毎に with dots の色を変えたい、 という質問がありました (267)。
これも、上と同様に awk を使った回答があげられていましたが、 これも上とほぼ同じ方法で awk なしでできます:
choose(x1,x2,x,y) = (x>=x1 && x<x2)?y:1/0 plot 'data' using 1:(choose(0,1000,$1,$2)) with dots lt 1,\ '' using 2:(choose(1000,2000,$2,$3)) with dots lt 2,\ '' using 3:(choose(2000,3000,$2,$3)) with dots lt 3gnuplot-3.7 以降で使えると思います。
2 ちゃんねるの掲示板「gnuplot を使おう。その 2」(アドレスは リンクリスト 参照) に書かれた情報について、多少気になるものがありましたので、 少し書いておきます。
PostScript 出力で、タイトルや凡例に日本語を使いたいが、 「set term postscript eps enhanced "fontname"」 の fontname に何を指定してもうまくいかない、という話がありました (259)。
元記事の人は、どうやら ttf ファイル名 (TrueType フォント) を指定してみたようですが、それでは出ないのは当然です。 指定しなければいけないのは日本語 PostScript フォント名で、 標準的には Ryumin-Light-EUC-H, GothicBBB-Medium-EUC-H 等です。
ただし、ghostscript の設定によっては、 TrueType フォントを日本語フォントとして 使えるようになっているかもしれません (gv などで) が、 その場合も実際の TrueType フォントファイル名ではなく、 ghostscript の設定 (CIDFnmap 等) によって 使えるようになっているフォント名を指定する必要があります。 例えば、CIDFnmap に、
/Sazanami-Mincho (/usr/local/share/font/ttf/sazanami-mincho.ttf) ;のような設定があれば、 この Sazanami-Mincho が PostScript フォント名になりますので、 Sanazami-Mincho-EUC-H のようなフォント名で gnuplot で使用して それを gv などで見ることができます。
ただし、set term post の行にフォントを指定してしまうと、 数字などのフォントもすべてこのフォントに変わってしまうので、 本当は変えたいフォントだけ指定する方がいいでしょう。 元記事の人が使っている gnuplot-4.2.2 では 残念ながら key のフォントを変更することはできませんが、 CVS 版の gnuplot (4.3) ならば key のフォントも指定できますので、 以下のようにして、タイトルと凡例の両方で日本語が使えます:
set term post eps
set output 'test.eps'
set title "日本語タイトル" font "Ryumin-Light-EUC-H,17"
set key font "GothicBBB-Medium-EUC-H,14"
plot sin(x) title "正弦函数のグラフ"
set out
水平に伸びる棒グラフを書くために、x 軸と y 軸を入れかえたい、 という話がありました (247)。
これは、どのような出力形式で出したいのかは不明ですが、 gnuplot では x=f(y) のグラフを (棒グラフを書く形式で) 自然に書くことはできませんから、 できた画像を回転するのが自然でしょう。 ただし、そのためには、以下のような準備が必要となるでしょう:
ただし、CVS 版でもさすがに key の回転はできません (位置は移動できますが) から、 key の処理は別に行う必要があると思います。
これはよくある質問ですが、「gnuplot ってなんて発音するんですか」 というものがありました (256)。
これに対しては、たまに「ニュープロット」と読むべき、 なる意見を目にすることもあるのですが、 これは開発者から正式な見解がでているわけではないので、 個人的には、わかりやすい読み方をするのであれば どう発音してもいいのだろうと思っています。 実際、私は「ニュープロット」ではなく、 多分多くの人がそう読むであろう「グニュープロット」 という読み方を使っています。
「ニュープロット」であるという根拠は、多分 gnuplot の FAQ の 「1.2 それはどこから来て、そしてなぜ gnuplot と呼ばれているのですか」 に書いてある次の話だと思います (正確には 原文 を参照のこと):
gnuplot は GNU プロジェクトや FSF とは、 極わずかの意味を除けば少しも関係ありません。 我々のソフトウェアは完全に独立にデザインされたもので、 そして "gnuplot" という名前は実は妥協によるものです。 私は "llamaplot" と呼びたかったし、 Colin は "nplot" と呼びたかったのです。 そして、我々は "newplot" がいいだろうということで合意しましたが、 しかしそのときその名前を持つ、 絶対的におぞましい Pascal のプログラムを計算機科学部で たまに使っていることを知りました。 それで私は "gnuplot" がいいごろ合わせになるとして、 後で Colin もそれに同意したのです。ここには、確かに作者は一旦「ニュープロット (newplot)」として それを「gnuplot」にした、と書かれてありますが、 「gnuplot をどう発音すべきか」については何も述べていません。 だから私の意見では、「ニュープロット」でも「グニュープロット」でも どちらでもいいのではないかと思っています。
gnuplot Q&A 掲示板 での見聞き等で得た情報を備忘録として書いておきます。
松岡@名古屋大 さんから、 Cygwin 用の CVS 版 gnuplot (4.3) のバイナリの公開のお知らせがありました。 gcc-4.2.1 を使っているせいか、大分軽いそうです。
(1623 の記事から始まるスレッド 「Cygwin 版 gnuplot 4.3 (CVS) 版のバイナリーを公開しています」)
Cygwin 用の gnuplot の X 用オプション (-geometry) に関して、 Octave で使用する場合、 Octaverc にそれを書くことで制御できるという報告がありました。
そこから発展して、 環境変数 GNUPLOT_DRIVER_DIR に関する挙動が CVS 版で変わったこと、 およびこの変数の意味や必要性に関する議論が行われました。
なお、最初の質問は "man X(1)" の "1" に関する話でしたが、 これは Unix のオンラインマニュアルにおける慣習で、 別のオンラインマニュアルを参照する場合に、 "X(1)" のように、 マニュアルセクションのセクション番号をつけて書くならわしになっています。 Unix のオンラインマニュアルでは、 別セクションのマニュアル名が一致してしまった場合のために、 必要ならセクション番号を指定して読めるようになっているので、 マニュアルで参照する場合はセクション番号も書くことになっているわけです。
(1625 の記事から始まるスレッド 「X(1) マニュアルページ」)
松岡@名古屋大 さんから、 DJGPP 版の gnuplot-4.2.2 バイナリに関する報告がありました。
私はもう長いことその辺は触っていませんが、 それなりに利用価値はあると思います。 MS-Windows に移行していない (移行できない) MS-DOS ユーザなんてのは もうあまりいないかもしれませんが (個人的には 0 ではないと信じています)、 そういう環境を利用している人には重要ですね。
(1637 の記事 「gd422dj2.zip」)
plot だけのスクリプトを wgnuplot のコマンドラインから食わせると、 すぐに終了してしまうが、 グラフを残してかつ対話型のターミナルを残すには、 という質問がありました。 スクリプトに "pause -1" を入れるとグラフは残りますが、 対話型ターミナルが出ません。
これに対して、
(1638 の記事から始まるスレッド 「コマンドラインからの使用に関して」)
cgm terminal のフォントサイズの問題に対する情報が報告されました。
これは現在は修正されています
(cf. 「情報やメモ (11/09 2007)」)。
で、ついでに、以前のフォント指定方法の
「set term cgm "fontname" fontsize」
が、最近の指定方法である
「set term cgm font "fontname, fontsize"」
のような書式に変更されたようです。
徐々にこのような統一された記法になっていくんだと思いますが、
まだ多くの terminal ドライバは古い記法のままになっています。
# だれかまとめてやってくれないかな ?
(1643 の記事から始まるスレッド 「cvs 版 gnuplot cgm terminal の old syntax bug が Fix されました」)
極座標モードでは、 曲線を bezier では補間 (smooth) できるみたいであるが、 cspline による補間はできないのか、という質問がありました。
実際には cspline でもできないわけではなく、問題なく使えます。 ただ、bezier で補間がうまくいって、cspline でだめ、ということは、 多分そのデータの方が cspline に向かないデータなんではないかと思います。 cspline のような補間は、データによっては 元のデータからはだいぶ外れたものになることもありえます。 しかも gnuplot の補間は、 極座標データを xy 座標に直した後で補間しますから、 データからは予想できないものになる、という可能性もあります。
そのようなことを見越して、松田@東京電機大 さんが、 極座標データの状態で cspline 補間して、 それを xy 座標に直したものを書く、 というスクリプトサンプルを紹介しておられます。 松田@東京電機大 さんお得意の table 出力を利用して、 元データを cspline 補間した table データを作成し、 それを改めて極座標モードにして描画する、という手法です。
(1646 の記事から始まるスレッド 「極座標での曲線表示」)
VB (Visual Basic) で書くプログラムから gnuplot を呼び出すには、 という質問がありました。
それに対して、
元記事の人は、pgnuplot.exe を利用して、
System.Diagnostics の ProcessStartInfo クラスを利用して
うまくいったようで、サンプルコードも上げてあります。
# 私は VB も .NET もまるで知りませんので (?_?)
(1651 の記事から始まるスレッド 「VB から呼び出す方法」)
gnuplot-4.2.X では、データに含まれている文字列を利用して 各グラフにタイトルをつける、
plot 'data' using 1:2 title 2のような使い方ができるが、splot ではうまくいかない、 という質問がありました。
調べてみると、マニュアル等には明示的には示されていませんが、 splot では "title [n]" のような使用法は まだ実装されていないようです (CVS 版でも)。
回避策としては、 splot では key を書かずに (unset key)、 それに multiplot で plot のグラフを重ねてそちらで key だけ書く、 とごまかす手はあります:
set multiplot unset key splot "data" using 1:2:3 set key unset border unset tics plot [0:1][0:1] "data" using 1:(1/0) title 2 unset multiplot
なお元記事の人は、 every を利用してデータをアニメーション化するときに、 画面に現在が何ステップ目かを表示したい、 という目的のようでしたが、 gnuplot の if + reread を使うなら、 そこで使用されるパラメータを利用して、 各ステップ毎に異なるタイトルを表示させればいいので、 gnuplot-4.2 以降の文字列関数を利用して、 reread する方で
a=a+1 splot "data" every ::a::a title sprintf("%d step",a) w p if (a<lasta) rereadのようにすればいいでしょう。
私なら key ではなくて、むしろグラフ全体のタイトルを
a=a+1 set title sprintf("%d step",a) splot "data" every ::a::a notitle w p if (a<lasta) rereadのようにするでしょうか。
元記事の方は、結局はステップ数ではなく、 「sprintf("time = %f",a*dt)」 のようにして利用したそうです。
(1656 の記事から始まるスレッド 「splot の title にデータファイルの文字列を渡したい」)
(cf. 「情報やメモ (12/03 2007)」)
前回の報告 (07/30 2007; no.2)以後、 現在の CVS 版に入れられた主な機能について紹介します (ChangeLog, manual の更新部分等より)。
set encoding の locale オプション、'=' や ',' 演算子、 {pdf|png}cairo terminal, GPVAL_ERR{NO|MSG} については 既に下で説明してあります (cf. 「情報やメモ (08/06 2007)」, 「情報やメモ (08/31 2007)」, 「情報やメモ (10/11 2007)」, 「情報やメモ (10/19 2007)」)
その他で言うと、"set encoding utf8" は、 現在は gd ドライバくらいでしか対応してはおらず、 それも多分日本語が使えるかどうかとはあまり関係のないものだと思います。
Octave の問題は、ChangeLog を見ると、 Octave が一時ファイル経由でデータを gnuplot に渡すのではなくて、 全部パイプでインラインデータとして渡すようになったため、 その際のマウス機能が使えなくなったので、それへの対処である、 という感じのようです。 Octave 2.9.X に関しては、 「情報やメモ (07/30 2007; no.3)」 にも多少情報があります。
2 ちゃんねるの掲示板「gnuplot を使おう。その 2」(アドレスは リンクリスト 参照) に書かれた情報について、多少気になるものがありましたので、 少し書いておきます。
例えば次のようなデータ:
A 1 3 B 3 8 C 5 7 D 6 5 E 7 9 F 9 4に対して、2 列目を x 座標、3 列目を y 座標として、 1 列目を x 軸の見出し (2 列目の x 座標のところ) に使用することはできないか、という質問がありました (234)。
gnuplot-4.0 では、データを前処理して set label などを使うような スクリプトを生成しないといけないでしょうが、 gnuplot-4.2 以降ならデータからラベル文字列を読みとって、 軸の見出しにも使うことができますので、
plot 'data' using 2:3:xticlabels(1) with linespointsのようにして簡単に実現できます。この、軸の見出しは、x 軸だけでなく、 y 軸、x2 軸、y2 軸、z 軸 (splot の場合) も使うことができます。 詳しくは、help plot using xticlabels を参照してください。
MS-Windows 用の wgnuplot は、 4.2 以降ファイル検索ディレクトリの仕様が変わった、 という話がありました (225)。 4.0 以前は、以前実行した際の検索ディレクトリを覚えておいて 検索してくれたのに、 4.2 以降では、常にカレントディレクトリを開くようになった、 ということです。
これは、多分以下のパッチの影響だろうと思われます:
2006-08-09 Bastian Maerkisch <[email protected]> SF Patch [1505261] wgnuplot: open file-open-dialog in current dir * src/win/wmenu.c (SendMacro): Windows XP uses a strange initial directory for the file open dialog. This patch forces the dialog to always open in the current directory. So now, if you change the directory via 'cd', the file open dialog opens where expected.既に「バグの修正」として取りこまれていますので、 これ以後の wgnuplot ではそのような挙動になってしまいます。
以前の挙動にするには、という意見でしたが、 それはちょっと難しいと思います。 強引にやるなら、その wmenu.c へのパッチを取り除いて自分で make するか、 または 4.0 以前の wgnuplot を使うしかないのではないかと思います。
CVS 版 gnuplot (4.3) で、 読み出し専用変数 GPVAL_ERRNO と GPVAL_ERRMSG がサポートされました。 これらは、以下のような変数です。
以前、 gnuplot Q&A 掲示板 に、 正確には少し違いますが以下のような質問がありました (716 番の記事 「対話モードでの起動方法」。 cf. 「情報やメモ (01/30 2005)」):
「スクリプトなどを gnuplot に食わせると、 エラーが起きてもそのまま終わってしまうが、 エラーが起きた場合は対話モードにするようなことはできないか」この GPVAL_ERRNO と "exit gnuplot" (exit や quit よりも強い) を組み合わせればそれが実現できるかもしれません。
例えば、gnuplot スクリプトの最後に、
.... if ( GPVAL_ERRNO == 0 ) exit gnuplotのように書いておいて、そのスクリプトを
gnuplot script.gp -のように最後に '-' をつけて実行します。 この場合、もし script.gp の実行にエラーがなければ、 exit gnuplot によって script.gp の後ろの '-' も無視されて gnuplot は終了しますが、 script.gp の実行にエラーがあれば、 script.gp の次の '-' によって対話モードになることになります。
ただ、GPVAL_ERRNO がどんなときにセットされるか 少し実験してみると、
そうなると、 実際に良く遭遇するような問題の場合はこれがセットされず、 結局は残念ながら上のようにしてもあまり意味がないような気がします。
(cf. 「情報やメモ (11/09 2007)」)
CVS 版 gnuplot (4.3) で、 cairopdf terminal ドライバを拡張して、 cairo による PNG 出力がサポートされました。 これで、PDF 出力と PNG 出力のドライバが、
それぞれのメリットについては、まだちゃんと調べたわけではないので、 今後色々試したいとは思いますが、
set term pdfcairo {{no}enhanced} {mono|color} {solid|dashed} {font <font>} {linewidth <lw>} {rounded|butt} {dashlength <dl>} {size <XX>{unit},<YY>{unit}}
set term pngcairo {{no}enhanced} {mono|color} {solid|dashed} {transparent} {font <font>} {linewidth <lw>} {rounded|butt} {dashlength <dl>} {size <XX>{unit},<YY>{unit}}
set terminal pdf {monochrome|color|colour} {{no}enhanced} {fname "<font>"} {fsize <fontsize>} {font "<fontname>{,<fontsize>}"} {linewidth <lw>} {rounded|butt} {solid|dashed} {dl <dashlength>}} {size <XX>{unit},<YY>{unit}}
set terminal png {{no}transparent} {{no}interlace} {{no}truecolor} {rounded|butt} {linewidth <lw>} {dashlength <dl>} {tiny | small | medium | large | giant} {font <face> {<pointsize>}} {size <x>,<y>} {{no}crop} {{no}enhanced} {<color0> <color1> <color2> ...}
現時点では、png terminal の方が pngcairo terminal よりも オプションは多いようですが、 pdf と pdfcairo ではオプションは違いはないようです。 pdf terminal では日本語がそもそも使えませんから、 PDF 出力に関しては、pdfcairo の方が優位と言えるでしょう。
PNG 出力では、png terminal の方が interlace, truecolor, crop, 色指定などのオプションで優位なようですが、 日本語の利用に関して言えば、以下のような状況だろうと思いますので、 その点ではやや pngcairo が優位な気がします。
以下に実行例を少し示します。 まずは、test コマンドの出力から。 いずれも表示しているのは screenshot の GIF 画像で、 リンク先として PDF, PNG 画像を置きます。
デフォルトのフォントが {pdf,png}cairo ではやや大きい (特に pdfcairo) ようなので、だいぶ感じが違って見えますが、 pdfcairo と pngcairo では線の色と点種が共通であることが特徴です。 png terminal は、点種はそれに近いのですが、少し違いがありますし、 色の並びはだいぶ違います。 pdf terminal は色も点種もだいぶ違うことがわかります。 また、デフォルトのフォントでは、png terminal は回転が使えません (TrueType フォントなら回転できます)。
次は、日本語のテストです。pdf terminal は日本語が使えないので、 他の 3 つに対して以下のようなスクリプトを食わせます (環境変数 GDFONTPATH を適当に設定した上で):
# pngcairo set encoding locale set term pngcairo set out "pngcairo-2.png" set key font "IPAMincho,12" set title "This is test (これはテスト)" font "Sazanami Gothic,17" set xlabel "漢字: これは xlabel" font "IPAGothic,24" set ylabel "漢字: これは ylabel" font "IPAMincho,24" set label "回転する日本語フォント" rotate by 60 \ font "Sazanami Mincho,24" tc lt 3 plot sin(x) title "漢字: これは sin(x)" set out # pdfcairo set term pdfcairo set out "pdfcairo-2.pdf" replot set out # png reset set term png set out "pngold-2.png" set key font "ipam.ttf,12" set title "This is test (これはテスト)" font "sazanami-gothic.ttf,17" set xlabel "漢字: これは xlabel" font "ipag.ttf,24" set ylabel "漢字: これは ylabel" font "ipam.ttf,24" set label "回転する日本語フォント" rotate by 60 \ font "sazanami-mincho,24" tc lt 3 plot sin(x) title "漢字: これは sin(x)" set outこの出力は以下の通りです。
フォントは同じ TrueType フォントを使用しているのですが、 だいぶ感じが違うことがわかると思います。 特に pdfcairo terminal の出力はフォントが かなり大きくなってしまっているのですが、 フォントの単位が違うのでしょうか。 そうだとすると、その点は pngcairo と pdfcairo は 共通のスクリプトが使えない、ということになります。 ただ、xtics のフォントは pngcairo と pdfcairo でほぼ同じ大きさに見えるので、 もしかしたらバグかもしれません。
png terminal と pngcairo terminal の出力を比較すると、 日本語文字の幅と位置の認識に差があるようで、 余白部分の大きさや上下の位置合わせに違いが見られます。 png terminal の方は xlabel が xtics の見出しと重なっていることから、 png terminal (gdlib) よりも pngcairo (cairo) の方が多分正しいのだろうと思いますが、 pngcairo は xlabel の下が切れてしまっているので、 その点は完全ではないような気もします。
また、key のフォントが png terminal と pngcairo terminal で違っているように見えますが、 これは、うちの gdlib には 「情報やメモ (03/08 2005)」 で紹介したパッチを当ててあるため、 小さいフォントに対して埋め込みビットマップを 使ったり使わなかったりするからです。 key のフォントは回転しないため埋め込みビットマップが使われています。 pngcairo は、小さいフォントでも埋め込みビットマップを使っていないようで、 それでフォントが違って見えます。 しかも、pngcairo は埋め込みビットマップを使わないので、 「情報やメモ (03/08 2005)」 のような問題も起きず、回転は常にうまく行きます。
(cf. 「情報やメモ (11/09 2007)」)
「情報やメモ (09/08 2007)」, 「情報やメモ (09/13 2007)」, 「情報やメモ (09/14 2007)」 で始めた、CVS gnuplot (4.3) の「あまり意味のないデモ」の 5 つ目を紹介します。
これも単なるアニメーションですが、 今度はグラフ描画によるアニメーションを一つ紹介します。 渦巻きを書いてそれを回転させるものです。
「情報やメモ (09/14 2007)」 に比べてさほど新しい内容があるわけではありませんが、 グラフアニメーションの一例として置いておきます。 なお、これも前回同様、シェルスクリプト (csh) での形式で紹介します。
#!/bin/csh -f ## 変数定義 setenv GDFONTPATH /usr/local/share/fonts/ttf set load1 = load1.gp set loops = 12 set lines = 3 set outf = spiral1.gif # loops = 1 回転の分割数 # lines = 曲線数 ## load1.gp の作成 cat <<EOF > $load1 plot for [i=1:$lines] xfunc(t,i*dth1+n*dth2),yfunc(t,i*dth1+n*dth2) \ w l lt rgb fcolor(i) n=n+1 if(n<=$loops) reread EOF ## gnuplot の実行部分 gnuplot << EOF #set term gif animate delay 10 size 400,400 set term gif animate size 400,400 set output "$outf" jfont1 = "ipam.ttf" jfont2 = "ipag.ttf" set size square unset tics unset key set parametric set sample 1000 maxt = 10*pi #set trange [0:maxt] set trange [0:1.5*maxt] set xrange [-1:1] set yrange [-1:1] set title "グルグル渦巻き" font jfont1.",17" # 関数定義 xfunc(t,a) = (t/maxt)*cos(t+a) yfunc(t,a) = (t/maxt)*sin(t+a) colorstr = "#990000,#009900,#000099,#999900,#990099,#009999" fcolor(n) = (m=(n-1)%$loops,colorstr[8*m+1:8*m+7]) # dth1 = 曲線毎の差分角 # dth2 = 回転毎の差分角 (左回り) dth1 = 2.0*pi/$lines dth2 = 2.0*pi/$loops #dth2 = -2.0*pi/$loops # (こちらは右回り) n = 0 ; load "$load1" EOF ## それの表示 xanim $outfこの出力が以下のものです。
渦巻きのらせん曲線は、極座標で言えば r=(t-t0)/maxt のような関数を、 t=t0 から t=t0+maxt まで描いていることに相当します (t は中心角)。 しかし、今回は、複数のらせん曲線を同時に描くため、 trange は共通にしなければいけないので、 極座標モード (set polar) は使用せず、 媒介変数モード (set parametric) で書いています。
曲線の数は簡単に変えられるように、CVS 版 gnuplot の iteration 機能 (for [i=1:$lines]) を利用しています。dth1 = 2*pi/$lines で、 この角ずつ回した曲線を $lines 本だけ描きます。 また、一回転を $loops 個のフレームに分け、 毎回それを dth2=2*pi/$loops だけ回転した曲線を描くようにしています。 各フレームは if + reread によって自動的に複数生成し、 それを GIF アニメーションファイルとしています。
高速なマシンならば、1 回転のフレーム数 ($loops) の数をもっと増やした方が、 滑らかな回転が見られると思います。
なお、trange は [0:maxt] だと r=1 のところまでのらせんしか描きませんが、 それだと、描画領域 (一辺 2 の正方形) に内接する円内にしか 描かれないことになり、4 隅のところにすきまができます。 よって、それを防ぐために、trange を [0:1.5*maxt] としています (正確には隅のところは sqrt(2)*maxt まで)。
「情報やメモ (09/08 2007)」, 「情報やメモ (09/13 2007)」 で始めた、CVS gnuplot (4.3) の「あまり意味のないデモ」の 4 つ目を紹介します。
gnuplot-4.2 以降には、GIF アニメーションを作成する機能が含まれています (対応する GD ライブラリが必要)。 これは、plot 毎にフレームを構成して、 それを自動的に GIF アニメーションにするもので、 ごく手軽に GIF アニメーションを作成できます。 これを使って、文字アニメーションのサンプルを作ってみたものを紹介します。
なお、今回は一つの gnuplot スクリプトに書くと大変なので、 reread + if の機能を使ったループにしてあって、 それをシェルスクリプトで実行していますので、 そのシェルスクリプト (csh) 自体を紹介します:
#!/bin/csh -f ## 変数定義 setenv GDFONTPATH /usr/local/share/fonts/ttf set load1 = load1.gp set load2 = load2.gp set load3 = load3.gp set load4 = load4.gp set loops = 8 set fsize = 24 set outf = stranim1.gif ## load1.gp の作成 ## 色の変化 cat <<EOF > $load1 n=n+1 unset label 1 set label 1 "竹" at screen 0.1,0.2 center font lfont tc rgb fcolor(n) plot 1/0 if(n<$loops) reread EOF ## load2.gp の作成 ## 角度の変化 cat <<EOF > $load2 n=n+1 unset label 2 set label 2 "野" at screen 0.3,0.2 center font lfont tc rgb "#009900" \ rotate by farg(n) plot 1/0 if(n<$loops) reread EOF ## load3.gp の作成 ## 位置の変化 cat <<EOF > $load3 n=n+1 unset label 3 set label 3 "茂" at screen 0.5,fposy(n) center font lfont tc rgb "#000099" plot 1/0 if(n<$loops) reread EOF ## load4.gp の作成 ## フォントサイズの変化 cat <<EOF > $load4 n=n+1 unset label 4 set label 4 "治" at screen 0.7,0.2 center font ffont(n) tc rgb "#990099" plot 1/0 if(n<$loops) reread EOF ## gnuplot の実行部分 gnuplot <<EOF jfont1 = "ipam.ttf" jfont2 = "ipag.ttf" set term gif animate delay 10 size 400,200 set output "$outf" unset key unset border unset tics set xrange [0:1] set yrange [0:1] set title "文字アニメーション" font jfont1.",17" lfont = sprintf("%s,%d",jfont2,$fsize) # 関数定義 colorstr = "#99eeee,#99cccc,#99aaaa,#998888,#996666,#994444,#992222,#990000" fcolor(n) = (m=(n-1)%$loops,colorstr[8*m+1:8*m+7]) farg(n) = 360*n/$loops fposy(n) = 0.8-(0.8-0.2)*(n-1)/($loops-1) ffont(n) = sprintf("%s,%d",jfont2,$fsize+3*($loops-n)) # 各スクリプトファイルのロード n=0 ; load "$load1" plot 1/0 ; plot 1/0 n=0 ; load "$load2" plot 1/0 ; plot 1/0 n=0 ; load "$load3" plot 1/0 ; plot 1/0 n=0 ; load "$load4" plot 1/0 ; plot 1/0 set out EOF ## それを表示する xanim $outfこの出力が以下のものです。
plot 命令は 1/0 の空打ちのみ行って、 set label で設定した文字の更新を行っています。 各スクリプトは loops=8 だけのアニメーションフレームを作成しています。 fcolor(n) は、colorstr で 8 つの色しか定義していないので、 n-1 を loops で割った余りを使って色を取りだすようにしています (, は最近の CVS 版の機能)。 これで、スクリプトの先頭で loops を変えることで 容易にフレーム数を変えられることになります。
文字の回転は、位置合わせを center にしているのですが、 若干文字の中心と回転中心がずれてしまっているように見えます。 これは、TTF ファイルの日本語文字のサイズを、 GD ライブラリが正しく認識できていないのかもしれません。
(cf. 「情報やメモ (09/23 2007)」)
「情報やメモ (09/08 2007)」 で始めた、CVS gnuplot (4.3) の「あまり意味のないデモ」の 3 つ目を紹介します。
文字を回転して表示するサンプル:
ipa = 1 set term gif if ( ipa ) set out "srotate-ipa.gif" if ( ! ipa ) set out "srotate-saza.gif" if ( ipa ) jfont1 = "ipam.ttf" if ( ipa ) jfont2 = "ipag.ttf" if ( ! ipa ) jfont1 = "sazanami-mincho.ttf" if ( ! ipa ) jfont2 = "sazanami-gothic.ttf" unset key unset border unset xtics unset ytics labelstr = " こんにちは、CVS gnuplot-4.3 です。" labelfont = jfont2.",14" if ( ipa ) set title "文字の回転 (IPA フォント)" font jfont1.",17" if ( ! ipa ) set title "文字の回転 (sazanami フォント)" font jfont1.",17" set label 1 labelstr at screen 0.5,0.5 rotate by 0 \ font labelfont tc rgb "#00ff00" set label 2 labelstr at screen 0.5,0.5 rotate by 30 \ font labelfont tc rgb "#ff0000" set label 3 labelstr at screen 0.5,0.5 rotate by 60 \ font labelfont tc rgb "#0000ff" set label 4 labelstr at screen 0.5,0.5 rotate by 90 \ font labelfont tc rgb "#ff00ff" set label 5 labelstr at screen 0.5,0.5 rotate by 120 \ font labelfont tc rgb "#00ffff" set label 6 labelstr at screen 0.5,0.5 rotate by 150 \ font labelfont tc rgb "#ffff00" set label 7 labelstr at screen 0.5,0.5 rotate by 180 \ font labelfont tc rgb "#009900" set label 8 labelstr at screen 0.5,0.5 rotate by 210 \ font labelfont tc rgb "#990000" set label 9 labelstr at screen 0.5,0.5 rotate by 240 \ font labelfont tc rgb "#000099" set label 10 labelstr at screen 0.5,0.5 rotate by 270 \ font labelfont tc rgb "#990099" set label 11 labelstr at screen 0.5,0.5 rotate by 300 \ font labelfont tc rgb "#009999" set label 12 labelstr at screen 0.5,0.5 rotate by 330 \ font labelfont tc rgb "#999900" plot [0:1][0:1] 1/0この出力が以下のものです。
上では、ipa という変数を使って、どちらのフォントを使うかの 切り替えを行なっています。 実際には、これはシェルスクリプトのヒアドキュメントを使って実行していて、 その変数の値もシェル変数で制御し、 その値に応じて、同じスクリプト内で "xli -fork srotate-ipa.gif" なども実行しています。
なお、上のサンプルは、さざなみフォントの場合の文字の回転が うまく行っていないように見えますが、 これは、 「情報やメモ (03/08 2005)」 で説明した問題です。 そこで紹介したパッチを GD ライブラリに当てれば、 さざなみフォントでも IPA フォント同様の表示になります。 なお、そのパッチは、最新の GD ライブラリ gd-2.0.34 にも当たります。
このサンプルでは、"set label" の同じようなものを くり返しだらだら並べて書くのが面倒ですが、 CVS 版 gnuplot では、iteration 機能がありますので、 これと "with labels" を使えば、 以下のように多少自動化することもできます:
ipa = 1 set term gif if ( ipa ) set out "srotate-ipa.gif" if ( ! ipa ) set out "srotate-saza.gif" if ( ipa ) jfont1 = "ipam.ttf" if ( ipa ) jfont2 = "ipag.ttf" if ( ! ipa ) jfont1 = "sazanami-mincho.ttf" if ( ! ipa ) jfont2 = "sazanami-gothic.ttf" unset key unset border unset xtics unset ytics labelstr = " こんにちは、CVS gnuplot-4.3 です。" labelfont = jfont2.",14" if ( ipa ) set title "文字の回転 (IPA フォント)" font jfont1.",17" if ( ! ipa ) set title "文字の回転 (sazanami フォント)" font jfont1.",17" colorstr = "#00ff00,#ff0000,#0000ff,#ff00ff,#00ffff,#ffff00," colorstr = colorstr."#009900,#990000,#000099,#990099,#009999,#999900" fcolor(n) = colorstr[8*(n-1)+1:8*(n-1)+7] farg(n) = 30*(n-1) set sample 2 set xrange [0:1] set yrange [0:1] plot for [i=1:12] '+' using (0.5):(0.5):(labelstr) with labels left \ font labelfont tc rgb fcolor(i) rotate by farg(i)違うのは、"colorstr" 以降の部分ですが、 まず、ラベル毎に与える色の文字列を長い文字列にしておいて、 各ラベル番号毎に fcolor(n) という関数で文字列値として返すようにし、 farg(n) で回転角も各ラベル番号毎に数値として返すように作っておきます。
"with labels" はデータファイルにしか使えませんから、 色の情報も入れた 12 行のデータを作ってもいいのですが、 それだと各行毎に回転角を指定できませんから、 「疑似ファイル入力 '+' によって 1 行のデータを出力する」という作業を iteration 機能により 12 回繰り返す、とすればいいわけです。 こうすれば、iteration の変数を fcolor() や farg() に渡すことで 各文字の色や回転角を指定できます。
ただし、"set sample" は 2 以上の値しか指定できないので、 2 の値を指定していますが、 これは同じ場所に 3 回重ね書きしていることになります (多分)。 また、"with labels" の場合は、 位置合わせが center がデフォルトのよう ("set label" の場合は left がデフォルトのよう) なので、left を指定しています。 これで、見た目には上とほぼ同じものができます。
CVS 版 gnuplot (あるいは gnuplot-4.2.X) では、 だいぶ色んな表現ができるようになってきています。 ここでは、それらの機能を利用した、2 つのサンプルを紹介します。
まず、単にワープロみたいに文字を書くサンプル:
jfont1="sazanami-mincho.ttf" jfont2="sazanami-gothic.ttf" set term gif set out "teststr1.gif" unset border unset key unset xtics unset ytics set title "全然 gnuplot らしくない出力" \ offset character 0,-3 font jfont2.",22" tc rgb "#333333" set label 1 "新潟工科大学 竹野茂治" \ at 1,0.8 right offset character -5,0 font '${jfont1},15' tc rgb "#ff0000" set label 2 "こんなものを、gnuplot のグラフ画面に書くのは" \ at 0.5,0.7 center font jfont1.",14" tc rgb "#000066" set label 3 "もちろん変なのですが、まあこういうことも" \ at 0.5,0.6 center font jfont1.",14" tc rgb "#006666" set label 4 "できるということを見せると、現在の gnuplot (CVS 版) の" \ at 0.5,0.5 center font jfont1.",14" tc rgb "#666666" set label 5 "表現力の高さ、可能性を示すことにもなるのかなとも思います。" \ at 0.5,0.4 center font jfont1.",14" tc rgb "#6666ff" set label 6 "2007 年 9 月 8 日" \ at 0.0,0.2 left offset character 5,0 font jfont1.",12" tc rgb "#009900" plot [0:1][0:1] 1/0 set outこの出力が以下のものです。
グラフの本文に書いたように、こういうものを gnuplot で書くことに 特にたいした意味はないのですが、 gnuplot では、現在 gif/png/jpeg terminal では TrueType フォントを 容易に指定して利用できますし、 大きさ、色、回転、位置合わせなども指定できます (回転は上のサンプルでは使ってません)。
こういう画像ファイルを作るには、 お絵描きソフト、ワープロソフトなどでをやるのが普通でしょうが、 上のように gnuplot でやることもできます。 この場合、gnuplot の方で再利用したり、 または gnuplot がサポートする別の出力形式の画像にもできる、 というメリット (?) もあります。 しかし、座標を指定する作業などがほとんど原始的ですから、 もちろん gnuplot でやる必要はありません。
現在、gnuplot-4.2.X 以降は with labels をサポートしていますので、 それを利用するとデータに沿って文字列を描画できます。 さらに、現在の CVS 版の gnuplot では、 疑似ファイル '+' もサポートしていますので、 データでなくても with labels を利用して 文字によるグラフを描くことができます:
jfont1="sazanami-mincho.ttf" jfont2="sazanami-gothic.ttf" set term gif set out "teststr2.gif" unset key set title "文字グラフ" font jfont2",14" tc rgb "#009900" set samples 80 plot [-2:10] \ '+' using ($1):(sin($1)):("青") \ with labels font jfont2.",12" tc lt 3, \ '' using ($1):(cos($1)):("赤") \ with labels font jfont1.",12" tc lt 1 set outこの出力が以下のものです。
ここでは、単純な文字で書いてみましたが、 もっと色んな TrueType フォントを利用すれば、 もっと変わったものも描けるかもしれません。 これは、plot with points の表現力を改良するものになる可能性があります (?)
(cf. 「情報やメモ (09/13 2007)」, 「情報やメモ (09/14 2007)」, 「情報やメモ (09/23 2007)」, 「情報やメモ (05/28 2009)」)
「情報やメモ (08/27 2007)」 で、 gnuplot-4.2.1 がリリースされた、と報告しましたが、 その後重大な問題があったようで、急遽 gnuplot-4.2.2 に更新されました。
また、 「情報やメモ (03/05 2007)」 で、 gnuplot-4.2.0 の、gnuplot-4.0 以降の機能の更新情報を紹介しましたが、 ここで gnuplot-4.2.2 の、gnuplot-4.2.0 以降の機能の更新情報を 追加しておきます。 これは、gnuplot の配布物に含まれるファイル NEWS の訳です。
「gnuplot version 4.2.2 での新しい機能、変更、修正」
(cf. 「情報やメモ (03/11 2008)」)
最新の CVS 版に、代入演算子 a=b と 累次評価演算子 (a,b) がサポートされました。 代入演算子は、今までもある意味ではありましたが、 これらは using 指定の数式で利用できる点が異なります。
累次評価演算子は、一般には 2 個以上の要素を取ることができ、例えば
(e1,e2,e3,e4)のように指定すると、e1,e2,e3,e4 の数式が順に評価され、 e4 の値が式の値として返されます。
これとともに demo/running_avg.dem が追加されたのですが、 そこにはデータの移動平均を書くグラフの例が紹介されています。 ここでは、簡単な例を 2 つほど紹介します。
データの 2 列目 (y 座標) をそのまま使う代わりに、 1 行目からそこまでの平均を取ったものを表示する:
sum=0この後者の "using 1:" の後ろの部分が新しい機能です。 () の中に 3 本の数式が入っていますが、 最初の式 "sum=sum+$2" は sum に y 座標の和を保存する部分、 2 番目の式 "N=N+1" はデータの個数を保存する部分 ($0+1 を使ってもよい)、 3 番目の式 "sum/N" が y 座標値として使用される平均値となります。 これによって、N 行目の値をそのまま出力する代わりに、 1 行目から N 行目までの値の平均値を y 座標として出力できるようになります。
N=0
plot 'data' using 1:2 w l, \
'' using 1:(sum=sum+$2,N=N+1,sum/N) w l
データの 2 列目 (y 座標) をそのまま使う代わりに、 一つ前の行との差を取ったものを表示する:
lastv = 0この場合、"diff=$2-lastv" が差を保存し、 現在行の $2 の値を lastv に保存し、 先に計算した差の値 (diff) を式の値としています。
plot 'data' using 1:2 w l, \
'' using 1:(diff=$2-lastv,lastv=$2,diff) w l
以前は、このような作業は awk などを使わないとできませんでしたが、 これらの機能により、簡単なものなら gnuplot 内でできるようになりました。
なお、複数列の値を処理しながら描画、 ということをこの累次評価を行ってやろうとすると失敗することがあります。 次の例を見てください:
plot 'data' using 1:(sum=$2) w l, \この描画の場合、気持ちとしては、 最初の using は "using 1:($2)" で、 もう一つの using は "using 1:($2+$3)" となるように 見えるかもしれませんが、残念ながらそうはなりません。 これは、gnuplot のデータ走査と関連しています。
'' using 1:(sum=sum+$3) w l
この例の場合、 先に "using 1:(sum=$2)" のデータ走査が 最後まで行われて最初のグラフが描画され、 次に "using 1:(sum=sum+$3)" のデータ走査が 最後まで行われて 2 つ目のグラフが描画される、という形で実行されます。 よって、最初のグラフは正しいのですが、 2 つ目のグラフの最初の y 座標を計算する際の sum の値は、 データの最初の行の 2 列目の値ではなく 最後の行の 2 列目の値になっていますので、
「sum = (データの 2 列目の最後の行の値) + (最初の行の $3 の値)」となります。以後、
「sum = (直前の sum の値) + ($3 の値)」が y 座標の値となってしまうので、結局 2 本目のグラフは、
「2 列目の最後の行の値 + 1 行目から N 行目までの 3 列目の和」のようなもののグラフになってしまいます。
他にも、これらを使う何か有用な例が思いついたら紹介したいと思いますが、 おもしろい例があったら教えてください。
gnuplot-4.2.1 がリリースされました。
4.2.0 との違いの大半は、バグの修正だと思いますが、 CVS 版で取り入れられた小さい改良なども多少は含まれているようです。
(cf. 「情報やメモ (09/05 2007)」)
「情報やメモ (07/23 2007)」, 「情報やメモ (07/30 2007)」, 「情報やメモ (07/31 2007)」 に書いた cairopdf 出力形式ですが、 スクリプトを食わせた場合に日本語文字が文字化けする問題に対して、 「情報やメモ (07/31 2007)」 では環境変数 CHARSET で解決する、という回避策を書きましたが、 gnuplot の開発者に報告したところ、それは gnuplot のバグである、 ということで、より真っ当な対処をしてもらいました。
set encoding に新たに "set encoding locale" というオプションが新設されました (08/04 2007 以降の最新の CVS 版)。 これにより、encoding は locale のものと認識されるようになります。 よって、この場合は、スクリプトのエンコーディングと locale (LANG) の設定のエンコーディングが一致している必要があります。 とりあえず、次のようなスクリプトにすればいいことになります。
set encoding locale set term cairopdf set out 'cairopdf.pdf' set title "ABCDE 日本語" font "Sazanami Gothic,20" set xlabel "ABCDE 日本語" font "IPAGothic,16" set ylabel "ABCDE 日本語" font "IPAMincho,14" set label "ABCDE 日本語" rotate by 60 font "Sazanami Mincho,24" tc lt 3 plot sin(x) set out
(cf. 「情報やメモ (11/09 2007)」)
2 ちゃんねるの掲示板「gnuplot を使おう。その 2」(アドレスは リンクリスト 参照) に書かれた情報について、多少気になるものがありましたので、 少し書いておきます。
gnuplot のスクリプトファイルの標準的な拡張子は何 ? という質問がありました (191)。 もちろん、Unix ではそのような拡張子にはあまり意味はありませんが、
実は、gnuplot のソース配布物内では、 ある意味で 4 種類の「拡張子」が使われています。
.plt は、wgnuplot.mnu に書かれていますので、 多分 wgnuplot (MS-Windows 上) では デフォルトでは .plt なんだと思われている方が多いかもしれません。 また、tutorial/ (gnuplot 入門) ディレクトリ以下のスクリプトでも .plt という拡張子が使われていますし、 src/lasergnu (レーザープリンタ用の補助スクリプト), src/rgipgnu (Uniplex 用の RGIP 出力スクリプト) でも一時スクリプトの拡張子として .plt が使われています。
.gpl は、付属の説明文書の一つ INSTALL に、 MS-Windows 用の拡張子として .plt とともに書かれているのですが、 他では使われてはいません。
一方、.gp は、FAQ 内のサンプルスクリプト名として使われていますし、 gnuplot のオンラインヘルプのサンプルでも .gp が標準的に使用されています。 付属の emacs の gnuplot-mode Lisp ファイルにも、 auto-mode-alist の拡張子としてはデフォルトでは .gp の設定例が書かれています (もちろん任意のものに変更可能)。
しかも、上に書いたように tutorial 自体のスクリプトファイルは .plt になっているのですが、 tutorial に書いてある説明の中では実は .gp という拡張子が使われています。 gnuplot に関する本「使いこなす gnuplot」「gnuplot パーフェクト・マニュアル」 (cf. 「gnuplot に関する文献等」) でも .gp という拡張子が標準的に使われているようです。
ということで、.plt か .gp あたりが標準と考えて よろしいのだろうと思います。 私も普段は .gp を使用していますが、 emacs の auto-mode-alist では、 .gp も .plt も gnuplot-mode 用に受け付けるように書いています。
「情報やメモ (07/30 2007; no.3)」
に書いた、
gnuplot Q&A 掲示板 の情報の中の、
1581 の記事
(
「gnuplot だけで複数ファイルの任意の行をまとめてプロットする方法」)
からのスレッドの話と、
1589 の記事
(
「Octave 2.912 リリースにともない,gnuplot の扱いが変わりました。」)
からのスレッドの話に関して、
記事を書かれた松岡@名古屋大 さんからの
ご指摘により多少修正をしました。
詳しくは、
gnuplot Q&A 掲示板 の 1618 番の記事
(
「gnuplot に関する情報やメモ」)
をご覧ください。
大変失礼いたしました。
# よくわからないものは適当に書いているのがバレバレ (^^;
他にも、このページなどに書いていることで、 内容のおかしいものがあれば、遠慮なくメール (shige.iee.niit.ac.jp) で ご指摘ください。
「情報やメモ (07/23 2007)」, 「情報やメモ (07/30 2007)」 に書いた cairopdf 出力形式ですが、 コマンドラインからスクリプトファイルを食わせる場合に 文字化けする問題の解消方法を見つけましたので報告します。
その問題は、対話的に立ち上げた場合は日本語も文字化けしないが、 コマンドラインからスクリプトを食わせる場合は文字化けする、 というものでしたが、それは、コマンドラインから立ち上げる場合に、 glib が日本語の charset をうまく取得できていない、ということがわかりました。 そのため、その場合は、
Unable to convert "文字列": the sequence is invalid in the current charset (ASCII), falling back to iso_8859_1のようなメッセージが表示されます ("文字列" のところはスクリプトで使用している日本語文字列)。
これは、glib が「charset = ASCII」と見ていることを意味しているようで、 対話的に立ち上げると、この charset は正しく「charset = EUC-JP」や 「chaset = UTF-8」のようになるようです。
この charset の値は、glib の g_get_charset() を用いて取得していますので、 環境変数 CHARSET を設定してあげることで、 正しい charset を認識させることができるようで、 よって、以下のようにやれば OK です。
これで、コマンドラインからでも文字化けのない cairopdf の日本語出力が得られます。
なお、コマンドラインから実行する場合は、 環境変数 LANG はあまり関係ないようです。
(cf. 「情報やメモ (08/06 2007)」)
gnuplot Q&A 掲示板 での見聞き等で得た情報を備忘録として書いておきます。
データに列が 1000 個あって、それを 2 次元プロットするのに、
plot "test.dat" using 1:2, "test.dat" using 1:3, ...というのを 1000 まで書いていく方法しかないでしょうか、 という質問がありました。
1000 本もグラフを重ねたら、 まるでわからないグラフになるような気はしますが、 これをやるには、例えば次のような手があります。
plot for [j=2:1000] "test.dat" using 1:j
plot "test.dat" using 1:2, \のようなものを吐く awk スクリプト (test.awk) を作り、
"" using 1:3, \
"" using 1:4, \
...
"" using 1:1000
load "< awk -f test.awk"とする
上の awk スクリプト test.awk は、例えば
BEGIN{ print "plot \"test.dat\" using 1:2, \\"; for(j=3;j<1000;j++) printf "\"\" using 1:%d, \\\n",j; print "\"\" using 1:1000\n"; }といった具合ですし、pipe を利用する場合は、これも awk で書けば例えば、
BEGIN{ p = "gnuplot -persist"; printf "plot 'test.dat' using 1:2,\\\n" | p; for(j=3;j<1000;j++) printf "'' using 1:%d,\\\n",j | p; printf "'' using 1:10\n" | p; # fflush(p); }といった具合です。
(1547 の記事から始まるスレッド 「複数列のプロット」)
x 軸が時系列データであるデータが、
070404.143000.00 1 070404.143000.10 2 070404.143000.20 3 ...のようになっていて、これは、 timefmt が "%y%m%d.%H%M%S" であることを意味している (例えば 1 行目のデータは "2007 年 4 月 4 日 14 時 30 分 00.00 秒) とする。このデータのように秒以下の違いがある場合、 gnuplot では秒は整数としてしか読んでくれないが、 これを読ませることはできないか、 という質問がありました。
gnuplot の timefmt では、確かに秒は整数としてしか見ませんので、 秒以下の違いがあってもそれは無視されてしまいます。 しかし、以下のような意味でそれなりに意味があると思います。
例えば、元記事の人は、x の範囲は 1 分から、15 分程度、 と書いておられたのですが、もし x の範囲が 15 分程度だとすると、 1 秒はその 1/900 ですから、 0.1 秒はどんなに大きなグラフを書いても見分けがつきません (通常のグラフの解像度では表現できません)。 だから、本質的に timefmt を必要とするようなデータ (時:分:秒) のグラフの描画では、秒以下の違いは不必要なのだと思います。
描画範囲を 2,3 分とするのであれば、 むしろ timefmt 使わずに考えた方がいいだろうと思います。 例えば、xtics は手動にして、以下のようにします。
# 1430000.00 ==> 30:00 (14 時は捨てる) ==> 1800 秒 set xtics ( "30:00" 1800, "31:00" 1860, "32:00" 1920 ) plot 'data' using ($1*60+$2):($3) "%*6lf.%*2lf%2lf%5lf %lf" w lpこの using 指定の後ろについている format 指定で、x 座標のうち、 最初の小数点の前の 6 桁の数字を無視し (%*6lf)、次の 2 桁も無視し (%*2lf)、 次の 2 桁 = $1 (%2lf = 30)、その次の 5 桁 = $2 (%5lf = 00.00)、 その次の 2 列目のデータ = $3、とするようにしています。
その後で、$1*60+$2 によって、データの分以下の値を秒単位のデータに直して 描画していますが、set xtics によって軸の表示には 30:00, 31:00 のように 出るようにしてあります。
xtics を手動でしたくない場合は、multiplot を使った重ね書き、 という手もあります。
set multiplot # まずは目盛の見出しだけ set xtics unset ytics set lmargin 5 set key set timefmt "%y%m%d.%H%M%S" set xdata time set format x "%M:%S" set xrange ["070404.143000":"070404.143200"] set yrange [0:1] plot 'data' using 1:(1/0) # 次はグラフ unset timefmt set xdata unset xtics set bmargin 2 set ytics set xrange [1800:1920] set yrange [*:*] unset key plot 'data' using ($1*60+$2):($3) "%*6lf.%*2lf%2lf%5lf %lf" w lp unset multiplot後半のグラフの描画部分は、ほぼ上と同様ですが、 前半は、"1/0" の描画 (実際には空打ち) によって、 xtics だけ書かせる、ということを行っています。 ただし、上のように margin を適当に設定する必要があるでしょう。
(1556 の記事から始まるスレッド 「秒の小数点以下の表現」)
gnuplot-4.0 までは、set term postscript などで set output で 出力ファイル指定した場合、 描画の最後に "set output" (ファイル指定なし) を入れないと 次に set term x11 などと切りかえたときに PS 出力がうまくクローズされない、 ということになっていました (FAQ にもあります) が、 松田@東京電機大 さんによれば、 gnuplot-4.1 以降ではそれをしなくてもうまくいくようです。
調べてみると、2005 年 5 月位にそのような修正が入っているようで、 x11, win, pm, be, aquaterm といった 代表的な対話型 terminal に切り替えるときは、 その前に出力があったときにはそれをクローズする、 という使用になったようです。
(1560 の記事から始まるスレッド 「eps ファイルの連続出力」)
gnuplot の 3 次元グラフでは、それを包む箱の辺が書かれるだけで、 いわゆる x 軸 (y=z=0), y 軸, z 軸は通常は描画されません。 xzeroaxis, yzeroaxis, zzeroaxis (zzeroaxis は gnuplot-4.2 以降) を使えば多少書けるのですが、 x, y 軸自体が xy 平面 (z=0) に書かれるのではなく、グラフの底面 (z=0 ではない) に書かれるので、あまり期待したものにはなりません。
これに対して、松田@東京電機大 さんが、 描画範囲があらかじめわかっているのであれば set arrow を使って軸を書く、 という解を提示しておられます。 通常数学などでは「軸」は矢先を持った形で書きますので、 確かに zeroaxis よりも arrow を使って書くのが見た目にもいいかもしれません。 ちなみに、そこで松田@東京電機大 さんが提示しておられるサンプルは とても綺麗なグラフで、非常に参考になると思います。
(1569 の記事から始まるスレッド 「3 次元グラフの軸の場所」)
複数のファイルに x, y のデータが記録されていて、 "gnuplot だけを使って" そのファイルのある x のデータだけ取り出してグラフとして描画することは 可能ですか、という質問がありました。 具体的には、file_10.txt に
1.0, 2 1.5, 1 2.0, 0とあり、file_20.txt に
1.0, 3 1.5, 4 2.0, 5とある場合に、x=1.5 のデータだけとって、さらに、 「ファイル名のファイル番号を利用」して、
10, 1 20, 4のようなデータの描画をしたい、ということのようでした。 MS-Windows 系の OS で、また使用するマシンが不特定多数なので、 追加ソフトなしでやりたい、ということでした。
gnuplot のデータ処理は、残念ながらそこまで柔軟ではなく、 gnuplot 単体ではそれは不可能です。 MS-Windows 付属の標準コマンドは、テキスト処理はあまり得意ではないので、 その付属コマンドやバッチファイルを使ってもかなり面倒そうです。
松岡@名古屋大 さんから、WSH (VBscript、Jscript) を使えば 色々できるでしょう、 ただし awk (gawk) は大きくないので awk を入れて前処理すればいいのでは、 という回答がありました。
元の質問者も、それくらいなら USB メモリにも入りそうだし、 移植性もあるので、awk でやります、ということでした。 こうやって awk ユーザが増えるのはうれしいことですね (^^)
ちなみに、awk で上のような前処理をするには、 以下のようなスクリプト (test.awk) を使って、
BEGIN{ if(x == "") x=1.0 } (fname != FILENAME){ fname=FILENAME; N=fname; sub(/file_/,"",N); sub(/\.txt/,"",N); } ($1 == x){ printf "%d, %d\n",N,$2; next }以下のようにすればできます:
gawk -F "," -v x=1.5 test.awk file_*.txt > matome.txt
(1581 の記事から始まるスレッド 「gnuplot だけで複数のファイルの任意の行をまとめてプロットする方法」)
松岡@名古屋大 さんから、 新しい Octave 2.912 では、gnuplot 以外に独自の描画エンジンを持っていて (octplot)、低レベルの命令が gnuplot とリンクしなくなっている (私は Octave は使わないのでよくわかりません)、 という報告がありました。 詳しくは、 1589, 1593, 1618 の記事を参照してください。
(1589 の記事から始まるスレッド 「Octave 2.912 リリースにともない、gnuplot の扱いが変わりました」)
さらに松岡@名古屋大 さんから、 MS-Windows 用の Octave では gnuplot と双方向の通信を行うようになったようで、 それをやるためには、Octave 用に独自にパッチを当てた wgnuplot (4.2) が必要になる、という報告がありました。 将来、本家の gnuplot の方にそのパッチが提供される可能性もあるようです。
(1597 の記事から始まるスレッド 「From Octave maintainers ML」)
極座標 (set polar) を使用している場合、 その grid (set grid polar) には x, y 軸の目盛りのラベルししかつかないが、 角度と原点からの距離の目盛りのラベルをつけたい、という質問がありました。
実は、以前のバージョン (gnuplot-3.5) では、極座標の場合は 格子の角度 (0, 90, 180, 270 度のみ) にもラベルがついたのですが、 gnuplot-3.7 以降ではそれはやめられました。 それは多分「ラベル文字をどこに、どのように置くか」という問題が、 x,y 直交座標の場合よりも面倒だからだろうと思います。 最近のヘルプにも、以下のように書かれています:
version 3.7 では、極座標モードにおいていくつか変更がなされ、よって、 version 3.5 やそれ以前の版用のスクリプトには修正が必要になるでしょう。 主な変更は、仮変数 t が角度として使われるようになったことで、それによ り x と y の値の範囲が独立に制御できるようになりました。その他の変更は 以下の通りです: 1) 目盛りはもう 0 軸に自動的にはつきません − `set xtics axis nomirror`; `set ytics axis nomirror` を使ってください 2) 格子が選択されてもそれは自動的に極座標には従いません − `set grid polar` を使ってください 3) 格子は角度に関してはラベル付けされません − 必要なら `set label` を使ってください
ということで、これに対しては、以下のような回答がありました:
この最後のものは、以下のようにします:
set multiplot # グラフの描画 set polar set grid polar plot 1 # 角度見出しの描画 unset polar unset key unset xtics unset ytics set sample 13 # 30 度毎なので、360/30 +1 = 13 set xrange [-1:1] set yrange [-1:1] set angle degree tr(x) = 180*(x+1) plot '+' using (cos(tr($1))):(sin(tr($1))):(sprintf("%d",tr($1)+0.5)) with labels unset multiplot
後半 (といってもそっちの方がかなり長いですが ...) が 角度の見出しを書いています。 このようなことができることが、疑似ファイル '+' のメリットの一つです。
(1594 の記事から始まるスレッド 「極座標表示の目盛り」)
gnuplot では background color (背景色) の指定はできたでしょうか、 という質問がありました。 これに対して、以下のような回答がありました。
set multiplot set lmargin 0 set rmargin 0 set tmargin 0 set bmargin 0 set yrange [0:1] unset border unset ytics unset xtics plot 1 with filledcurves y1=0 2 reset plot sin(x) unset multiplot
# 座標軸で囲まれた領域全体の背景を水色に set object 1 rect from graph 0, graph 0 to graph 1, graph 1 back set object 1 rect fc rgb "cyan" fillstyle solid 1.0
最後のマクロのサンプルは、松田@東京電機大 さんによるものなのですが、 これはなかなかすごいです。 確かに、背景色指定や、反転表示などは、 今の gnuplot ならソースコードを改変して それほど難しくなく実装できるのではないかと思いますが、 このようなマクロによる実装は、ソースコードをいじらなくても 各ユーザが欲しい機能を追加できる、という点で優れていて、 そのような (しかも実用的な) CVS 版の機能をフルに生かした 素晴しいサンプルになっていると思います。
(1604 の記事から始まるスレッド 「background color」)
fit multi-branch のヘルプには、using 指定が "1:-1:2:3" のようになっているが、この y 座標は -1 よりも -2 が自然なのでは、 という質問がありました。 demo スクリプトである fit.dem でも -2 になっているようです。
これに対して、ついうろ覚えで -1 はバグでは、と書いて、 さらに gnuplot-beta にもそのように書いて送ってしまったのですが、 開発者から指摘されてよく考えたら、別にバグではありませんでした。 -1 であるか -2 であるかは、 ヘルプにも書かれている通り、データが 1 行の空行で区切られているか、 2 行の空行で区切られているかの違いでしかなく、 よって、データの形式に依存して使い分けるだけのことなので、 -1 でも間違いではありませんでした。
ただ、demo と合っていないのはよろしくない、と思ったのか、 開発者の一人が CVS 版のヘルプの方を -2 に変えてくれたようです (^^;
(1613 の記事から始まるスレッド 「fit multi-branch」)
(cf. 「情報やメモ (08/03 2007)」, 「情報やメモ (11/09 2007)」, 「情報やメモ (01/08 2009)」)
前回の報告 (06/10 2007)以後、 現在の CVS 版に入れられた主な機能について紹介します (ChangeLog, manual の更新部分等より)。
今回の目玉は、既にアナウンス済みですが、新しい PDF 出力形式として cairopdf terminal が追加されたことでしょう (cairo-1.2 以降が必要)。
環境変数 PAGER の件は、PAGER に less などを設定している場合、 今までは help の項目のサブトピックの一覧が最後についていたのですが、 それを less には流さなくなりました。 一応 "Help topic:" のところで '?' とすれば サブトピックは参照できるものの、やや不便な気がします。
plot sytle のヘルプの書き直しは、例えば lines であれば、
2 次元の場合 1 列: y # 行番号による暗黙の x の値 2 列: x y 3 次元の場合 1 列: z # x は暗黙の行番号、y は index から 3 列: x y zboxes なら、
2 列: x y 3 列: x y x_widthのように、データの指定方法に関する、 よりわかりやすい説明が統一してつけられるようになりました。
(cf. 「情報やメモ (11/09 2007)」)
「情報やメモ (07/23 2007)」 に書いた cairopdf 出力形式ですが、 cairo-1.2.4 をインストールして試してみました (cf. 「Unix に関するメモ等 (07/30 2007)」)。 簡単に、
set term cairopdf set out 'cairopdf.pdf' set title "ABCDE 日本語" font "Sazanami Gothic,20" set xlabel "ABCDE 日本語" font "IPAGothic,16" set ylabel "ABCDE 日本語" font "IPAMincho,14" set label "ABCDE 日本語" rotate by 60 font "Sazanami Mincho,24" tc lt 3 plot sin(x) set outのようなスクリプトで試したところ、以下のような感じです。
つまり、コマンドラインからだとどうも日本語がうまくいかず、 gnuplot を立ち上げた後に load する場合は、 LANG に応じてうまくいくようです。
しかし、このような画像出力形式の terminal は、 コマンドラインからちゃんと使えないとかなり不便なので、 これらの原因を少し調査してみたいと思います。
また、上のサンプルを見るとわかりますが、 日本語文字が大きいため (そしてそれを正確に計算できていないため) か、 周囲の余白が足りません。 よって、実際には set margin などで余白を調節する必要がありそうです。
(cf. 「Unix に関するメモ等 (07/30 2007)」, 「情報やメモ (07/31 2007)」, 「情報やメモ (08/06 2007)」)
現在の CVS 版の更新状況の詳細は後で報告しますが、 最新版では、新たに cairopdf 出力形式 (set term cairopdf) なるものが 追加されました。 まだ試していませんが、これは wxt 出力形式のコードを利用して作られたもので、 cairo と pango を使用して、PDF 出力を生成するものです (多分 wxWidget が必要です)。
これまでの PDF ライブラリによる PDF 出力形式 (set terminal pdf) と比較すると、PDF 出力形式で指定できたオプションは enhanced も含め cairopdf でもほぼすべて指定でき (一部オプション名が異なるものがある)、 しかもフォントは Unix では fontconfig ベースとなるため、 日本語も容易に使えるのではないかと思います (未確認) から、 その点は PDF 出力形式よりもいいかもしれません (PDF 出力形式では現在は 1 バイト文字のみサポート)。
ただ、ヘルプには utf-8 エンコードでないとだめ、と書かれています。 wxt 出力形式では EUC-JP でも Shift_JIS でもちゃんと日本語は出るようなので、 その辺りは確認してみる必要がありそうです。
(cf. 「Unix に関するメモ等 (07/30 2007)」, 「情報やメモ (07/30 2007)」, 「情報やメモ (07/31 2007)」, 「情報やメモ (08/06 2007)」)
「情報やメモ (12/10 2006)」 に書いたように、2 ちゃんねるに gnuplot に関する掲示板ができています。 今は「gnuplot を使おう。その 2」(アドレスは リンクリスト 参照) に移行していますが、 そこに書かれた情報について多少気になるものがありましたので、 少し書いておきます。
最近の質問で、各行 3 列のデータがあり、
第 1 列 = x 座標、第 2 列 = y 座標、第 3 列 = 1 or -1のようなデータがあるとき、この第 3 列が 1 であるか -1 であるかに応じて、 赤と青の点 (with points) で書き分けることができるか、 という質問がありました。
これに対して、awk を使って第 3 列が 1 のデータを取り出して書き、 同じく awk を使って第 3 列が -1 のデータを取り出して書く、 という回答が示されていましたが、 これは awk を使わなくてもできます。
例えば、gnuplot-3.7 以降ならば以下のようにすればできます:
f(a,b,c) = (b==c)?a:(1/0) set pointsize 5 plot 'data' using 1:(f($2,$3,1)) with p 3, \ '' using 1:(f($2,$3,-1)) with p 4関数 f(a,b,c) は、b==c のときには a を、 そうでないときは未定義値 (1/0) を返す関数なので、 これによって条件に合わないデータを捨てることができます。
また、現在の CVS 版の gnuplot では、 2D plot でも "rgbcolor variable" が使用可能になっていますので (マニュアルにはまだ 3D しかできないと書いてありますが、 2D でも現在は可能です。ただし、gnuplot-4.2 では不可)、 データから色を取得して色を塗り分けることができます。例えば以下の通りです:
mycolor(c) = (c==1)? 256*256*255:255 set pointsize 5 plot 'data' using 1:2:(mycolor($3)) with points lc rgb variableこの mycolor(c) という関数は、c==1 なら 255*256*256 = 赤を返し、 それ以外では、255 = 青を返します。 この色指定は、8bit (0~255) 毎の 赤、緑、青 (RGB) の強度を、 R*256*256+G*256+B として指定します (help rgbcolor 参照)。 こちらの方が、1 つの描画でできる分シンプルですが、 点の色は変えられるものの点の種類は変えられないので、 点の種類も変えたければ前のやり方を使う必要があります。
まあ、そう考えると、少なくとも with points, dots, impulses, errorbars, boxes, vectors などは linestyle/pointstyle も、 そろそろデータ (の追加列) から取れるように "variable" キーワードをサポートする必要があるのかもしれませんね。
前回の報告 (03/31 2007; no.2)以後、 現在の CVS 版に入れられた主な機能について紹介します (ChangeLog, manual の更新部分等より)。
前回の報告から少し期間が空いてしまいましたので、 それなりに修正等がかなり多く行われていますが、 gnuplot-4.2 の公開以降、以前より開発活動は小さいように感じます。 今回も新しい機能の追加、というよりもほとんどがバグ等の修正でした。
数桁ずつ区切る format 指定 ' というのは、 3 桁ずつ ',' を入れて区切るような表示で、例えば以下のようになります (環境変数 LC_NUMERIC が設定されていない場合):
gnuplot> show locale LC_CTYPE is ja LC_TIME is C gnuplot> print gprintf("%'.2f",160000) 160000.00 gnuplot> set decimalsign locale "ja" decimal_sign in local is . gnuplot> show locale LC_CTYPE is ja LC_TIME is C LC_NUMERIC is ja gnuplot> print gprintf("%'.2f",160000) 160,000.00 gnuplot> set decimalsign locale "de" decimal_sign in local is , gnuplot> show locale LC_CTYPE is ja LC_TIME is C LC_NUMERIC is de gnuplot> print gprintf("%'.2f",160000) 160.000,00なお、これは Solaris 9 の上での実行ですので、 それ以外のシステムでは "ja" や "de" の代わりに適切な locale を与える必要があります。
また、table 出力の改良とは、例えば、gnuplot 4.2 ならば
gnuplot> set table 'file.dat' gnuplot> plot sin(x) with vectors gnuplot> unset table(注: sin(x) を with vector で書くこと自体は あまり意味のある例ではありません) とすると、
#Curve 0 of 1, 100 points #x y type -10 0.544021 i -9.79798 0.364599 i -9.59596 0.170347 i -9.39394 -0.0308337 i ...のようなデータが作成され、with vector がない場合と同じだったのですが、 現在の CVS 版では、
# Curve 0 of 1, 100 points # Curve title: "sin(x)" # x y delta_x delta_y type -10 0.544021 10 -0.544021 i -9.79798 0.364599 9.79798 -0.364599 i -9.59596 0.170347 9.59596 -0.170347 i -9.39394 -0.0308337 9.39394 0.0308337 i ...のように、ベクトルデータとして保存されるようになりました。 先頭のコメント部分の出力も多少改善されています。
それから、plot の "with lines lc rgb variable" の件ですが、 実はまだマニュアルには、"rgbcolor variable" は splot にしか使えない、と書いてあるのですが、 実際には 2D の plot でも使用可能で、 points, dots, labels, impulses では既に使えるようになっていました。 これを今回 lines にも使えるようにした、ということです。 ただ、lines は前後の点で線分が決まるので、 その他のスタイルと違い、 色はどちらの点に指定された色を使うのか、という問題があり、 それで今まで lines には実装されていなかったのではないかと想像します。 結局は、P1 と P2 を結ぶ線分の色は、 P2 に対する色を塗るようにしているようです。
「情報やメモ (05/10 2007)」 に書いた立体視ですが、横に 2 つ並べての立体視の他に、 赤と青で左右のグラフをほぼ重ねて書いて、それを赤と青のメガネで見る、 という、昔からよく使われている方法もあります。 それだと、図の間隔を気にする必要がないので、 大きな図を見ることができますし、あまり訓練しなくても見れる、 というメリットがありますが、カラー画像を使えない、 という問題もあります。
画像処理ソフト (群) として有名な netpbm には、 2 つの画像をそのような赤と青 (正確にはシアン) の図にして重ねた画像を作る ppm3d というソフトが含まれていますので、 それを利用すれば簡単にそのような立体視画像を作ることもできます。 「情報やメモ (05/10 2007)」 と同じ z=x2-y2 のグラフを、 これを用いて作ったものを以下に紹介します。
この場合は、pm3d を使っても最終的には濃淡になるだけですし、 また、その濃淡が重なったところが見にくくなりますので、 pm3d はやめて、その代わりに hidden3d を使ってあります。 また大きな画像にできるので、視度差を 3 度にしてあります。 左目に青、右目に赤のセロハンを当ててみると立体視できると思います。 タイトルの文字が一つに重なるように見てみてください。
さらに、このような画像を何枚か作れば、 3D の GIF アニメーションを作ることもできます。 サンプルを以下に置きます。
ふと、視方向を set view で少し変えた 3 次元グラフを multiplot を使って 2 つ並べれば、3 次元グラフの立体視ができるのでは、 と思いたったのでやってみました。
あまり綺麗なグラフではありませんが、 z=x2-y2 のグラフを 試しに以下にあげてみます。 うまく立体視できるでしょうか。
平行法、交差法は、立体視する際の視線の合わせ方の種類です。 立体視については、例えば以下を参照してください。
平行法だと、図があまり離れていると立体視できないので 500x400 の図にしてあります。 ただ、見てわかると思いますが、 残念ながら上のグラフはそれほど立体的には見えず、 多少そんな風に見える、という程度です。 もっと立体視風のいいグラフが書けたら教えてください。
(cf. 「情報やメモ (05/11 2007)」)
前回の報告 (02/11 2007; no.2)以後、 現在の CVS 版に入れられた主な機能について紹介します (ChangeLog, manual の更新部分等より)。
今回の改良の目玉は、疑似ファイル名 '+' と strftime()/strptime() の追加でしょうか。 '+' は、これと using 指定によって、関数による疑似ファイルを実現します。 例えば、
plot '+' using ($1):(sin($1)) w l
によって y=sin(x) のグラフを書きますが、
これだと "plot sin(x)" と変わりませんが、
マニュアルには
plot '+' using ($1):(sin($1)):(sin($1)**2) with filledcurves
のような例が載っています。
関数描画は通常 y の値を 1 つしか持たないので、
filledcurves や candlesticks など、
複数の y の値を必要とする描画スタイルには関数を指定することは
これまではできず、データからの描画でしかそれは行えず、
よって、一度そのようなデータを作成しないと
gnuplot では描画できなかったのですが、
'+' によって using のフィールドに直接関数を指定することで、
ファイルからの入力と同じことが関数でもできるようになりました。
strftime(),strptime() は、C や AWK などでは良く知られたものですが、 時刻のデータとそれの表示用の文字列の変換を、 書式文字列によって行う関数です。 s=strftime(format,t) は時刻 t を文字列 s に、 t=strptime(format,s) は文字列 s を時刻 t に変換します。 ただし、t は 2000 年からの秒数なので、 通常の C や AWK の実装とは違いますので注意が必要です。
(cf. 「情報やメモ (06/10 2007)」)
gnuplot Q&A 掲示板 での見聞き等で得た情報を備忘録として書いておきます。
Linux と FreeBSD で set logscale y の軸の見出しの表示が違うのですが、 という報告がありました。デフォルトでは軸の見出しは "% g" で、 それは固定小数 (0.002 等) と浮動小数 (1e-5 等) の表示を 自動的に切り替える仕様になっています。 それが、例えば公比 0.1 の等比数列で言えば、
これは、色々調べたところ、どうやら gnuplot の問題ではなく、 Linux の C ライブラリ (glibc) によって起こる現象のようでした。 正しく 0.001, 0.0001, 0.00001 という値ならば、どの環境でも "%g" は 0.001, 0.0001, 1e-5 となるのですが、 データにわずかに誤差が含まれていて、 0.0009999, 0.00009999, 0.000009999 のようになっていると、 "%.2g" (2 は有効数字の桁数を意味する) 繰り上がったときに Linux 以外 (FreeBSD, Solaris 等) は上と同じですが、 Linux だけ 0.001, 1e-4, 1e-5 となるようです。
man printf の "%g" の説明を見ると、 どうも Linux, FreeBSD, Solaris はともにそんなに違わなくて、 Linux や FreeBSD では
The double argument is converted in style f or e (or E for G conversions). The precision specifies the number of significant digits. If the precision is missing, 6 digits are given; if the precision is zero, it is treated as 1. Style e is used if the exponent from its conversion is less than -4 or greater than or equal to the precision. Trailing zeros are removed from the fractional part of the result; a decimal point appears only if it is followed by at least one digit.Solaris では
The double argument is printed in style f or e (or in style E in the case of a G conversion character), with the precision specifying the number of significant digits. If an explicit precision is 0, it is taken as 1. The style used depends on the value converted: style e (or E) will be used only if the exponent resulting from the conversion is less than -4 or greater than or equal to the precision. Trailing zeros are removed from the fractional part of the result. A radix character appears only if it is followed by a digit.のようになっています。 Solaris の方が多少丁寧に「resulting」というのがついていますが、 いずれにせよ、小さい数の場合は指数部が -4 (10 の -4 乗) より 小さい場合に "%e" の表示形式を採用する、 ということになっているのがわかります。
これは、元々 printf() では "%g" は、 "%f" と "%e" の表記のうち、 短い方を採用する、という考えで導入されたためで、 例えば、以下の表記を見ればわかる通り、 仮数部に小数点 '.' が含まれて、指数部が 2 桁で書かれるときは 指数部が -4 のときに長さが等しくなります。
"%f" | "%e" |
---|---|
0.012345 (8 桁) 0.0012345 (9 桁) 0.00012345 (10 桁) 0.000012345 (11 桁) 0.0000012345 (12 桁) |
1.2345e-02 (10 桁) 1.2345e-03 (10 桁) 1.2345e-04 (10 桁) 1.2345e-05 (10 桁) 1.2345e-06 (10 桁) |
だからここまでは "%g" は "%f" の方を採用して、 -5 からは "%e" の方を採用しているわけです。
よって、もちろん -4 から "%e" になっても長さの点では 問題はないのですが、一応仕様上は「-5 から」となっています。 そして Linux 以外の実装は、0.000099999 のような数字に対しては、 「丸められた結果 1.0e-04 になったので "%f" とする」 となっているのですが、Linux は 「丸められた結果ではなく、元の数字の指数部が -5 ならば "%e" とする」としているように見えます。 上のマニュアルを見る限り、 結果の指数部を見ることになっているはずなのですが、 Linux の glibc ではそうなってはいないようです。 (ちなみに、K&R (第 2 版) にも同様に書かれていますが、 変換後の指数部なのか、変換前の指数部なのかは明示されていないみたいです。)
ただ、この -4 と -5 の境い目は、 上にあげたような数字の場合は確かにそこで長さが分かれるのでいいのですが、 gnuplot の軸の見出しのような 1.0e-XX のような丁度の数字の場合は、 実は "1e-05", "1e-06" のように小数点 '.' が つかないので、"1e-04" でも "%e" の方が短かく、 "0.001" (1e-03) でやっと等しくなります。 となると、"%f" と "%e" の短い方を 選んでいることになっていません。 実際、元の質問者もそれで Linux の仕様の方がいい、と思ったらしいです。
gnuplot は、実は printf() の出力をさらに拡張した gprintf() という関数を持っていて、 それで軸の表示などは行っているのですが、 その中では指数部や仮数部を取り出す書式 ("%T", "%t") もあります。 よって、gnuplot スクリプトの中でそれを改善することは無理かもしれませんが、 gnuplot の gprintf() (src/util.c) 自体を改良して、 そういうことを実装するのは難しくないかもしれません。
なお、Linux の日本語の man printf では、 「式 e は、変換される値の指数が -4 より小さい場合」 のように書かれているようで、 これだと確かに変換前の値だと見えなくもありませんが、 Open Group の IEEE Std 1003.1 (2004) には、 「style e (or E ) shall be used only if the exponent resulting from such a conversion is less than -4」 のように書かれているそうですから、 やはり Linux の実装が少しおかしいように見えるみたいです。
ちなみに、うちの以下のいくつかの環境 (標準の C ライブラリ) で試してみましたが、 いずれも FreeBSD や Solaris と同様に変換後の数字を見ているようで、 Linux と同じ変換をしたものはありませんでした。 なお、うちは Linux ひとつもはありませんので、 Linux だけは確認できていません。
(1513 の記事から始まるスレッド 「logscale での固定/浮動小数点の表示の切替え」)
(cf. 「情報やメモ (02/26 2009)」)
「情報やメモ (02/15 2007)」, 「情報やメモ (02/16 2007)」 に書いた、日本地図の塗り分けですが、 フリーの日本地図のデータを少し探してみると、一応はあるようなのですが、
という状況のようでしたので、 せっかくなので自分で書いてみました。 「情報やメモ (02/16 2007)」 の 東北 3 県のデータ同様、 地図を見ながら Tgif で手書きで書いてその座標データを抜きだしたものなので、 正確なデータではありませんが、 自由に利用 (改変、再配布) して結構です。 ただし、使用に関する一切の責任は持ちませんので、 自己責任でご利用ください。
以下に、上のサンプルに関する注意を上げます。
% awk -f maptest2.awk maptest2.dat > test.gpとするか、gnuplot 内で
% gnuplot -persist test.gp
gnuplot> load '<awk -f maptest2.awk maptest2.dat'として実行してください。
なお、このテストに関連して、次の 2 つのことに気がつきました。
後者は、gnuplot-4.3 ではうまくいくので、 gnuplot-4.2 のバグかもしれませんが、 一応明示的に 「set cbtics ("s1" c1,"s2" c2,...)」とすると gnuplot-4.2 でも表示できますので、 maptest2.awk ではそのようにしています。
ついに、gnuplot-4.2.0 が正式リリースされました。
配布物の中に、NEWS というファイルが含まれていて、 そこに 4.0 以降に新規に追加されたもの、変更されたもの、 修正された問題の一覧が書いてあります。 gnuplot-4.2.0 のそれを日本語に訳したものも以下に上げておきます。
「gnuplot version 4.0 以降の新しい機能、変更、修正」
改めてこうやってみると、ずっと追いかけてきたつもりでしたが、 もう忘れてしまっているものもだいぶありますね。 なお、これらはあくまで「主な変更」であり、 細かい機能の追加や修正などは、ここに上げた以外にもまだまだあります。
(cf. 「情報やメモ (09/05 2007)」,
「情報やメモ (02/15 2007)」 に書いた地図の塗り分けですが、 新潟や兵庫のように島がある場合はどうしたらいいかな、と思ったのですが、 その場合も簡単にできるようです。
「情報やメモ (02/15 2007)」 の例では、 各県のデータ (tohoku.dat) は 2 行毎の空行で区切られて書かれていて、 index を用いて各県を指定していますが、 島がある場合はその県のデータの下に 1 行の空行を空けて 島のデータを追加すればいいだけのようです。 これでちゃんと県と同じ色で島が塗られるようになるようです。 サンプルを一つ紹介しておきます。 前回のデータの秋田県の沿岸に架空の菱形の島を追加してあります。
(cf. 「情報やメモ (03/26 2007)」)
せっかくなので、「情報やメモ (02/14 2007)」 に書いたことを、サンプルを使って説明することにします。 以下では、gnuplot は CVS 版の最新の gnuplot (4.3) を仮定します。
まず、各県の地図データですが、 ここでは簡単に Tgif を使って青森、秋田、岩手だけの図を書いて、 その Tgif データ (.obj) から座標を抜きだしたものを利用します。 なお、Tgif では座標軸が上下逆なので y 座標には - の符号をつけてありますし、 またそのまま gnuplot で表示させるとアスペクト比が違うようなので、 gnuplot 内で set size ratio で調整する必要があります (手書きなので、かなりいいかげんです)。
これを、以下のようにすると境界線が表示されます:
set size ratio 8.0/5.0
unset key
unset xtics
unset ytics
unset border
plot "tohoku.dat" w l lt -1
色をつけて塗りつぶすには、filledcurves closed を用いて、 linetype として塗りつぶし色を指定します:
set size ratio 8.0/5.0
set key outside
unset xtics
unset ytics
unset border
plot "tohoku.dat" index 0 w filledc c title "青森"
lt rgb "#00ffff",\
"" index 1 w filledc c title "秋田"
lt rgb "#ff00ff",\
"" index 2 w filledc c title "岩手"
lt rgb "#ffff00",\
for [j=0:2] "" index j w l notitle lt -1
この plot の最後の for の部分は、先程の境界の描画と同じで、 塗りつぶしを行った後で境界の描画を行っていて、 前半部分が色による塗りつぶしになっています。
この前半部分を一つ一つ指定するのでなく、 別なデータファイルからその情報を読みとるようにするためには、 前回説明した、awk を利用してデータから値を取得する関数を作ります。 まず、以下のようなデータ tohoku3.dat を用意します:
# 東北 3 県の情報のデータ (30 年前)
# index [県名] [デフォルト色] [人口 (万人)] [面積 (平方 km)]
0 "青森" "#00ffff" 152 9000
1 "秋田" "#ff00ff" 126 11431
2 "岩手" "#ffff00" 142 15094
これに対して、次のような関数を使います。
getcol(x,j,name)=system(sprintf("awk
'($1==%d){gsub(/\\\"/,\"\"); \
print $%d}' %s",x,j,name))
これは、name という名前のファイルの、1 列目が x に等しい行から j 列目の値を
文字列として取得する関数で、
gsub() を使って文字列の前後についている '"' を削除するようにしています。
ただ gsub() を sprintf() の引数に書くために、本来 awk では 「gsub(/\"/,"")」と書くべきところを、 '\' と '"' を \ でエスケープする必要があるので 「gsub(/\\\"/,\"\")」 のように書く必要があります。
この関数を使えば、先程と同じものを以下のようにして得ることができます:
set size ratio 8.0/5.0
set key outside
unset xtics
unset ytics
unset border
getcol(x,j,name)=system(sprintf("awk
'($1==%d){gsub(/\\\"/,\"\"); \
print $%d}' %s",x,j,name))
plot for [j=0:2] "tohoku.dat" index j w filledc c
title getcol(j,2,"tohoku3.dat") \
lt rgb getcol(j,3,"tohoku3.dat"), \
for [j=0:2] "" index j w l notitle lt -1
getcol(j,2,"tohoku3.dat") によって県名を取得して それを title に渡し、 getcol(j,3,"tohoku3.dat") によって色名を取得して それを lt rgb に渡しています。
次は、人口別にグラデーションを利用して塗り分けてみます。 cbrange を人口の範囲に合わせて設定して、 カラーパレットを使用して色の塗り分けを行います。 人口の数値は getcol(j,4,"tohoku3.dat") で取得します:
set size ratio 8.0/5.0
set key outside
unset xtics
unset ytics
unset border
getcol(x,j,name)=system(sprintf("awk
'($1==%d){gsub(/\\\"/,\"\"); \
print $%d}' %s",x,j,name))
set palette color
set cbrange [100:200]
set colorbox user origin 0.8,0.3
plot for [j=0:2] "tohoku.dat" index j w filledc c notitle \
lt palette cb getcol(j,4,"tohoku3.dat"), \
for [j=0:2] "" index j w l notitle lt -1
最後に、連続的な塗り分けではなくて、 「離散的」な塗り分けを行う例を紹介します。 県の面積を、10000 平方 km 未満、15000 平方 km 未満、15000 平方 km 以上の 3 種類に分けて、それぞれを別の色で塗り分けます。 それには、値が色名であるような階段関数を設定して、 その値を lt rgb の後ろに指定すればいいわけです。
set size ratio 8.0/5.0
set key outside
unset xtics
unset ytics
unset border
set style fill solid 1.0
getcol(x,j,name)=system(sprintf("awk
'($1==%d){gsub(/\\\"/,\"\"); \
print $%d}' %s",x,j,name))
ar2clr(n) = (n<10000)?"red":
(n<15000)?"yellow":"cyan"
plot 1/0 w boxes fill title "10000 平方 km 未満"
lt rgb ar2clr(0),\
1/0 w boxes fill title "15000 平方 km 未満"
lt rgb ar2clr(10000),\
1/0 w boxes fill title "15000 平方 km 以上"
lt rgb ar2clr(15000),\
for [j=0:2] "tohoku.dat" index j w filledc c notitle \
lt rgb ar2clr(getcol(j,5,"tohoku3.dat")),\
for [j=0:2] "" index j w l notitle lt -1
ar2clr(n) がその階段関数で、3 項演算子を使って 10000 未満なら "red", 15000 未満なら "yellow", 15000 以上なら "cyan" を返す関数になっています。 よって、ar2clr(getcol(j,5,"tohoku3.dat")) で 求める色名が得られます。
また、この plot では、最初に 1/0 を 3 回出力していますが、 これは key を作成するための空打ちで、 値が 1/0 (無効値) なのでグラフの描画は行われませんが、 これによりタイトルとそのサンプルが右上に出力されます。 そのサンプルを塗りつぶしにするために "set style fill solid 1.0" を設定しています。
このようにすれば、県の境界線のデータ (上の tohoku.dat に相当) だけあれば、 後はその各県に対するシンプルな形式のデータ (上の tohoku3.dat に相当) に従って、 各県に異なる色を塗ることでそれらを表現できることが分かると思います。 従来の gnuplot では、このようなことをやるには色々面倒でしたが、 現在の CVS 版では、iteration 機能 (for) や system()、文字列変数機能により、 それらがかなり容易に行えるようになっていることが、 上の例からもわかるのではないかと思います。
以前、 「情報やメモ (01/30 2005)」 で書いたように、日本地図のデータがあると、 その上に各県に対応した棒グラフを作ることができます。 以下の松田@東京電機大 さんのサイトにもサンプルが置かれています。
ところで、現在の CVS 版の gnuplot なら閉曲線内の塗りつぶしもできるし (with filledcurves closed)、 色のグラデーションによる値の違いの表現も使えます (例えば linetype palette frac 0.5 とか) から、 同じことを、日本地図の各県を2 次元的に違う色や色の濃さで塗り分けることで 表現できないかなと考えてみました。
簡単にやろうと思えば、各県の閉曲線データを作って (またはどこかから持って来て)、 それをスペース区切りのデータや 2 行ずつのスペース区切りのデータにして every や index で一つずつそのデータブロックを選んで 書いていけばいいんですが、問題は塗りつぶし色の指定です。
set palette gray
plot for [j=1:47] "pref.dat" index j with filledcurves closed \
lt palette cb f(j)
のようにすれば、
例えば各県の塗りつぶし色を関数で与えられる場合は
それが可能になるのですが、
通常はそれは関数ではなくてデータとして与えたいわけですから、
これは工夫が必要です。
このサンプルの各県の折れ線データである pref.dat とは別に、 各県毎のデータを次のように作るとします:
# population.dat
# $1 = 県番号、$2 = 人口 (万人; 30 年前のデータ)
# (県番号は pref.dat の index 番号に対応)
0 542 # 北海道
1 152 # 青森
2 142 # 岩手
...
この population.dat から、
index j に対応する人口データを読み出して、
それを上の関数の値 f(j) とすればいいわけですから、
この f(j) (のようなもの) は例えば awk を使って
次のようにして作ることができます (CVS 版 gnuplot の場合):
f(j,name)=real(system(sprintf("awk '($1 == %d){print $2}' %s",
j,name)))
ここでは、汎用性を持たせるために第 2 引数をファイル名としました。
awk に、データの 1 フィールド目が j に等しい行の 2 行目を
関数の値としています。
ただ、これだと 1 フィールド目にない j の値を与えた場合は問題になりますので、
本当はもうちょっとちゃんと書くといいでしょう。
とりあえずこれを使えば、
plot for [j=1:47] "pref.dat" index j with filledcurves closed \
lt palette cb f(j,"population.dat")
のようにして、上に書いたことが実現できます。
もちろん、awk などを使って、population.dat から、
plot "pref.dat" index 0 w filledc c lt pal cb 542,\
"" index 1 w filledc c lt pal cb 152,\
"" index 2 w filledc c lt pal cb 142,\
...
のような gnuplot スクリプトを作成して、
それを gnuplot に食わせることもできますが、
上の方法ならば一つの gnuplot スクリプト内で閉じることができます
(シェルスクリプトのヒアドキュメントを使えば、
この方法でも一つのシェルスクリプト内に閉じることができますが)。
ということで、後は日本地図のデータを作ればいいんですが... サンプルとして紹介しますので、なんでしたら どなたかフリーのデータを作っていただけないでしょうか。
なお、このような手法を使えば、以前紹介した円グラフの描画 (cf. 「情報やメモ (02/08 2005)」) も実装できるのではないかとぼんやり思っています。
(cf. 「情報やメモ (02/15 2007)」)
前回の報告 (01/08 2007)以後、 現在の CVS 版に入れられた主な機能について紹介します (ChangeLog, manual の更新部分等より)。
今回の修正で目立つのは、 データ index に名前を指定できる機能でしょうか。 データファイルにコメントを埋め込むことで各 index に名前をつけて、 その名前を index に指定していて呼びだすことができるようになりました。
それから、set key に textcolor オプションが追加されたのですが、 そこで "textcolor rgb variable" と指定すると、 以前の gnuplot の「key の各エントリのタイトルの方もグラフと同じ色になる」 という機能が再現できるようになりました。
後は with impulses, with dots の色をデータから取得できるようになったことと、 latex terminal の amssymb パッケージを利用した点種の変更くらいでしょうか。 この点種は今までは、・、◇、+、□、△、*、○ (小、中、大)、● (小、中、大) のような感じだったのですが、 今度は、・、+、×、*、□、■、○、●、△、▲、▽、▼、◇、◆、 ハートマーク、スペードマーク、 などのようになっているようです。他のドライバ (post など) に、 合わせるように変更したようですね。
gnuplot Q&A 掲示板 での見聞き等で得た情報を備忘録として書いておきます。
pdf terminal の出力は横になっているのだけどこれを縦にするには、 という質問がありました。 今のところ、CVS 版でも PDF terminal には そのようなオプションはないのですが、 以下のような回答がありました。
(1504 の記事から始まるスレッド 「pdf出力について」)
日時データに、"02/11/2007 11:30:00" のように 空白が含まれる場合、それを一旦外部ツールでタブに変換しているが、 という話がありました。
確かにタブに変換してから処理すると、まぎらわしくなく処理できるのですが、 一応空白が含まれる場合もそのまま処理はできますが、 少し注意が必要で、例えばこの場合
set timefmt "%m/%d/%Y %H:%M:%S"
とすると、例えばデータが、
02/11/2007 11:30:00 1.00 02/11/2007 12:00:00 2.00のような場合は、$1 が日時データになりますが、 1.00 や 2.00 の方は $2 ではなく、$3 になります。 詳しくは、help set timefmt, help time/date を参照してください。
(1501 の記事から始まるスレッド 「plotコマンドの指定についてお教え願います」)
gnuplot が「line3: ';' expected」のようなエラーを出すが、 これはどういう意味か、という質問がありました。
こういうエラーは、プログラミング言語のコンパイルエラーと似ていて、 コンピュータ側が解釈に困った場所のエラーを出しているので、 実際には、それより前に問題が起きている場合があったり、 本当の間違いの意味とは異なる表示を行っている場合があります。
直接的には、「3 行目に ';' が足りない」と言っています。 多分、その ';' が足りない (と gnuplot が思っている) 箇所に、 その一つ上の行で '^' のような記号でその場所を指示していると思います。
今回は、その 3 行目には「set xdata depth」というものが 書かれていたことによる問題でした。set xdata は、正しくは
set xdataのいずれかの使用のみ許されています。 よって「set xdata depth」は、 本来ならば「最後の depth がおかしい」と言うべきですが、 gnuplot はこの行を頭から解釈し、 "set xdata" の次に "time" 以外の オプションが現れたことで、
set xdata time
「これはここに ';' を入れ忘れたのではないか、すなわち "set xdata ; depth" として 一旦その set 命令を終わりたかったのではないか」と解釈したわけです。 そうでないと set xdata の命令が仕様としておかしいからです。 そういう意味で ';' が足りないと言っているわけです。 もちろん、この場合は ';' をそこに入れても、 "depth" なんていうコマンドはありませんから やはりエラーになるのですが、 後ろの depth はまだ認識せずに、 とりあえず行の頭から解釈してきたときに そうとしか解釈できなくなったので、 このようなエラーを出したわけです。
この辺は、コンパイルエラーを読み解くのと同じで、 エラーが果たしてどういうことを意味しているのかを知るのは、 経験みたいなものが必要になります。 よって、よくわらなければ、 とりあえずはエラーが出ている行に書いたコマンドを、 オンラインヘルプで調べてみるのがいいと思います。
(1490 の記事から始まるスレッド 「エラーが出ます」)
古い記事へのフォローの形で、目盛りにつける見出し (数字) を 軸から離す方策として、
set format x "%15.1f"のようなものが紹介されました。ちなみに、古い記事 (218) では、
set format x "\n%g"のようなものが紹介されていました。
これらは gnuplot-4.2 以降であれば、 set xtics の offset オプションで見出し位置を 明示的にずらすことができます。 しかも、その指定数値の座標系も `first`, `second`, `graph`, `screen`, `character` のようなものをつけて指定することができます。
なお、4.2 (rc 版) 以降の MS-Windows 版バイナリは、以下にあります。
(1489 の記事から始まるスレッド 「目盛の数字を軸から離すには」)
y=f(x1) という x1 軸から y 軸へのグラフを書き、 x1 と x2 の関係式を与えておいて、 その x1 軸の目盛りに対応する x2 軸の目盛り (非線形な目盛り) を つけることはできないか、という質問がありました。
個人的には、非線形な目盛りは、その刻み (tics) を見ても、 刻みと刻みの間隔は不等間隔なので、 その軸上の値が何であるかはわかりにくいし、 それなら x2 軸と y へのグラフを別に書く、 あるいはそのグラフに重ねて書けばいいのでは、 と思いますが、 そのような非線形軸を実現する方法として、 以下のような回答がありました。
1482 の記事の例は、この掲示板のオーナーでもある 松田@東京電機大 さんの例ですが、 gnuplot の新しい機能を使った、まさに超絶技巧な例です。
ところで、上記の例は 2 つとも x2 軸のグラフ上の位置、 すなわちグラフ内の y の最大値が必要になるのですが、 これはこちらから yrange を指定するのなら問題はありませんが、 自動縮尺の場合は gnuplot-4.2 以降ならば GPVAL_Y_MAX という変数で それを gnuplot 内で取得することができます。 もちろん、一度描画データを読み込ませる必要があるので、 1 度空表示をしなければいけませんが、 set term post として set output "/dev/null" (Unix の場合; MS-Windows の場合は &uqot;NUL" ?) などへ空表示させればいいでしょう。 そうすれば GPVAL_Y_MAX に gnuplot が自動計算するグラフの y の最大値が 保存され、それを利用することができます (help gnuplot-defined, show variable all 参照)。
(1478 の記事から始まるスレッド 「目盛の振り方について」)
昨日 (01/24 2007)、 4.2 rc4 の公開のアナウンスをしましたが、 そこでマニュアルの日本語訳は少し後になると書いたのですが、 マニュアル等の変更部分は 4.3 の開発版の方に入っているものが ほとんどだったので、(試験の採点の息抜きに) やってしまいました。 「gnuplot マニュアルの日本語訳」 のページを参照してください。
gnuplot のページ の リンクリスト を修正しました。 リンク切れの削除等が主ですが、2 つ新たに追加もしました。 かなりのリンクが切れていましたので、ちょっと寂しくなったかな ?
gnuplot-4.2-rc4 が出ました。これが 4.2 rc の最終版だろうと思います (としたいようです)。
なお、gnuplot-4.2-rc4 の直前に 4.2-rc3 が出たのですが、 その configure スクリプト (readline 周り) を修正して 4.2-rc4 としたようです。詳しくは以下参照:
このマニュアルの日本語訳や日本語化キットの公開は、 今少し忙しいので、 今週末か来週末くらいにはやりたいと思います (前のとそう違わなければ早いかも)。
「注意、その他 (01/08 2007)」 にも書きましたが、 現在の CVS 版 (4.3) の gnuplot は コマンドのあいまいさが少し取り除かれていて 少し今までの書式と違うところがあります。
gnuplot.doc ドキュメントには、「backwards compatibility」の節に、
「以前の版で使われていたいくつかの書式は gnuplot 4.0 で非推奨となりましたが、 それは今でも認識はされ続けています。 これは現在コンパイル時に制御され、 以下のようにして無効にできます:と書かれているのですが、実際には現在の CVS 版は既に、./configure --disable-backwards-compatibility注意: 非推奨の書式は、未来の gnuplot のある版からは、 完全に無効になってしまうかもしれません。」
--enable-backwards-compatibility : 非推奨の書式を有効にするをつけて configure しないと認識されないようになっています。
例えば、新しい仕様だと、
plot sin(x) w lp 3のような書き方は許されず、
plot sin(x) w lp lt 3のようにしなければいけません。 今までのスクリプトを利用したまま CVS 版に入れ変えるとちょっと混乱するかもしれません。
gnuplot Q&A 掲示板 での見聞き等で得た情報を備忘録として書いておきます。
前回の報告 (11/13 2006)以後、 現在の CVS 版に入れられた主な機能について紹介します (ChangeLog, manual の更新部分等より)。
見てわかる通り、今回は新しい機能はなくほとんどが問題の修正や ちょっとした改良なのですが、 "set size" と "set terminal ... size" の考え方に 統一性を持たせるようにした、というのは重要だと思います。 ただ、これで 「情報やメモ (05/23 2006; no.2)」 に書いたような、png, ps, x11 で違うことがある、 というものが改善されるわけではないようです。