ページが長いので「しおり」の仕組みを用意してみました。
「しおり用」と書かれた所をクリックしてからブックマークに入れると、
それはページの先頭ではなく、その箇所へのブックマークになります。
(03/03 2006)
前回の報告 (11/08 2012)以後、 現在の CVS 版に入れられた主な機能について紹介します (ChangeLog, manual の更新部分等より)。
これらのうち、 11/17 の「文字の高さの計算用に一時的なフォント設定を利用」は、 従来とは異なる方式なので、 同じスクリプトでも今までとは異なる表示になる可能性があるようです。
また、11/23 の「(-3) 行目を最終列として認識するように」も、 データにたくさんの列がある場合、 あるいはファイルごとに列数が一定でないような 複数のデータの最終列を描画する必要がある場合は便利かもしれません。 ただ、個人的には、awk だと「$NF」で最終列、 「$(NF-1)」で最終列の一つ前の列、のように指定できるので、 awk を使う方が楽なような気がします。
しかし、一番大きな変更は、 11/24 の「複数のグラフ描画時の個々のグラフ範囲指定」、 および 12/14 の「個別範囲指定での局所変数、sample キーワードのサポート」 でしょう。 グラフ領域内に、関数の一部分だけのグラフを書きたい場合、 従来は 1/0 (や NaN) を利用して一部のグラフを切り捨てる、 といったやり方が gnuplot では一般的だったと思いますが、 その描画範囲を、グラフ全体の描画範囲とは別に指定できるようになりました。 マニュアルには以下のような例が載っています。
plot [0:1000] 'datafile', [0:200] func1(x), [200:500] func2(x)
これは「全体を 0〜1000 の幅にして」datafile を描き、
func1 は 0〜200、func2 は 200〜500 の範囲で描く、ということになります。
最初の範囲指定は、従来通り全体に通用するので、 最初の描画要素に対しても範囲指定をしたい場合は、 ダミーをかませる、という方法があります (した):
plot [-5:5] dummy=0, [-5:0] cos(x), [0:5] sin(x) lt 3
ただ、12/14 の「個別範囲指定での sample キーワードのサポート」で、 これは以下のようにダミーの定義式を入れなくても 書けるようになったのではないかと思います (未確認):
plot [-5:5] sample [-5:0] cos(x), [0:5] sin(x) lt 3
キーワード「sample」によって[-5:0] が cos(x) への範囲指定になるようです。
なお、この個別の範囲指定は、
本家では「サンプリング範囲指定」のように呼んでいて、
それで「sample」というキーワード名になっています。
オンラインマニュアルも「help sampling」で
個別範囲指定に関するヘルプが表示されます。
12/14 の「個別範囲指定での局所変数のサポート」は、 範囲指定の [0:5] の部分に [p=0:5] のように 局所変数名を指定できるようにする機能ですが、 これを応用すると以下のようなことが可能になるようです:
set title 'らせん曲線を 3 次元空間内に描画'
splot [-2:2][-2:2] sample [h=1:10] '+' using (cos(h)):(sin(h)):(h) w l
疑似データですから、通常は h ではなく $1 のように参照するのですが、
それを h のような名前で参照できるようになるようです。
また、この例は疑似データと個別の範囲指定を組み合わせて
空間曲線を媒介変数的に描いているのですが、これも目新しい応用ですね。
これまでも 3 次元曲線は、例えば媒介変数モードを使えば、
set parametric
splot [1:10][][-2:2][-2:2] cos(u),sin(u),u
のように描けましたが、媒介変数モードに移行せずに描けるのは良さそうです。
疑似ファイル '+' の x 座標用のデータ (-2≦x≦2) をスケール変換して、
sc(x) = (x+2)*9.0/4.0+1 # [-2:2] を [1:10] にスケール変換
splot [-2:2][-2:2] '+' using (cos(sc($1))):(sin(sc($1))):(sc($1)) w l
のようにすれば今でもできなくはないのですが、
上のように [h=1:10] と範囲指定してそのまま描画できればかなり自然です。
単純な「個別範囲指定」以外にも色々使えそうですね。
(cf. 「情報やメモ (01/22 2013)」, 「情報やメモ (01/26 2013; no.2)」, 「情報やメモ (07/23 2014)」)
以前、yomi 付属のツールとして、gnuplot の table 出力を音声化するプログラム tbl2snd なるものを作ってありました。
今回、それを yomi から独立させて、 tbl2wav.c として公開することにしました。
なお、libsndfile (http://www.mega-nerd.com/libsndfile/) が必要です。 MS-Windows 用の libsndfile もあるようですが、 そちらでコンパイルできるかどうかは未確認です。
少しオプションを拡張したり、制限したり、 新しい機能を追加したりもしていますが、 libsndfile の制限のため、音声データを標準出力には出せなくなっています。 また、ヘルプメッセージも英語化してあります (^^;
前回の報告 (09/14 2012)以後、 現在の CVS 版に入れられた主な機能について紹介します (ChangeLog, manual の更新部分等より)。
また報告が 2 ヶ月ぶりになりましたが、 今回は珍しく x11 temrinal 回りの修正が多少入っているようです (Ethan Merritt, Dima Kogan)。
また、wgnuplot で、persist モードでの挙動が変わったようです。 ChangeLog には以下のように書かれています。
どういうことかはイマイチわかりませんが、必要ならテストしてみてください。
これら以外に、今回は以下のような追加などが行われています。
個人的には、最後の hsv2rgb(H,S,V) がうれしいです。 実は、だいぶ前にそのような話をここでもしていました (「情報やメモ (03/08 2010)」)。 パッチも送りましたが永らく反応がなく不採用だと思っていたのですが、 今ころになって急にそれに相当するような機能が実装されました。 まだ試していないのですが、 これで HSV に基づく、より良さそうな色使いの曲面が 易しく描けるようになりそうです。
(cf. 「情報やメモ (12/21 2012)」)
gnuplot-4.6.1 が出ました。 配布物に含まれる NEWS には、以下のように書かれています。
4.6.0 からはそれほど大きな変更はありませんが、 色々な修正が入っていて、より安定した版になっていると思います。 「情報やメモ (09/14 2012)」 で報告した emf 出力の問題への対処は、この 4.6.1 にも含まれているようです。
前回の報告 (08/03 2012)以後、 現在の CVS 版に入れられた主な機能について紹介します (ChangeLog, manual の更新部分等より)。
emf terminal にだいぶ手が入っていますが、 このうちのいくつかは gnuplot Q&A 掲示板 の 2604 番の記事 「emfを含むMS-Word文書をPDFにエクスポートできない」 の問題に関するものです。
EMF terminal (wgnuplot のオプションなどを使って EMF 出力するのでなく) で出力した EMF ファイルを、MS-Word 文書などに取り込んで、 それを最近の MS-Word で直接 PDF 化すると それができないと言われることがある、 できたとしても枠のような四角形が一つ余計に表示される、 という問題でした。
これは EMF terminal のバグと、 MS-Office の (妙な ?) 仕様のせいだったのですが、 ついでに他にも EMF terminal にいくつか問題があったところ (線種や破線のパターン、無駄な出力がかなり含まれること、 2 回の plot を一つのファイルに出力した場合の問題等) を Merritt さんに修正してもらいました。
そのほかには、「set link」の新設が目玉でしょうか。 set link は、x や y の 1 軸と 2 軸の対応関係を定義するものです。 対応には数式が利用できますので、非線形の対応をつけることも可能です。 この対応をつけると、1 軸の範囲設定を行えば、 自動的に 2 軸にもそれに対応する範囲設定が適用されます (逆に x2range などの設定は無視される)。
非線形な軸設定は、今までは対数軸 (あるいは自前で座標変換と xtics を制御する方法) しかなかったのですが、 これを用いればより色んな非線形軸を設定できることにもなります。 demo/linkedaxes.dem のサンプル出力を以下に示します。
この demo ファイルでは、
set link x via 12398./x inverse 12398./xとしていますので、x2 軸は x 軸と反比例関係になります。
(cf. 「情報やメモ (10/03 2012)」, 「情報やメモ (11/08 2012)」, 「情報やメモ (07/18 2014)」)
2 ちゃんねるの掲示板「gnuplot を使おう。その 3」(アドレスは リンクリスト 参照) に書かれた情報について、多少気になるものがありましたので、 少し書いておきます。
1.60e-19 の 20 乗が 0.0 と表示されてしまう、 という質問がありました (74)。
これは gnuplot でなくても普通だせず、倍精度小数の限界によるものなので、 通常はそのような数は 0 になってしまいます。
gnuplot でどうしてもそういうことをやりたい場合は、 e-19 をもっと小さすぎない値に変換して (1.0e10 倍するとか)、 その指数部分を適当に変換するとか、 または gnuplot の gprintf() に用意されている指数部、 仮数部を扱う書式文字列を利用する、などが考えられるでしょうか。
また、log10() を利用すれば、自前で仮数部と指数部を別に計算する ようなことも可能です。
x = 1.6E-19
n = floor(log10(x)) # 指数を取得
y = x * 10**(-n) # x の仮数部
x2 = y**20 # 仮数部の 20 乗
n2 = floor(log10(x2)) # その指数部
y2 = x2 * 10**(-n2) # その仮数部
m = n2 + n*20 # y2 につけるべき最終的な指数
s = sprintf("%fE%d", y2, m)
print s
set xtics pi にしたとき、横軸に「3.14, 6.28」等でなく、 「π, 2π」等とでるようにするには、という質問がありました (79)。
これは、実は少し前にもほぼ同じ質問があって、 ちゃんと回答もついていたものなのですが (49,50,52,53)、 今回も「set xtics ( "-2{/Symbol p}" -2*pi, ... )」 のような enhanced mode + Symbol フォントを利用して 明示的に一つ一つの目盛りラベルを指定する回答がつけられていました (79)。 せっかくですから、質問者が日本語全角文字で「π」と書いていることから、 それもありだと考えた別の解を紹介します。
それは、既に 「情報やメモ (02/07 2012)」 に書いたように、 「set format x "%.0Pπ"」とする方法です。 もちろん、enhanced モードで「set format x "%.0P{/Symbol p}"」 でも結構ですが、 set format を利用すれば一つ一つ明示的に書く必要はありません。
ただし、これだと -pi, 0, pi のところが 「-1π, 0π, 1π」になってしまうので、gnuplot-4.2 以降ならばこの後に
set xtics add ( "0" 0, "-π" -pi, "π" pi )のようにするとその辺りも解消されるでしょう。
上と下の x 軸で別の単位を使うことはできますか、 という質問がありました (82)。
回答もついていましたが (83)、 これは第 2 軸 (x2 軸) というもので対応できます。 こういうものが作りたい、というサンプルグラフも示されていましたが (84)、 これは多分以下のようにすればできます。
set term x11 enhanced font ",17"
set xlabel "Wavelength (micrometers)"
set ylabel "Emissivity"
set logscale x
set xrange [5.8:45]
set yrange [0.78:1.02]
set ytics 0.8,0.05
set xtics ( 6, "" 8, 10, "" 12, "" 14, "" 16, "" 18, "" 20, \
"" 22, 24, "" 26, "" 28, "" 30, \
45 )
set key left bottom reverse
set xtics nomirror
set x2range [1700:200]
set format x2 "%.0f cm^{-1}"
set x2tics 500,500
plot "data" t " RATW10114" w l lt 3
なお、enhanced モードにしているのは、上の軸の cm の -1 乗のためです。 また、set xtics で目盛りをいちいち明示的に指定していますが、 gnuplot では目盛りの「増分指定形式」は、 対数軸では「倍数指定」になってしまうため、 対数軸で等差数列の目盛りをふるには明示的にやるしかありません。
「情報やメモ (06/03 2012)」 に書いた 73 へのコメントを 2ch に紹介してくださった方がいて (81)、 それに対して、 「(abs($i)) はだめでしたが (abs(column(i))) でいけました」 という回答がありました (85)。
これは多分、「(abs($i)) がだめ」なのではなく、 「$ 記号が使えない環境」で そのスクリプトを実行しているのではないかと思います。
例えば、gnuplot の call 命令で呼び出しているスクリプト内では、 $1 は「1 列目のデータ」ではなくて「call の 1 番目のパラメータ」 になってしまいます。 この場合は、$1 ではなくて column(1) か $$1 と書くことになっています (help call 参照)。
または、シェルスクリプトや他の言語のスクリプト内で gnuplot スクリプトを書いている場合も、 $1 はそのスクリプト言語の方で別の意味に使われてしまう場合がありますので、 そういう場合は代わりに column(1) を使う必要があります。
私も、普段シェルスクリプトのヒアドキュメントとして gnuplot スクリプトを書くことが多いのですが、 その場合は、ヒアドキュメント部分の $ の展開機能を抑制するか、 または column() を使ってしのいでいます。
負の数に対数軸を適用したい、ということと、 キー入力でグラフの線形軸と対数軸を切り替えたい (x11)、 という 2 つの質問 (多分) がありました (86)。
負の数に対数軸を適用することについては、 set format で軸の目盛りラベルに - をつけることと、 using で実際の値の -1 倍のグラフを書くようにすると、 一見それらしくなる、という 質問者からのサンプルスクリプトがついていましたが、 多分それがある意味で一番真っ当な解だと思います。 ついでに言えば、その場合は「set yrange [] reverse」を使用して 軸の向きも逆向きにするといいでしょう。
set logscale で負の底を指定することでできるようになるとうれしい、 という要望も書いてありましたが、 ソースを見るとこうなっている、とも書いてありましたので、 もしソースを見てわかるようであれば、 自分の gnuplot をそのように修正する、 ということで解決可能だと思います。
ただ、個人的には、そういう対数軸の使用はかなり特殊ケースだと思いますので、 上のように一見それらしくなる対処を取るのが自然かなと思います。
また、キー入力によるグラフの線形軸と対数軸の切り替えは、 デフォルトの x11 terminal でちゃんとできます。 実際、質問者のサンプルスクリプトでも、こちらで試してみると、 グラフ画面上で「l」とすると線形軸と対数軸がちゃんと切り替わります。 もし切り替わらないとすると、それはそのグラフウィンドウが 「bind が有効でないグラフウィンドウ」である可能性があります。
例えば、gnuplot の -persist オプションを使用すると、 gnuplot 終了時にグラフウィンドウのみを残すことができますが、 そのウィンドウでは限定されたキー入力 (space と q と m 位) しか使用できません。 それは、-persist のグラフウィンドウでは gnuplot 自体が既に終了しているからで、 グラフの書き換えを伴う処理は基本的にできないからです。
また、「set term x11 1」のようにウィンドウ番号をつけて 複数のグラフウィンドウを開いている場合も、 bind が有効なのは最後に開いた (または set term x11 で最後に指定した) グラフウィンドウなので、 それ以外のグラフウィンドウでは「l」のようなキーは効きません。
(cf. 「情報やメモ (01/22 2013)」)
前回の報告 (06/03 2012; no.2)以後、 現在の CVS 版に入れられた主な機能について紹介します (ChangeLog, manual の更新部分等より)。
また 2 月ほど開いてしまいましたが、 今回は新しい機能がいくつか追加されました。
まず、最初の set surface の新設オプションは、 3 次元格子データに対して、網目状の線を書かないようにするオプションです。 例えば、デフォルトでは網目状の線が書かれます:
set view 30,30
# set surface implicit # これはデフォルト
splot '-' w l
0 0 0
1 0 1
2 0 3
0 1 2
1 1 2
2 1 1
0 2 1
1 2 0
2 2 1
e
これを「set surface explicit」とすると、網目状の線はなくなり、 通常のブロック毎の折れ線のみが描画されます:
言われてみればこういう機能は今まではなかったですかね。 こうするためには無理矢理なことをやらなければいけなかったかもしれません。
2 つ目の「名前付きデータブロック」とは、 インランデータに名前をつけて再利用できるようにする、というものです。 例えば、今までのインラインデータの場合は、 一度しか使えない、という仕組みになっていました:
plot '-' w l, '-' axes x1y2 w p
0 0
1 2
e
0 0
1 2
e
これは同じデータなのですが、
2 番目のデータを '' と省略することはできません。
それに対し今回導入されたのは、
いわゆるヒアドキュメント形式でのインラインデータで、
名前をつけて再利用可能にしています。
$hoge <<EOD
0 0
1 2
EOD
plot $hoge w l, '' axes x1y2 w p
何度でも使えるので、この後 stats に食わせることもできます。
このインラインデータの名前には
先頭に $ という文字をつけることになっています。
3 つ目は、key で凡例としてグラフのタイトルを一覧で並べる代わりに、 グラフの端に直接タイトルをつける仕組みです。例:
unset key
$data << EOD
x hoge fuga
0 0 0
1 1 2
2 3 1
EOD
set xrange [0:4] # x=2 で終るグラフの後ろにつくので少し広く
set yrange [0:3.5]
plot for [i=2:3] $data u 1:i w l t columnhead at end
この例では、columnhead を使ってデータの先頭列からタイトルを取得していますが、 それを key ではなくグラフの右端につけることができます。 at beginning の場合は左端につきます。 グラフが多い場合、色や線種によって見分けることが難しい場合などは 重宝しそうな機能だろうと思います。
なお、最近の改訂は、 日本人のバグ報告による修正も多かったようです。 最近は日本からの gnuplot のダウンロードも多いようですから、 これからも多くの日本のユーザが gnuplot に貢献し、 よりよく発展させていってもらえるといいなあと思います。
(cf. 「情報やメモ (09/14 2012)」)
「情報やメモ (06/03 2012; no.2)」 に報告した CVS 版の変更ですが、一つ説明し忘れたものがありました。 古くからの仕様で、今回一つ変更されたものがあります。
gnuplot-4.6 までは古い仕様なので、まだ影響はあまりないと思いますが、 古くから gnuplot を使用している人は注意が必要です。
前回の報告 (05/01 2012)以後、 現在の CVS 版に入れられた主な機能について紹介します (ChangeLog, manual の更新部分等より)。
今回の大きな変更は label (set label, with labels) に対する hypertext オプションの追加でしょうか。 今のところはまだ svg, canvas, wxt, win などの出力形式しかサポートしていませんが、 これはグラフ上に点を書き、その点にマウスを合わせると、 それにつけられた文字列を含む箱がポップアップする、 というものです。
実験していないのでよくわかりませんが、 「バルーンヘルプ」「ポップヒント」みたいなもの (ツールチップ ?)、 のようなものではないかと想像しています。
2 ちゃんねるの掲示板「gnuplot を使おう。その 3」(アドレスは リンクリスト 参照) に書かれた情報について、多少気になるものがありましたので、 少し書いておきます。
「Skipping data file with no valid points」というエラーが出てしまう、 という質問がありました (54)。
これは、回答でも説明されていました (55) が、 「有効な点が一つもないデータファイルをスキップします」 というメッセージで、 例えば plot で指定したデータファイルが空であったり、 すべてがコメント行であるような場合、 すなわち適切なデータが 1 つも見つからなかった場合に出ます。 データの内容を確認する必要があります。
なお、データに間違ったファイル (例えばスクリプト) などを指定すると、 「Bad data on line 1 of file XXX」のようなメッセージが、 データファイルが見つからなかった場合は 「Skipping unreadable file XXX」のようなメッセージが出るようです。
データの x の範囲が 48-120 と 218-289 の 2 つに分かれている場合、 波線を 2 つ入れて省略するように表現したいが、 という質問がありました (57)。
基本的には gnuplot にはそのような機能はありませんが、 工夫次第でそのようなグラフを書く方法はあります。 実際にそのようなサンプルを上げてある Web ページが紹介されていました (58) が、そこでは、3 項演算子で一方の領域のデータをマスクして、 2 度に分けてそれぞれを書いているようです。
他にも、multiplot を利用して重ね書きする方法などもありそうですね。
set format で指定する %s は、実際には %g でなくて %f を使っているので、 set yrange [0:2e+9] のような場合、 「set format y '%s%c'」とすると目盛りが 「500M, 1G, 1.5G, 2G」となって欲しいのに、 「500.000000M, 1.000000G, 1.500000G, 2.000000G」となってしまう、 なぜ %g でなくて %f を使っているのか、 という質問がありました (64)。
確かに %f よりも %g が適切なような気もしますが、 もしかすると何か理由があるかもしれません。 必要なら開発者に報告してみようかと思います。 ただ、「%s」でも「%.1s」のような幅指定ができるので、 多少は期待するものに近付けられます。
また元の質問者は、ソースをいじればなんとかなりそうだけど 他の人も使っているのでそれはやりたくない、と書いていましたが、 自分でソースを修正できるのであれば、 %g を使うような %s を別な書式記号で追加する、 という手もあると思います。
gnuplot-4.4、4.6 で win terminal で EMF 出力させたものを PowerPoint でグループ解除すると変な枠が出る、 といった質問がありました (65, 72)。 4.2 ではそういうことはなかったんだけど仕様でも変わったのか、 ということでした。
私は PowerPoint は使わないので状況そのものがわからないので、 それがバグなのか、修正が必要なのかどうかもよくわかりませんが、 もしその EMF ファイルを「windows terminal の EMF 出力」 を利用して作成しているのであれば、 「emf terminal の出力」の方を試してみる、 という手があるかもしれません。
MS-Windows 上での EMF ファイルへの出力は、 Windows terminal 上で行う (ボタンやメニュー、ショートカット等で) 方法と、 emf terminal を利用する方法 (set term emf) の 2 種類があり、 Windows terminal 上の EMF 出力の方は Windows terminal の変更に伴って確かにだいぶ変更があったようですが、 emf terimnal の方はそれほど変更はないように思います。
ylabel を左ではなく、軸の上に出したい、 という質問がありました (67)。
これに対して ylabel でなく、set label とかでやったら、 という回答がありましたが (68)、 多分 set ytics のオプションで解決できる問題ではないかと思います。
「軸の上」というのが何を意味しているのか今一つ明確ではないのですが、 例えば左の枠線上に文字と枠線が重なるように出したい、ということならば、 「set ytics offset char 2」とでもすれば右に 2 文字分移動してくれます。 または、y 軸 (x = 0 という直線) の近くに出したい、ということであれば、 「set ytics axis」とすれば x = 0 の上に出てくれます。
これ以外にも、left, right, center などの位置合わせオプションもあるので、 set label などで自前でやらなくても、 目盛りラベルを望みの場所に出力することが容易になってきています。
「set pm3d map; splot [:2*pi][:2*pi] sin(x)*cos(y)」とすると、 y の範囲が -10 ~ 8 (記事は 0 ~ 7 と書いてあるが) になって、 2πより上になってしまうので上に空白部分ができてしまう、 という質問がありました (67)。
これは確かに実験してみるとそのようになるのですが、 回答にあったように、下限を指定して、 「splot [:2*pi][-10:2*pi] sin(x)*cos(y)」とすると解消します。 下限を指定することで、自動縮尺機能 (autoscale) が解除されるためだと思われますが、 実は今一つよくわかりません。
次の目盛り位置まで軸を伸ばさない指定は、set autoscale でできるのですが、 「set autoscale yfix」とすると確かに問題は解消します。 しかし、最大値の方だけの自動の伸ばしを解消するために 「set autoscale ymaxfix」とすると問題は解消しません。 そこがちょっとよくわかりません。
また、これは 4.0, 4.2, 4.4, 4.6 共通の現象なのですが、 現在の CVS 版 (4.7) ではこの問題は起きません。 3 月位の版からそうなるので、 丁度 4.6 がリリースされた直後に行われた set *range に関する改良 (03/09) の影響だろうと思われます。
「plot for [2:3] 'hoge.dat' using 1:i」を、 「plot for [2:3] 'hoge.dat' using 1:abs(i)」にしたがうまくいかない、 という質問がありました (73)。
これはいくつか間違いがあります。
ということで正しくは「plot for [i=2:3] 'hoge.dat' using 1:(abs($i))」 のようになるでしょう。
(cf. 「情報やメモ (08/23 2012)」)
前回の報告 (01/22 2012)以後、 現在の CVS 版に入れられた主な機能について紹介します (ChangeLog, manual の更新部分等より)。
かなり報告があいてしまったので、この間に色々な改良がなされています。 この間の一番大きな話題は、もちろん 4.6.0 のリリース (03/11) ですが、 その公開に向けた修正などが多く行われ、 4.6.0 のリリース後は少し一休みといった感じで しばらくはたいした更新はありませんでした。 4 月位からまた少しずつ新しい改良などが行われているような感じで、 RGB に Alpha 値の追加 (出力形式依存)、 emacs での gnuplot-mode の利用を改善する仕組み、 set style circle の新しい {no}wedges オプション、 などが追加されているようです。
「with labels の追加列を pointsize として」 というのは少し意味がわかりませんが、 時間のあるときに試してみて、面白そうならばまた報告したいと思います。
with labels で現在はデータ内の文字列もグラフ上に描画できます。 日本語の出力もできますし、フォント指定も set label 同様に行えます。 しかし、具体的なデータで試してみたところ、 一つ気がつきました (x11, gif terminal、日本語は EUC-JP)。
1 1 ほげというデータを
2 2 "ふが"
1 2 hoge
2 1 "fuga"
using 1:2:3 w labels font "[適当な日本語フォント]"
で表示させると、hoge, fuga の方はどちらも出ますが、
日本語の方は「ふが」は出て「ほげ」は出ません。これは、
「情報やメモ (01/29 2008)」
でも書いていますが、日本語文字列を引用符で囲んでいないためのようです。
英文の方はちゃんと出るのですが、日本語の方は出ないので気がつきにくいですね。
しかしこれも、以下のようにすれば、引用符なしでもちゃんとでるようです。
using 1:2:(strcol(3)) w labels font "[適当な日本語フォント]"
なお、いくつかのバージョンで試してみると、 gnuplot-4.4.X (X=0,1,3,4) でも 1:2:3 で引用符なしの日本語が出るものもあれば (X=1,4)、 出ないものもあり (X=0,3)、 開発版でも出るもの (2011 11/29 以前) も出ないもの (2011 12/08 以降) もあるようで、どういうことなのかよくわかりませんが、 日本語は引用符がないと、または strcol() を使わないと正しくは出ない、 と思っておいた方がいいかもしれません。
MS-Windows 上の wgnuplot でも、 バイナリによって出たり出なかったりするようなので、 やはり正しくは出ないと思っておいた方がよさそうです。
ついに gnuplot-4.6.0 が出ました。 NEWS は、4.6rc1 のものから変わっていませんので、 4.4 からの変更点については、 「情報やメモ (01/22 2012; no.2)」 を参照してください。
2 ちゃんねるの掲示板「gnuplot を使おう。その 3」(アドレスは リンクリスト 参照) に書かれた情報について、多少気になるものがありましたので、 少し書いておきます。
相当な超絶技巧 (力技) を駆使して 色んなグラフを書く方法を紹介しているサイトが紹介されていました (31)。
gnuplot Q&A 掲示板 でも紹介されていましたが (2572)、 新しい gnuplot の機能、中にはシェルスクリプトや AWK などを使って、 相当にすごいことを行っています。
なお、このサイトの画像はほとんど PNG で、 また javascript でサイドバーを使っているので、 PNG が表示できず javascript も使えないような古いブラウザを 普段使っている私には、 最初何がすごいんだか全くわかりませんでした (^^;
スクリプトファイル (コマンドライン指定) の中から、 スクリプトファイル名自身を取得できないか、という質問がありました (35)。
回答はついていませんでしたが、 確かにそれは今の gnuplot ではできません。 call コマンドでスクリプトを呼び出した場合も、 C 言語などとは違って $0 は 1 つ目の引数になってしまうので、 スクリプト名を取得することができません。
ただ、これはできると便利かもしれないので、 GPVAL_SCRIPT などに現在のスクリプトファイル名を保存するような パッチでも作って、本家に送ってみたいと思います。
グラフを 4:3 にするには、という質問がありました (40)。
質問には「軸を 4:3 にしても、y2label、y2tics などによって 画像として 4:3 でもグラフが 4:3 じゃなくなる」 といった形に書かれています。つまり、4:3 にしたいのは、 画像全体の大きさではなくてグラフ部分のことのようです。
画像を加工したら、とか set term の size オプションの回答がついていましたが、 以前の gnuplot では、このようなサイズ指定の意味については やや terminal 毎に曖昧なところ、不統一なところがありましたが、 現在 (gnuplot 4.4 以降) は、ほぼ以下のような仕組みに統一されています。
よって、set term での指定ではキャンバスは 4:3 になっても グラフが 4:3 になるとは限りません。以下は、いずれも 「set size 1,1」(描画領域 = キャンバスサイズ) の場合の例です。
xrange は [-4:4]、yrange は [-2:2] にしているので、 グラフ部分が正しく縦横が 1:2 ならば点線の格子が正方形になるはずですが、 正方形ではなく長方形になっているのがわかるでしょうか。 このように、set size XX,YY は軸の label など含んだ領域の指定なので、 これでは「グラフ部分」の比を固定することはできません。
一方で、「set size ratio <r>」の r は 「グラフ部分」のアスペクト比 (横に対する縦の比) の指定なので、 これを指定すればグラフ部分の比を設定できます。 以下はいずれも「set size ratio 0.5 1,1」の例です。
グラフ部分の大きさは違いますが、いずれも正しく縦:横が 1:2、 すなわち格子が正方形になっていることがわかるでしょうか。 なお、「set size ratio 0.5 1,1」は「set size ratio 0.5」 と書いても同じですが (デフォルトは 1,1 なので)、 ratio 指定と XX, YY の両方を指定すると、 その XX, YY の範囲内で ratio 指定が実現されます。
軸の目盛りの単位の比を揃えたい場合には、ratio で負の値を指定します。 詳しくはマニュアルを参照してください。
set {b,l,r,t}margin は、グラフ領域とキャンバスの外枠との余白を 調整します。これを適切に設定することでも グラフ部分の大きさを調整することは可能ですが、 デフォルトの単位は文字の大きさで、これは縦と横の比が違いますので、 注意が必要です。
データを左から見ると 0.001 位のものが 1.0 くらいにあがって、 そこで急に -1.0 に落ちる、というデータになっている。 その 1.0 と -1.0 をつなぐ線を消して、 そこで切れているようなグラフを書きたいのだが、 という質問がありました (44)。
それに対して、2 本に分けて描いたらどうかという回答と、 3 項演算子を使って場合分けする例を 1/x に対して示した回答がありましたが、 質問者は、分けるのは面倒で効率が悪い、 場合分けは関数ではないので無理、というコメントをしていました。 また、データによっては 1 から -1 まで大きく下がる点と、 0.05 から -0.05 に下がる (これは普通に下がっているので切りたくない ?) 点もあるということのようでした。
データでも 3 項演算子で場合分けは可能ですよ、 という回答もありましたが、 グラフを切りたい場合はそこに空行を入れればいいだけなので、 gnuplot でやるよりは AWK などでデータの切りたい部分に空行を入れる加工をする方が 多分楽だと思います。 特に、切るための条件が複雑ならば (質問者の感覚的なものがありそう) gnuplot の外でデータを加工すべきだと思います。
gnuplot だけでもできなくはないですが、 多分新しい gnuplot だと 「情報やメモ (05/28 2009)」 に書いた、カンマ演算子と lc variable を組み合わせる方法が 一番楽でしょうか。 簡単のため、0.5 以上から -0.5 以下まで飛んでいるものだけ切る、 という条件であれば、以下のようになります。
y = 0
plot '-' using 1:2:(y0=y,y=$2,(y0>=0.5 && y<=-0.5)?-2:3) w l lc variable
1 0.1
2 0.7
3 -0.6
4 0.5
5 -0.4
6 0.1
7 0.2
8 0.4
9 -1.3
10 -0.8
e
前のデータを y に保存しておいて、y0 = 前のデータ、y = 今のデータとして、 条件を満たす場合は線種を -2 にしています。 x=2 から x=3 のところは 0.7 から -0.6 に落ちるので切れていますが、 x=4 から x=5 のところ、x=8 から x=9 のところは条件を満たしていないので 切れていません。
sin のグラフの x 軸の目盛りにπを入れる方法は、 という質問がありました (49)。
tutorial.pdf に書かれている LaTeX terminal の例が紹介され、 enhanced を使えば EMF でもできるといったものが紹介されていました。 具体的には、enhanced を使って xtics に明示的に ギリシャ文字を Symbol フォントで出すという方法のようですが、 日本語でもいいなら、以下のような方法もあります。
set xtics 0.5*pi font "[日本語フォント]"
set format x "%.1Pπ"
set xrange [-0.5*pi:2.5*pi]
つまり、目盛りは π/2 刻みにして、 πは set format の方に書いてしまう方法です。 これだと set xtics で明示的に一つ一つ書く必要はありません (「π/2」のようにはできませんが)。
(cf. 「情報やメモ (08/23 2012)」)
gnuplot-4.6.rc1 が出ました。 配布物に含まれる NEWS には、以下のように書かれています。
現在 (01/22 2012) の CVS 版のほぼ全部の機能が入っている感じで かなり大きな改訂になりますが、 4.6.0 のリリース版も機能にほとんど違いはないだろうと思いますので、 かなり楽しみですね。
(cf. 「情報やメモ (03/11 2012)」)
前回の報告 (12/08 2011)以後、 現在の CVS 版に入れられた主な機能について紹介します (ChangeLog, manual の更新部分等より)。
また少し報告の間があいてしまいましたので、かなりいろいろありますが、 主なものは以下のような感じでしょうか。
今回は、特に Qt terminal に関する改良がかなり行われています。 現在は、x11 terminal における gnuplot_x11 のように gnuplot_qt という外部ドライバを起動するようになりました。 ただ、うちの環境ではそのせいか、qt terminal は最初の起動の際には失敗して、 replot するとうまく立ち上がる、 といったようなことが起きていますが、 問題がクリアになったらまた報告してみたいと思います。
初期化ファイルの読み込みの仕組みも多少変更になりましたが、 そのサンプルが、share/colors_default.gp, share/colors_mono.gp, share/colors_podo.gp, share/gnuplotrc として付属しています。 いずれも set linetype を用いてユーザが線種を定義するサンプルになっていて、 これを使えば (RGB 色をサポートする出力形式に関しては) 出力形式によらず同じ系列の色が使えるようになっています。
(cf. 「情報やメモ (05/01 2012)」)