ページが長いので「しおり」の仕組みを用意してみました。
「しおり用」と書かれた所をクリックしてからブックマークに入れると、
それはページの先頭ではなく、その箇所へのブックマークになります。
(03/03 2006)
今までちゃんと説明していませんでしたが、
ここには、日付ごとに記事 (記事 A とします) を書いていますが、
その最後に、(cf. 「情報やメモ (XX/XX 20XX)」)
のように別な日付の記事 (記事 B とします)
へのリンクがついているものがあります。
これは、「被参照リンク」で、
記事 B が記事 A を参照している (リンクを貼っている) ことを意味します。
つまり、記事 B の方が記事 A より後の記事であり、
記事 A の続きや追加情報、訂正などの内容であったり、
記事 A に関連する別な話題であったりしますので、
記事 A に被参照リンクがついている場合は、
是非そちら (記事 B) もご覧ください。
(01/29 2014)
最新の開発版 (git) の all.dem の出力を置いておきます。
「情報やメモ (05/25 2022)」 の時点でのデモ (737 ページ) に比べると、 今回新たに追加された surface_explicit.dem の分のデモ (201,202 ページ)、 histogram_colors.dem の分のデモ (587 ページ) が追加されています。
05/25 以降の git 版の改変としては、以下のようなものがあるようです (他にもあると思いますが、ちゃんとは調べていません)。
1. は、column(0) を一つの matrix データに対する通し番号を返すようになり、 よって MxN 行列 a[i,j] の場合は、column(0)/M が i を、column(0)%M が j を意味するものになるそうです。
2. は、perl や awk を使う人にはなじみの関数ですが、 split(str, sep) は文字列 str を、sep の文字列で区切られた 単語の集まりと見なして、その単語を要素とする配列に切り分けます。 よって返り値は配列になります。 join(a, sep) はその逆で、文字列の配列の要素を sep 区切りでつなげた 文字列を返します。 配列処理、文字列処理もだいぶ充実してきました。
3. の set palette file は、 通常のファイルからパレットの内容を読み込むものですが、 通常のデータファイルと同じく using 指定なども使えるようになっているようです。
5. のウォッチポイントは、gnuplot Q&A 掲示板で 松岡さんもアナウンスしておられます。 ドキュメントには、
ことができる、と書かれています。 ドキュメントにも長く説明がされていますので詳しくは、 デモかドキュメントをご覧ください。
6. は、set xtics time [n], set mxtics time [n] といった、 時間軸に対する間隔の時間による指定で、 「set xtics time 5 years」のように minutes/hours/days/weeks/months/years を単位とする指定ができるようですが、 その組み合わせによる指定が可能なのかは不明です。
7. は、histogram の各部分の色の配置ですが、 複数のファイル (など) のデータからヒストグラムを作るとき、 すべてのファイルの行番号と対応するデータの種類が一致していればいいのですが、 そうでない場合は単純にヒストグラムを描いてしまうと、 行番号毎に色を割り当てるので、期待しないものができてしまう、 ということを念頭に導入されたようです。
行番号とデータの種類が一定でない場合は、 追加の列にデータの種類を示す識別番号や文字列などを入れますが、 それを元にグラフを描いて、その識別番号毎に一定の色を割り当てる、 といった例がドキュメントに紹介されています。
file(i) = sprintf("data_%03d.dat",i)
array Category = ["A", "B", "C",
"D", "E", "F"]
color(c) = index(Category, strcol(c))
set style data histogram
plot for [i=1:8] file(i) using 2:(color(1)) linecolor variable
なかなかうまい手が使われています。
data_001.dat から data_008.dat にヒストグラム用のデータが
2 列目に入っていて、1 列目はそのデータの種類を示す識別文字 (A ~ F)
が、「B 3.5」のように入っているという状況を考えています。
ただし、各ファイルで A ~ F の順に並んでいるとも限らないし、
一つのファイル内に A ~ F の全部のデータがあるとも限らない、
という状況を想定しています。
その際に、今回導入された histogram の構成要素の色を
using 追加列で指定する機能を使って、
「using 2:(color(1))」で plot しています。
この color(1) は、index(Category, strcol(1)) に展開され、
よってこれは 1 列目を文字列と見たときの、
配列 Category の要素 Category[i] がその文字列に一致するような添字 i
を返します。それにより、i に対応した色で塗られるため、
1 列目の識別文字が同じものが同じ色に塗られる、
という仕組みになっています。
このサンプルの、
index() により配列の要素を調べる機能は応用が広そうな気がします。
8. は、key の配置用についた offset オプションで、 指定した x, y だけずらすものです。 key には色々な配置命令がありますが、 それでも少しずらして微調整したいという場合があるでしょう。 そのためのもののようです。単位も, character, graph, screen のいずれも使えます。
(cf. 「情報やメモ (01/25 2023)」)
必要にせまられて、レーダーチャートを描いてみましたが、 その際気になったことがあるので書いておきます。
レーダーチャートは、現在は spiderplot で
比較的容易に描けるようになりました (cf.
「情報やメモ (04/06 2021)」)。
線の太さや点の大きさなども set style spiderplot
で設定できます。
ところが問題は線の色です。
「情報やメモ (04/06 2021)」 の例を見るとわかりますが、spiderplot は、一つの plot 命令が、 一つの軸方向の点の描画に対応し、 だから plot コマンドでの lt による色指定は、 いわゆるレーダーチャートの多角形の色には対応しません。
正確に言えば、一つのレーダーチャートを描くだけで、 その色を変えたいなら、lt を指定すればいいのですが、 「情報やメモ (04/06 2021)」 の例のように 3 つのレーダーチャートを重ねて描く場合、 それぞれのチャートの色をうまく変更できません。 それを解決する、つまりそれぞれの多角形の色を変えるには、 とりあえず以下のような方法しかなさそうです。
2. は、demo にもありますが、 「情報やメモ (04/06 2021)」 の例で言えば、
for [i=1:N] $data using i+1 every ::0::0 t columnhead lt 2,
newspiderplot,
for [i=1:N] $data using i+1 every ::1::1 t columnhead lt 4,
newspiderplot,
for [i=1:N] $data using i+1 every ::2::2 t columnhead lt 6
のようにする、という手です。
ところがこうすると、set style spiderplot
で設定した
lw, pt などが無視されてしまって、
lt 2
の後ろに lw 2
等を設定しないといけなくなるようです。
それに、この方法は、重ね描きの数が多くなると大変です。
ということで、元のスクリプトを変えずにやるには 3. の「set linetype」で、
set linetype 1 lc rgb "goldenrod" pt 1 lw 1
set linetype 2 lc rgb "dark-violet" pt 2 lw 1
set linetype 3 lc rgb "sea-green" pt 3 lw 1
のようにして lt の 1,2,3 の色を直接変えてしまうのが一番簡単なようです。
ただ、これだと spiderplot だけでなく、他の描画も影響を受けます。
spiderplot の lt 列の指定オプションがあっても良さそうに思いますが、 今の spiderplot の仕組みからすると、それはちょっと難しそうな気もします。 開発者側には、レーダーチャートを重ね描きするようなイメージが、 あまりないのかもしれません。
(cf. 「情報やメモ (09/06 2023)」)
07/18 頃に gnuplot-5.4.4 が公開されました。 5.4.4 での新規機能、変更、修正は以下のようです。
新規機能は、開発版からのバックポートですが、 変更・修正も多分大半はバックポートでしょう。
今回は日本の方々の貢献もだいぶあるようで、そんな名前を少し拝見しました。 残念ながら gnuplot に関する書籍等はもう新しいものは出ていないようですが、 米澤さんのような充実した Web 上の解説があるおかげか、 まだ見捨てられずに使われているようですね。
私の方は、最近はあまり最新の話題にはついていけていませんが、 面白い機能があればまたここで紹介できれば、と思います。
最近 gnuplot の pict2e terminal を使ってみて、 気がついたことがいくつかあったので、備忘録代わりに書いておきます。
グラフ内に点線の直線を書こうと思ったのですが、 それがなかなくうまく行きません。 直線は、以下のように set arrow で書きました:
set term pict2e monochrome size 1.9in,1.7in
...
set style arrow 2 nohead lt 1 dt 2
set arrow 1 from 0,0 to 10,3 as 2
通常ならこれで arrowstyle 2 の矢先のない dashtype 2 の
点線が (0,0) から (10,3) に書かれるはずなのですが、どうもそうなりません。
dt を色々変更してもだめです。pict2e のヘルプには、
`pict2e` は、点線のみサポートし、破線はサポートしていません。 デフォルトの線種はすべて実線です。 変更するには、`dashtype` 属性をつけて `set linetype` を使用してください。と書いてありますが、その dt 属性が効いていません。
pict2e terminal のソースを見ながら実験して、 ようやく以下のことがわかりました (ヘルプだけではなかなかわからない)。
ということで、
set term pict2e monochrome size 1.9in,1.7in gparrows
...
set style arrow 2 nohead lt 1 dt 2 lw 2
set arrow 1 from 0,0 to 10,3 as 2
のようにすることでようやく望む点線が出るようになりました。
なお、結果が実線のままか点線になるかは、
latex のコンパイルをしなくても、出力される pict2e のファイルが、
「\put(x,y){\line(X,Y){len}}
」の形式の単なる直線を出すか、
または
「\multiput(x,y)(dx,dy){num}{\usebox{\plotpoint}}
」
の形式の \multiplot で点を複数出そうとしているかで見分けがつきます。
最新の開発版 (git) の all.dem の出力を置いておきます。
「情報やメモ (02/28 2022)」 の時点でのデモ (733 ページ) に比べると、 今回新たに追加された pt_variable.dem の分のデモ (428,429,430 ページ)、 および arrows.dem に追加された「with arrows arrowstyle variable」 用のデモ (550 ページ) が追加されています。
02/28 以降の git 版の改変としては、以下のようなものがあるようです (他にもあるようですが、ちゃんとは調べていません)。
5. の arrowstyle variable は、arrows.dem の追加されたデモを見てください。 arrowstyle variable に追加する列の値は、 事前に定義した arrowstyle のインデックス番号で、 個々のベクトルに個別の arrowstyle を適用できるようになります。
(cf. 「情報やメモ (09/28 2022)」)
時期もあって、2 次元の散布図のグラフを見る機会がよくあります。 ただ、例えば両軸がテストの点数のように、 離散的な値 (整数値等) しか取らないデータの散布図には 少し注意しないといけない場合があります。 それは、同じデータ値を取る点が複数重なることによって、 散布図の与える印象が変わってしまう、ということです。
例えば、以下のグラフは、いずれも単純な x,y の 2 次元データの 散布図と回帰直線を、以下のようなコードでグラフにしたものです。 現在の gnuplot では、stats で回帰直線や相関係数が容易に計算できます。 散布図の方は、見やすくするように ps2 pt 7 の with points で書いていますが、 点数が多い場合は with dots で書くこともあるかと思います。
set grid
set xrange [0:100]
set yrange [0:100]
stats 'data1' using 1:2
#stats 'data2' using 1:2
A = STATS_slope
B = STATS_intercept
R = STATS_correlation
set title sprintf("相関係数 = %f", R)
plot 'data1' using 1:2 w p ps 2 pt 7, A*x+B
#plot 'data2' using 1:2 w p ps 2 pt 7, A*x+B
さて、両者のグラフは、一見すると散布図の方は同じですが、 相関係数と回帰直線が違っています。 特に、data2 の方は一見回帰直線がそれらしくないように見えますが、 これは実は重なった点を持っています。
現在の gnuplot では、 2 次元的なデータの 1 次元的なソート等のフィルタは用意されていて、 例えば同一な x のデータが複数ある場合は、それを一つの点にまとめて y の値はその合計にしたり (smooth frequency) 平均にしたり (smooth unique) する等のフィルタが用意されているのですが、 x, y の 2 次元的なデータの同一点に対する処理はまだ用意されていません。 ということで、そのような重なりに対する処理をするためには、 外部でのデータ処理が必要になります。
Unix であれば、
% sort data2 | uniq -c > data2-2
のようにすることで、例えば
10 30
10 30
20 50
のようなデータから、その重なり情報を先頭列に追加したデータ
2 10 30
1 20 50
が作れます。1 列目の 2, 1 は同一行の個数を意味します。
同じことは awk でも以下のようにして行えます。
% awk '{z[$1 " "$2] ++ }END{ for (i in z) print z[i],i}'
data2 > data2-2
よって awk (gawk.exe) があれば Windows でも同様の処理ができます
(ただし引用符 '," の使い方を少し変える必要がある)。
system() を使えば gnuplot 内部からそれを行うことも可能です。
このように、重なり情報を入れたデータから、 それがわかるような散布図を作るには、例えば以下のような方法が考えられます。
これらをそれぞれ紹介します。 まず 1. ですが、splot の with impulses か with boxes で表現すればよいと思います。 その場合、回帰直線は「y = A*x+B」では描けませんので、set arrow を利用します。
set grid
set xrange [0:100]
set yrange [0:100]
stats 'data2' using 1:2
A = STATS_slope
B = STATS_intercept
R = STATS_correlation
set title sprintf("相関係数 = %f", R)
# 以下が 3 次元グラフ
set view 35, 44
set xlabel 'x'
set ylabel 'y'
set boxwidth 2 absolute
set boxdepth 2
set xyplane at 0
set arrow from 0,B,0 to 100,A*100+B,0 nohead lt 2
splot 'data2-2' using 2:3:1 w boxes
set boxwidth, set boxdepth は 3 次元棒グラフの箱の x, y 方向の幅の指定です。 開発版では「set boxdepth square」で断面が正方形の棒グラフにできるのですが、 5.4.3 ではまだ実装されていません。 また、「set xyplane at 0」で底面を「z=0」の xy 平面にしていますが、 デフォルトでは z=0 は底面より上になってしまうので、 set arrow による回帰直線が浮いたところに出てしまいます。
この 3 次元棒グラフの場合は、 マウスで操作するか set view で視線を変えることで 元の散布図にしたりデータの重なり数を高さとして見たりできるので、 対話的に gnuplot で表示する場合は便利だと思いますが、 グラフを紙に印刷して示す場合は、あまり散布図らしくないので、 通常の散布図としての利用にはやや無理があるかもしれません。
次は 2. の点の大きさによる表現です。
set grid
set xrange [0:100]
set yrange [0:100]
stats 'data2' using 1:2
A = STATS_slope
B = STATS_intercept
R = STATS_correlation
set title sprintf("相関係数 = %f", R)
# 点の大きさで表現
psf(x)=1+(x-1)*0.2
set pointsize 2
plot 'data2-2' using 2:3:(psf($1)) w p pt 7 ps var, A*x+B
これは、with points の ps variable の機能を使って、3 列目のデータ 「psf($1)」を点の大きさにしています。 psf(x) は、そのまま x を点の大きさとすると、 半径が重なり数に比例して点が大きくなりすぎてしまうのを防ぐために、 ゆっくり大きくなるようにしています。 上の式の代わりに「psf(x) = sqrt(x)」とすることで、 重なり数を点の面積に比例させることも可能です。 「set pointsize 2」はデフォルトの点の大きさです。
この方法は、大きさで点が集まっていることがわかりますし、 通常の散布図にも近いそれなりに良い方法だと思いますが、 大きな点の下に近くの点が隠されてしまう場合がある、 という欠点があります。
最後の 3. は、点の大きさでなく、点の色で表現する方法です。
set grid
set xrange [0:100]
set yrange [0:100]
stats 'data2' using 1:2
A = STATS_slope
B = STATS_intercept
R = STATS_correlation
set title sprintf("相関係数 = %f", R)
# 点の色で表現
set palette rgbformulae 33,13,10
plot 'data2-2' using 2:3:1 w p ps 2 pt 7 lc palette z, A*x+B
これは、「lc palette z」によって 3 列目のデータを、 cb 軸の palette 色に変換して表示する方法です。 デフォルトのパレットは、大きな値が黄色になって点が見にくくなるので set rgbformulae で変更しています。
この方法だと、点の大きさはすべて同じなので、 他の点で隠されることはないですし (「隠される = 重なる」ということになる)、 色で重なりの様子も知ることができます。
ただ、これだと、一つのデータだけ表示する場合はいいのですが、 例えば他のグループのデータの散布図を重ねて表示する、 という場合に色で区別することができなくなってしまいます。 その場合は例えば点記号の形 (○と□とか) で区別すればいいのですが、 やはり色情報は強いので、ちょっと見にくくなってしまうかもしれません。
最新の開発版 (git) の all.dem の出力を置いておきます。
「情報やメモ (12/07 2021)」 の時点でのデモ (732 ページ) に比べると、 今回新たに追加された BesselJ.dem の分のデモ (498 ページ) が追加されています。 また、prob3.dem に分離された部分が移動しています (324,325,326 ページの分が 292,293,294 へ)。
git 版の改変については、以下のようなものがあるようです。
1. の度に関しては、そもそも逆双曲線関数の値が角度であること自体 よくわかっていませんでしたが、 調べてみると双曲線との間にできる面積が「双曲角」 と呼ばれるものになるようですね。 それに対応する角を返してくれるのかもしりませんが、 まだよくわかってはいません。
2. の print コマンドについては、gnuplot Q&A 掲示板で、 松岡さんがアナウンスしておられます。 ドキュメントには以下のような例が追加されています。
print 123 + 456
print sinh(pi/2)
print "rms of residuals (FIT_STDFIT) is ", FIT_STDFIT
print sprintf("rms of residuals is %.3f after fit", FIT_STDFIT)
print "Array A: ", A
print "Individual elements of array A: ", for [i=1:|A|] A[i]
print $DATA
5. の replotonresize オプションは、グラフウィンドウをリサイズすると、 それに応じて replot を行う、というものです。
なお、今回、付属マニュアルの改正もされているのですが、 その先頭にある開発者のリストに、 上にも書いた松岡さんの名前が追加されました。 Windows 版バイナリの作成、それに関する数々の提案やバグ出しだけでなく、 最近は本家のサイト (メーリングリストや Bug tracker 等) でも積極的に関わっておられますので、追加されるのは遅かったくらいです。
ちなみに、以下の最近のマニュアルの HTML 版 (l2h によるもの) には松岡さんの名前が追加されていないのですが、 これは、docs/gnuplot.doc の方には追加されたものの、 docs/titlepag.tex の方はまだ更新されていないためです。 直に更新されると思います。
(cf. 「情報やメモ (05/25 2022)」)
01/03 頃に gnuplot-5.4.3 が公開されました。 5.4.3 での新規機能、変更、修正は以下のようです。
retrace は、表示が変な場合用らしいです。 詳しくはドキュメントを見てください。
nogrid は、splot の特定の要素を dgrid3d 処理から外すもののようです。
fillsteps は、steps とほぼ同様で、y=0 (x 軸) との間を fillstyle で塗り潰すものでしたが、 その基準位置 y=0 を上げ下げできるようになったことと、 基準位置の上だけ (above)、または下だけ (below) 塗り潰せるようになりました。
all.dem は、5.4.2 から少し変化がありました。 5.4.0 以降置いてなかったので、 せっかくですから 5.4.3 用のものを pdf にしたものを置いておきます。
追加されたものは 203 ページの dgrid3d Hann function (5.4.1 で追加)、 553 ページの Histogram with error bars のデモです。 553 ページのものは、5.4.3beta の後で追加されたもののようです。 また、380 ページの「Circle and polygon objects in 3D」のデモも 変わったように見えますが、これはデモ自体 (demo/armillary.dem) は変わっていないので、なぜ表示が違うのかはちょっとあとで調べてみます。
(cf. 「情報やメモ (02/13 2023)」)