ページが長いので「しおり」の仕組みを用意してみました。
「しおり用」と書かれた所をクリックしてからブックマークに入れると、
それはページの先頭ではなく、その箇所へのブックマークになります。
(03/03 2006)
今までちゃんと説明していませんでしたが、
ここには、日付ごとに記事 (記事 A とします) を書いていますが、
その最後に、(cf. 「情報やメモ (XX/XX 20XX)」)
のように別な日付の記事 (記事 B とします)
へのリンクがついているものがあります。
これは、「被参照リンク」で、
記事 B が記事 A を参照している (リンクを貼っている) ことを意味します。
つまり、記事 B の方が記事 A より後の記事であり、
記事 A の続きや追加情報、訂正などの内容であったり、
記事 A に関連する別な話題であったりしますので、
記事 A に被参照リンクがついている場合は、
是非そちら (記事 B) もご覧ください。
(01/29 2014)
05/29 頃に gnuplot-5.2.7 が公開されました。 5.2.7 での新規機能、変更、修正は以下のようです。
修正と変更のみで、大きな仕様変更はありません。 この 5.2.8 が 5.2 系列の最終版で、次はいよいよ 5.4 がでるようですが、 それは来年春位になるようです。
最近、開発版の gnuplot に、set pixmap というものが導入されました。 これは、set object rect と同様に、 PNG/GIF/JPEG の画像を取り込んで、 描画要素の一つとしてグラフに描画するものです。 ドキュメントにも例が書かれていますが、 例えばグラフの背景 (behind) を特定の画像にできます。 背景をグラデーションにしたり、 グラフの特定の場所に画像のロゴを入れたりしたい場合には有用でしょう。
サンプルを一つ紹介します。 犬の写真画像 (jpeg ファイル) を背景 (behind layer) に キャンバス一杯の大きさに貼って、 その上に plot グラフを書きます。
set term pngcairo
set out 'test-pixmap-1.png'
set pixmap 1 'dog.jpg' at screen 0, 0 size screen 1, 1 behind
plot sin(x) w l lw 2
set out
at が画像の左下角の座標の指定、size がサイズ指定です。
ただ、これだとさすがにグラフが見えにくいので、 背景の上 (back) に透明化を使用した薄い白を重ねて書いてみます。
set term pngcairo
set out 'test-pixmap-2.png'
set pixmap 1 'dog.jpg' at screen 0, 0 size screen 1, 1 behind
set object rect from screen 0,0 to screen 1,1 back fc rgb '#60ffffff'
set tics front
plot sin(x) w l lw 2
set out
fillcolor の rgb 指定で 8 桁の 16 進数を指定すると、 最初の 2 桁は alpha 値とみなされるので、 それで透過レベルを調整できます (ffffff は白)。
なお、本来なら set object rect も behind の layer に書いて重ねたいところですが、 それだとどうもうまくいかず、画像の方のみが書かれてしまうようです。 よって set object rect は behind と front の間の back の layer に書いています。
しかしそれだと、back の layer に書かれる軸の刻みやラベルも、 その set object rect に隠されてしまってぼやけてしまいます。 そのため、「set tics front」で tics の layer を front に上げています。
もちろん、いざとなれば multiplot による重ね書き、 という解決法もあります。
set term pngcairo
set out 'test-pixmap-3.png'
set multiplot
set xrange [-10:10]
set yrange [-1:1]
set pixmap 1 'dog.jpg' at screen 0, 0 size screen 1, 1 behind
plot 1/0 # 空書き
set object rect from screen 0,0 to screen 1,1 behind fc rgb '#60ffffff'
plot sin(x) w l lw 2
unset multiplot
set out
結果は前のものとほぼ同じになります。 これなら、xtics の layer を変更する心配はありませんが、 tics がずれないように、空書きの際に range を固定したりするのが 少し面倒かもしれません。 また、上の例がそうなっていますが、 range を指定することで、tics の刻み間隔が、 自動設定の場合とやや変わってしまうこともあります。
gnuplot でヒストグラムのようなグラフを書こうとして、 2 点ほど気がついたことがありますので、ここに書きとめておきます。
今の gnuplot の plot
コマンドには
bins
というオプションがあり、
それによりデータから自動的に度数分布を作成して
グラフにすることができます。例えば、
plot 'data' using 2 bins binrange [0:100] binwidth=10
with boxes
のようにすれば、
2 列目のデータから階級幅を 10 にした棒グラフが書かれます。
ただし、「binrange [0:100] binwidth=10
」の場合は
階級値は「0 以上 10 未満」から始まるのではなく
「-5 以上 5 未満」から始まり、
それが x = 0 の場所に箱が書かれます。
最初を「0 以上 10 未満」にするには、
「binrange [5:95] binwidth=10
」とすればいいのですが、
その場合その箱は x=5 の場所に書かれます。
さて、通常 with boxes
の箱のサイズは、
隣合う箱が隣接するサイズになるのですが、
それは「set boxwidth
」で幅を狭くすることができます。
しかし、bins
を使用した場合、どうも
set boxwidth
が効かないようで、
それを指定しても幅が変わりません。
もしかしたらバグかもしれません。 時間のあるときに調べてみたいと思います。
bins を実現する方法として、demo にもありますが、
smooth frequency
を利用する方法もあります。
例えば、
binwidth = 10
set boxwidth binwidth*0.8
bin(val) = binwidth * floor(val/binwidth)
plot 'data' using (bin($2)) smooth frequency with boxes
のような具合です。
こちらでは boxwidth
も効きますので、幅を狭くして、
x 座標を少しずらして、cluster 型の histogram
相当のものを書くこともできます。
さて、実はこの cluster 型の histogram を、 1 つのデータの 2 列目のデータから作成したのですが、 その際 1 列目の値によって分類して、 複数のデータのように見て作成しました (実は元々の目標はこれ)。 例えば、必要なデータを 1 列目のデータ (整数値) を 3 で割った値で分類して、
binwidth = 10
set boxwidth binwidth*0.2
bin(val) = binwidth * floor(val/binwidth)
idata(n) = (int($1)%3 == n) ? $1 : 1/0
plot for [j=0:2] 'data' using (bin(idata(j))+3*j) smooth frequency
with boxes
のようにやってみたのですが、どうもうまくいきません。
問題は、1/0 で不要なデータを未定義値にしていることにあるようで、
smooth frequency でのデータの累積が、
1/0 の計算が起きたときにクリアされてしまうようです。
よって、1/0 の代わりに明らかにグラフの範囲外であるような大きな値
(例えば 10000) などに変えてやることでとりあえずはうまくいきました。
累積の値がクリアされてしまうのは、仕様かもしれませんし、 もしかしたらバグかもしれません。 時間のあるときに調べてみたいと思います。
最新の開発版 (git) の all.dem の出力を置いておきます。
06/27 のものよりも 20 ページほど増えていますが、demo として
bins.dem, orbits.dem, spiderplot.dem, bolditalic.dem, unicode.dem, columnhead.dem, clip_radial.dem, linked_autoscale.dem(大半は既に demo/ 内にはあったもの) が all.dem に追加されたためです。
最近の改良・追加には以下のようなものがあります (全部は網羅していません)。
spiderplot は、いわゆるレーダーチャートを書くための描画モードです。 ここでも過去に何度かレーダーチャートを書くサンプルを紹介しました (例えば 「情報やメモ (06/07 2017)」)。
今回の spiderplot は、 極座標モードでの parallelaxis のような形で実装されたようで、 設定の変更も paxis などで行えます。デモは以下にあります。
まだ若干実行のための書式などが不自然な感じがしますが、 今後徐々に洗練されていくのではないかと思います。
(cf. 「情報やメモ (01/21 2020)」)
以前テレビで、「フラッシュ暗算」なるものが紹介されていました。 モニタ画面にランダムのような数字が何分の 1 秒毎に表示され、 それを暗算で加算する、というものです。 慣れないと、そして暗算能力がないと、2 桁でもだいぶ難しそうでしたが、 その能力のある子供は平気で 3,4 桁の暗算をこなしていました。
乱数を発生させたり、画面表示したり、それを短い時間で切り替えたり、 合計を計算させることなら今の gnuplot にもできそうなので、 簡単なものを作ってみました。もちろん本来のグラフ表示とは全く異なります。 以下がそのスクリプトです。
# keta = 計算される数の最大数 + 1
# num = 計算される数の個数
# flushtime = 各数字のおよその表示時間 (秒)
keta = 1000
keta = 100000
keta = 10000000
num = 10
flushtime = 0.8
flushtime = 0.3
set term wxt size 1000,400
# fname = 表示フォント、size1 = 計算される数字のフォントサイズ、
# size2 = 答のフォントサイズ
fname = "IPAMincho"
size1 = "120"
size2 = "75"
unset tics
unset key
set xrange [0:1]
set yrange [0:1]
#ntos(x) = sprintf("%d", x)
# 上は単に数字を表示、下は 3 桁ずつのカンマ付き数字に変換 (9 桁まで対応)
ntos(x) = (x >= 1000000) ?
sprintf("%d,%03d,%03d", int(x/1000000),
int(x/1000)%1000, x%1000) : \
(x >= 10000) ? sprintf("%d,%03d",
int(x/1000), x%1000) : \
sprintf("%d", x)
# 起動画面の表示
ss = sprintf("To start, please mouse click
((flush,num)=(%.2f,%d))", flushtime, num)
set label 3 ss at 0.1, 0.5 font fname.".20"
left front textcolor black
plot 1/0 # ダミーのプロット
unset label 3
# 全体の背景 (黒)
set object 1 rect from 0,0 to 1,1 back fc black fs solid
pause mouse
# 開始
x = rand(time(0)) # 乱数の種を初期化
total = 0
# 各数字の表示
do for [i=1:num] {
x = int(rand(0)*(keta - 1) + 1)
total = total + x
# 左上に何個目かを表示
set label 1 sprintf("%d", i) at 0.1, 0.9
font fname.",14" right front
textcolor rgb "yellow"
# 計算する数字を表示
set label 2 ntos(x) at 0.9, 0.5
font fname.",".size1 right front
textcolor rgb "white"
plot 1/0
pause flushtime
}
# 一旦数字を全部消す
unset label
plot 1/0
pause 3
# 時間を置いて答を表示
set label 2 "A.".ntos(total) at 0.9, 0.5
font fname.",".size2 right front
textcolor rgb "white"
plot 1/0
pause mouse
背景は set object で、画面の文字や数字の表示は いずれも set label で行っています。 画面表示は plot のタイミングで行われますが、 1/0 のダミーの表示にしています。
数字の桁を決める keta, 数字の個数 num、表示時間 flushtime を変更することで難易度も変わります。 フォント fname や size1, size2、および wxt terminal のサイズも、 keta によって適当に選択してやる必要があります。
乱数 rand() は、(0:1) の実数値を返すので、 それをほぼ keta 倍して整数化しています。 実際には (keta - 1) 倍して + 1 していますが、 これは 0 を排除するためです。 また、rand(time(0)) で一度種を初期化していますが、 そうしないと毎回同じ乱数列になってしまいます。
実は label 2 の数字は、
最初は単に sprint("%d", x)
で表示させていましたが、
そろばんでは通常 3 桁毎に , で区切った整数表示を使います。
sprintf() ではそれは簡単にはできませんので、
それに対応した文字列を作成する ntos(x) を使っていますが、
9 桁を越える場合は修正が必要です (6 桁までなら少し簡単にできます)。
動画は置きませんが、だいたい動作の様子は想像できると思います。 ちなみに flushtime = 0.3, num = 10 だと、 私は 1 桁 (keta = 10) でもまともに暗算できませんでした。
最新の開発版 (git) の all.dem の出力を置いておきます。
最近の改良・追加には以下のようなものがあります (全部は網羅していません)。
なお、latex, emtex, tpic, eepic を有効化したい場合、
configure オプションなどは今のところ用意されておらず、
src/term.h でそれらの .trm の読み込みが 「#if 0」「#endif」
で囲まれているところの 0 を 1 に変えてやるしかありません。
なんとなくですが、
これらの .trm ドライバを近々完全に捨てるような扱いのように感じます。
最近、今の gnuplot (5.2.7) で各列が [学籍番号]、[テスト 1 回目]、 [テスト 2 回目] のようなデータからグラフを pt variable で描いてみて、 気がついたことがありましたので、少し書いておきます。 その手の例は、 「情報やメモ (05/10 2016)」 でも紹介していますが、 そこでとりあげなかった key の話も含め、以下で紹介します。
まず、最初に書いたグラフは次のようなものです。
データは単に w p で point にした散布図で、 回帰直線は stats を使って回帰直線の係数を取得して書いています:
stats "dataf" using 2:3 nooutput
plot "dataf" using 2:3 w p not,\
STATS_slope*x + STATS_intercept w l lw 2 t "回帰直線"
実は今回のデータは、複数のクラス (3 クラス) のデータを
一つにまとめたものなので、上のグラフの各 point を、
クラス毎に異なる記号で描いてみることにしました。
なお、各クラスは、データ 1 列目の学籍番号を 3 で割った余りで
自動的に計算できるとします。
単純にそれを行うには、awk などで前処理して、データをクラス別に分けて、
stats "dataf" using 2:3 nooutput
plot "dataf-a" using 2:3: w p t "A クラス",\
"dataf-b" using 2:3 w p t "B クラス",\
"dataf-c" using 2:3 w p t "C クラス",\
STATS_slope*x + STATS_intercept w l lw 2 t "回帰直線"
のようにすることですが、
今の gnuplot には pointtype をデータ値に応じて変更する
variable 指定が使えますので、それでやりました。
今回の場合は (回帰直線以外の部分は)、using に追加列を与え、
plot "dataf" using 2:3:(column(1)%3+1) w p pt variable
のようにすれば原則それは可能なのですが、
実はいくつか問題がありました。
まず、「column(1)%3」がうまくいきませんでした。 「non-integer operand for %」と怒られてしまい、 つまり、column(1) が整数と認識されていないようなのですが、 小数点のない値でも、入力データ列の値はどうやら整数とは見ずに、 すべて実数と認識しているようです。 昔からそうだったかどうかはわかりませんが、これは、int() を使って
plot "dataf" using 2:3:(int(column(1))%3+1) w p pt var
とすることで解消しました。
次は記号の色です。 上のままだとクラス毎に記号は変わるのですが、 すべての記号が同じ色で表示されてしまいます (下の図)。
色を変えるためには、色も lc variable で変更し、 その値も追加列として指定する必要があります。 追加列は、マニュアルによれば、pointsize, pointtype, linecolor の順に解釈されることになっていますが、ps var を指定しなければ、 追加列は pointtype と linecolor の順に使用されます:
plot "dataf" using 2:3:(j=int(column(1))%3+1):(j)
w p pt var lc var
上では、pointtype 用に計算した値を j に保存して、
それを linecolor に流用しています:
次は key です。 pt variable だと、key に異なる点記号の説明を出力できませんが、 それは今の gnuplot なら自前で「keyentry」で作ることができます (gnuplot-5.2.6 以降):
plot "dataf" using 2:3:(j=int(column(1))%3+1):(j)
w p pt var lc var,\
keyentry w p pt 1 lc 1 t "A クラス",\
keyentry w p pt 2 lc 2 t "B クラス",\
keyentry w p pt 3 lc 3 t "C クラス"
少し長くなりますが、これで前処理でファイルを分けなくても、
クラス毎に記号、色を分けて key を作ることができます:
ただ、こちらの方がいいか、易しいかというと微妙な気もしますし、 パイプ入力を使えば、事前にファイルを分けなくても、
plot "<awk '$1%3==0' dataf" using 2:3 w p
t "A クラス",\
"<awk '$1%3==1' dataf" using 2:3 w p
t "B クラス",\
"<awk '$1%3==2' dataf" using 2:3 w p
t "C クラス"
のようにできることからすると、
必ずしも pt variable の方がいいとはいえないような気もします。
05/29 頃に gnuplot-5.2.7 が公開されました。 5.2.7 での新規機能、変更、修正は以下のようです。
新規機能も少し入りましたが、 だいぶ開発版の 5.3 が持っていて 5.2.X にない機能がたまってきました。 そろそろ次は 5.4 でしょうか。
今さらですが、以下のことに気がつきました。
gnuplot-5.0 より 「set linetype cycle [n]」というものが導入されていて、 これは線種をいくつの番号で折り返すか、ということを指定します。 デフォルトではこれが 8 になっていて、 よって lt として明示的に 8 より大きい値をしても そのままでは効かないようです (例えば post terminal など)。
この 8 での折り返しを解除するには 「unset linetype cycle」か「set linetype cycle 0」とするようですが、 「set colorsequence」を指定する場合はその影響も受けます。 「set colorsequence default」「set colorsequence podo」の場合は、 「set linetype cycle 8」を指定したことになり、 「set colorsequence classic」の場合は 「set linetype cycle 0」を指定したことになるようです。
post terminal のように大きい番号の点種、線種を必要とする場合は 注意が必要です (私もやってしまいました)。
最近の改良・追加には以下のようなものがあります (全部は網羅していません)。
複素数値配列に対しては、その虚数部分は従来は imag(A[1]) のように使用していましたが、 現在は複素数値配列を plot の対象とした場合、 その実数部分を 2 列目、虚数部分を 3 列目として持つような データを指定したことになるようで、 例えば以下の 2 つのコマンドは同等だとマニュアルに書かれています:
plot A using (real(A[$1])) : (imag(A[$1]))
plot A using 2:3
しかし今回個人的には、faq.tex の改良が大きく、
しばらく手が入っていなかった従来のものをかなり改変したので、
その日本語訳の作成に多少てまどりました。
新しい日本語訳は、すでに公開していますが
(「gnuplot について」 の
(「gnuplot-FAQ (日本語訳)」 の節)、
近々本家の方にも入れてもらう予定です。
最新の開発版 (git) の all.dem の出力を置いておきます。
最近の改良・追加には以下のようなものがあります (全部は網羅していません)。
parallelaxis は、軸の数の制限が無くなり、
plot for [col=1:5] $DATA using col with parallelaxes
のような指定も可能になりましたし、
軸の場所を at
で明示的に指定することもできるようになり、
「set style parallelaxes」コマンドも追加されました。
これまで何度か、all.dem を画像化したものを置いていました (例えば 「情報やメモ (11/02 2018)」 )。 以前は GIF アニメーションと PDF ファイルを置いていましたが、 PDF のビューワでも大抵連続して流し表示のようなことができるようなので、 GIF アニメーションはやめて PDF ファイル (pdfcairo terminal 出力) のみを置いておきます。
特に最後の方に色々新しいデモが追加されています。 p636 にはグラフ上にタイトルをつけるデモ、 p637, 638 はグラフにないキーを自由につけるデモ、 p674 以降は voxel データに関するデモ等です。
なお、うちの Unix 上の xpdf (PDF ビューワ) では、 413 ページあたりから始まる pm3d 画像の 2 次元射影グラフなどに 横線や縦線が表示されたりしているのですが、 MS-Windows 上の Acrobat reader で見たら問題なかったので、 単に xpdf のレンダリング機能の低さの問題のようです。
01/02 頃に gnuplot-5.2.6 が公開されました。 5.2.6 での新規機能、変更、修正は以下のようです。
新規機能はほとんど入っておらず、修正、変更が主ですが、 それもかなり少ないように思います。 5.4 の公開も近そうな気がしますね。