ページが長いので「しおり」の仕組みを用意してみました。
「しおり用」と書かれた所をクリックしてからブックマークに入れると、
それはページの先頭ではなく、その箇所へのブックマークになります。
(03/03 2006)
今までちゃんと説明していませんでしたが、
ここには、日付ごとに記事 (記事 A とします) を書いていますが、
その最後に、(cf. 「情報やメモ (XX/XX 20XX)」)
のように別な日付の記事 (記事 B とします)
へのリンクがついているものがあります。
これは、「被参照リンク」で、
記事 B が記事 A を参照している (リンクを貼っている) ことを意味します。
つまり、記事 B の方が記事 A より後の記事であり、
記事 A の続きや追加情報、訂正などの内容であったり、
記事 A に関連する別な話題であったりしますので、
記事 A に被参照リンクがついている場合は、
是非そちら (記事 B) もご覧ください。
(01/29 2014)
前回の報告 (09/19 2015)以後、 現在の CVS 版に入れられた主な機能について紹介します (ChangeLog, manual の更新部分等より)。
今回は、修正、小さな機能の変更などが多かったようです。 新しい機能は特にないようです。 なお、前回 (「情報やメモ (09/19 2015)」) デモに追加された「ビースウォームグラフ」の他に、 今回その亜種である「バイオリンプロット」なるものも追加されました。 サンプルは以下でも参照できます。
(cf. 「情報やメモ (02/10 2016)」)
一つ小さい情報を上げておきます。 FreeBSD (10.2) で gnuplot をコンパイルしてみました。 wxt は ports で x11-toolkit/wxgtk28 をインストールしたのですが、 本来 wx-config という名前の wxGtk の環境提示用スクリプトが、 FreeBSD の ports ではそれを wxgtk2-2.8-config のような名前に変えてしまい、 そのため gnuplot の configure が wxGtk の検出に失敗してしまいます。
wx-config を wxgtk2-2.8-config へのリンクとして作成するのが 一つの回避策ですが、 実は gnuplot の configure では wx-config を探す際に環境変数 WX_CONFIG も見ているようなので (説明はされていない)、 WX_CONFIG=`which wxgtk2-2.8-config` としておけばこの問題は解消されるようです。
前回の報告 (05/06 2015)以後、 現在の CVS 版に入れられた主な機能について紹介します (ChangeLog, manual の更新部分等より)。
報告が 4 ヶ月ほど開いてしまいましたので、色々なものが入っています。 重要なものをあげると以下のような感じでしょうか。
1. のものは、 gnuplot の Q&A 掲示板 の 2948 番の記事でも紹介されています。
2. は、hypertext のマニュアルにありますが、 「image{<xsize>,<ysize>}:<filename>}」の指定で、 ポップアップボックス内で画像ファイルを表示させるそうです。 表示できる画像形式は、terminal 依存ですが、*.png なら常に OK だとか。
6. の bins は、データ点をある階級幅の度数分布にするもので、 データのヒストグラムが簡単に書けるようになります。 データのヒストグラムは、smooth frequency を工夫して使用すれば 今までも書けましたが、bins はそれをよりシンプルにしてくれますし、 階級幅ではなく、階級の個数を指定するので、より見やすいグラフを 書きやすくなります。詳しくは、demo/bins.dem を見てください。
7. のものは、 gnuplot の Q&A 掲示板 の 2963 番、および 2990 番からのスレッドで紹介されています。
8. は、例えば「plot for [i=1:3] T=sprintf("%d",i),i title T」 では従来は T への設定が 3 回行われて、グラフ (i) の描画は 1 回だけ、 つまり for は T= の方にだけ効いていた、という形だったのを、 今後は T= と i の描画をセットにして 3 回行う、 という形式にしたということです。
9. は、基本的には従来「set bars ...」と書いていたものは そのまま「set errorbars ...」と書くように変更されました。 そして、追加として、errobars 専用の線属性 (linecolor, linewidth 等) を指定できるようになっています。 通常誤差線は、対応する描画要素と同じ線属性で描画するのですが、 これを指定することにより、誤差線のみ別の線属性で描画できるようになります。
13. の「入力書式指定」とは plot コマンドの using の後ろに書く書式指定のことで、例えば 「plot 'file' using 1:($2+$3) '%lf,%lf,%lf'」の「%lf,%lf,%lf」 の部分のことです。これが、データブロックでも使えるようになったようです。
15. の set jitter は、データの x や y 座標が離散値である場合は、 そのまま with point で表示すると 同じ場所に重なって表示されてしまうわけですが、 それが重ならないようにデータに揺らぎ (jitter) を与えて表示するための仕組みのようです。 そのようなグラフを「ビースウォームグラフ」(bee swarm) と呼ぶようで、 R などで使われているようです。サンプル (jitter.dem) がありますので、 そちらをご覧ください。
(cf. 「情報やメモ (11/02 2015)」)
gnuplot の本家がソースの公開に利用している SourceForge.net に 大規模なシステム障害があり、 一時期ダウンしていたようですが、だいたいは復帰しているようです。 しかし、現在 (2015 07/28) もまだ開発版ソースの CVS ツリーは 復旧していないようです。
それに関して、 gnuplot の Q&A 掲示板 で、 松岡さんから GitHub による gnuplot 開発版ソースツリーの 非公式のミラーサイトを教えてもらいました (3007 番の記事)。 以下にそれがあります。
見たら、私が最後にダウンロードしたものよりも 少しだけ新しいものが置いてありました。 いざというときは、ここが使えそうです。
04/28 に gnuplot-4.6.6 の小さな修正版の 4.6.7 が、 また 06/07 に gnuplot-5.0.1 がリリースされました。 4.6.6 から 4.6.7 の修正点は以下のようです。
また、5.0.0 から 5.0.1 への新規機能、変更、修正は以下のようです。
5.0.1 に追加されたのは、主に修正と変更ですが、 5.1.0 で採用された一部の小さい機能がこちらにも取り入れられているようです。
マニュアルは、4.6.6 から 4.6.7 はほとんど変更はなかったのですが、 一応日本語訳も更新しておきました。
(cf. 「情報やメモ (2016 07/29)」)
gnuplot では、
を描くことができますが、
は普通には描けません。 それは、1. の曲線グラフは (x, f(x)) という点の 2 次元平面上の集合、 2. の曲面グラフは (x, y, f(x, y)) という点の 3 次元空間上の集合ですが、 3. は、(x, y, u(x, y), v(x, y)) という点の 4 次元空間内の集合になってしまうからで、 2. ならば良く知られている 3 次元の 2 次元的な見せ方 (射影) でいいわけですが、4 次元となるとそうはいきません。 しかし、例えば複素関数であったり、2 次元の座標変換であったり、 2 次元から 2 次元への写像の様子をグラフで見たい、 という要求はないわけではないと思います。
その一つの方法に、複素関数に対する HSV の色による色相 (Hue) と 彩度 (Saturation) による表現があります。 これは、gnuplot の demo にもあります。
これで、平面上に 2 次元から 2 次元への写像を表現しているのですが、 各 (x, y) に u(x, y), v(x, y) の 2 次元的な値を、 それぞれを色の 2 つの属性である色相と彩度に変え、 それに対応する一つの色に変換することで、 2 次元的な情報を表示するものです。 各点の色の色相と彩度で 2 次元的な表現をしています。
このグラフでは、 どこの場所で値が大きく、小さくなっているのかを見極めるには グラフの見方に慣れる必要がありますが、 変化の傾向をざっと知るには意味のある方法だと思います。 また、2 次元情報を一度に見れること、 および色という人間の視覚に直接訴えかける表現を用いることで、 単純なグラフではわかりにくいある種の特徴や 傾向を読みとることができる可能性もあります。
今回は、この HSV を利用した 2 次元表示以外の方法を考えてみたいと思います。 以下では、u(x, y) = x2 - y2, v(x, y) = 2xy とします (複素関数の w = z2 に相当; w = u+iv = (x+iy)2 = (x2-y2)+i(2xy))。
まず 1 つ目は、単純に z = u(x, y), z = v(x, y) の 2 つのグラフを splot で表示する方法です。 これは描かなくてもわかると思いますが、以下のようなグラフになります。
u(x, y) = x*x-y*y
v(x, y) = 2*x*y
set term wxt
set title "2D → 2D no1: splot"
set xlabel "X" ; set ylabel "Y" ;
set zlabel "Z"
set xrange [-5:5]
set yrange [-5:5]
splot u(x, y), v(x, y)
これは、見てわかる通りグラフが重なる部分が見にくくなりますし、 結果が 2 次元的ではないという欠点がありますが、 「グラフ的」に見るには一番わかりやすいものかもしれません。
2 つ目は、格子線の写像で見る方法です。 これも、複素関数などで良く使われている方法ですが、 u, v の 2 次元座標平面上で、t をパラメータ、a, b を定数として (u(t, b), v(t, b)) の軌跡 (x-曲線と呼びます)、 および (u(a, t), v(a, t)) の軌跡 (y-曲線と呼びます) を描画します。a, b として複数の値を取ることで、 (x, y) 平面では (t, b), (a, t) の軌跡である軸方向の直線群が、 (u, v) 平面ではどのような曲線群に変換されるかを見ることができます。 (x, y) 平面の領域が (u, v) 平面でどのように変形されるか を知るのに便利なので、 2 変数の座標変換を見る、表示する目的で使用されたりします。
u(x, y) = x*x-y*y
v(x, y) = 2*x*y
dx = 0.5 # 定数 x の間隔
dy = 0.5 # 定数 y の間隔
x0 = 0.0 # 定数 x の初期値
y0 = 0.0 # 定数 y の初期値
set term wxt
set title "2D → 2D no2: x 一定、y 一点の曲線群"
set parametric
set xrange [-5:5]
set yrange [-5:5]
set key out
plot for [j=0:5] (x1 = x0 + j*dx, u(x1, t)), v(x1, t)
title sprintf("x=%.1f",x0 + j*dx)
w l lt rgb sprintf("#8822%x0",2*j) , \
for [j=0:5] (y1 = y0 + j*dy, u(t, y1)), v(t, y1)
title sprintf("y=%.1f",y0 + j*dy)
w l lt rgb sprintf("#22%x088",2*j)
このグラフでは x-曲線か y-曲線かで色を変えてありますが、 x-曲線同士、y-曲線同士でも微妙に色を変化させていて、 それによりどの値に対応するのかをわかるようにしています。 等高線のように、曲線に数値のラベルを貼る方法も考えられます。
この曲線群は一見等高線のように見えるかもしれませんが、 実際これらは逆写像 x = X(u, v), y = Y(u, v) の等高線になっています。 よって、これとは逆に、z = u(x, y), z = v(x, y) の等高線を表示させる、 という方法もあるでしょう:
u(x, y) = x*x-y*y
v(x, y) = 2*x*y
set term wxt
set title "2D → 2D no3: u, v の等高線"
set xlabel "X" ; set ylabel "Y"
set view map
set grid
set xrange [-5:5]
set yrange [-5:5]
set key out
unset surface
set contour
set cntrparam levels incremental -40, 5, 40
set cntrlabel onecolor
set isosample 100, 100
splot u(x, y), v(x, y)
set cntrlabel は gnuplot 5.0 以降に導入されたもので、 等高線のラベルや線種の制御を行います。 ただし、現在は個々の等高線の線種を細かく制御することはできず、 ここでも onecolor にして一つの関数の等高線をすべて同じ線種にしていますが、 逆にそうしないと個々の等高線が別の色で描画され、 さらにそれぞれの key が出力され結構うっとうしくなります。 しかも等高線の色はあまり連続的に変化してくれないので、 どのように値が変化しているのかを見るのは結構面倒です。 指定した色を出したい場合は、線種列を変える必要がありますが (set style line)、今回は単純に onecolor としました。
また、等高線を滑らかに描くには、isosample の値を調整する必要があります。
3 つ目は、u(x, y), v(x, y) の一方を splot の曲面グラフで、 もう一方は with pm3d による色で表現、という方法を考えてみます。 この方法の場合 1 つ目のものとは違い 2 つの曲面が重なることはないので、 1 つ目のものに見られる見にくさはなくなります。 色はとりあえずもう一方の曲面グラフの上に書いてみます。
set term wxt size 600, 400
u(x, y) = x*x-y*y
v(x, y) = 2*x*y
set title "2D → 2D no4: 一方は曲面、一方は色"
set xlabel "X" ; set ylabel "Y"
set view 50, 160
set xrange [-5:5]
set yrange [-5:5]
set samples 20
set isosamples 20
splot '++' using 1:2:(u($1, $2)):(v($1, $2)) not with pm3d,
u(x, y) not with l lt -1
通常の関数描画でなく '++' を使った疑似データファイル描画を行っていますが、 通常の関数描画では、with pm3d の色を塗る場所を 他の曲面上にすることができないためです。 床面に塗るだけなら、通常の関数描画でもできます (with pm3d at b)。
また、単なる pm3d の色曲面だと少し実際のグラフの形が見づらいので、 あらためて with l lt -1 で曲面グラフを上書きしています。
このグラフは u, v に関して対称ではないので、 それにより失なわれる情報 (気がつかない情報) もあるように思います。
4 つ目は、ベクトルによる表現です。 (u(x, y), v(x, y)) は、平面ベクトル場と見ることができますが、 そのベクトルを with vector で直接表示させてみます。
set term wxt size 480, 480
u(x, y) = x*x-y*y
v(x, y) = 2*x*y
set title "2D → 2D no5: vector"
set xlabel "X" ; set ylabel "Y"
set xrange [-5:5]
set yrange [-5:5]
set grid
sc = 50.0 # ベクトルの長さをスケール変換
set samples 20
set isosamples 20
plot '++' using 1:2:(u($1, $2)/sc):(v($1, $2)/sc) not with vector
with vector は基本的にデータしか描画しませんので、 ここでも疑似データファイル '++' を使って表示しています。 また、関数の値を sc = 50.0 で割ってベクトルの長さを短くしていますが、 そうしないと長くて交差するベクトルがたくさん描かれてしまって 見にくくなります。
このグラフは見るのに慣れが必要かもしれませんが、 u, v を対称に表現しますし、 分野によってはごく自然なベクトル場としての表現なので、 普段から良く使われているでしょうし、 特定の目的には有用かと思います。
まだ他にも方法はあるかもしれません。 面白い方法が見つかったらまた報告したいと思います。
前回の報告 (03/23 2015)以後、 現在の CVS 版に入れられた主な機能について紹介します (ChangeLog, manual の更新部分等より)。
今回、新規の機能や大きな変更としては、以下ものあたりでしょうか。
最後のものは、従来 set terminal のオプションとして、 各 terminal 毎に (いくつかの terminal で) 'set term pdf mono' のように指定していたものですが、 それを本体の set コマンドに持ってきた、というものです。 'set term pdf mono' は、今後は 'set term pdf; set mono' に書き変わります。 現在は set dashtype や linecolor などが terminal 指定とは別に設定できるようになっていますから、 このようなコマンドが terminal とは別に導入されるのは ある意味必然だったかもしれません。
2 ちゃんねるの掲示板「gnuplot を使おう。その 3」(アドレスは リンクリスト 参照) に書かれた情報について、多少気になるものがありましたので、 少し書いておきます。
Cygwin での gnuplot で、フォントに問題が起きるようになった問題 (319; cf. 「情報やメモ (07/25 2014)」) の、その後の報告がありました (391)。
どうも Cygwin が見るフォント名の大文字、小文字の使われ方が 統一されておらず (Windows では大文字、小文字は多くの場合区別されない)、 Arial は ARIAL.TTF、Symbol は symbol.ttf のようになっていたそうです。 自分のディレクトリ内に Symbol.ttf, Arial.ttf のような名前のシンボリックリンクを貼ることでいけたそうです。
fontconfig を使っているなら、 多分その辺には問題が出ないような気もする (やはりキャッシュの問題のような気もする) のですが、 詳しくはわかりません。
with filledcurves で「f(y)≦ x ≦g(y)」の範囲の塗り潰しをしたい、 という質問がありました (392, 393)。
通常、with filledcurves は x,f(x),g(x) の 3 列のデータに対して 「f(x)≦ y ≦g(x)」の範囲を塗り潰すのですが、 その x 軸と y 軸を入れ替えた塗り潰しをしたい、という話のようです。
残念ながら回答はついていないようですが、 「できれば回転する以外の方法で」という条件がついていたので、 そのせいもあるかもしれません。gnuplot では残念ながら 「f(y)≦ x ≦g(y)」の範囲の塗り潰しは用意されていません。 内部ルーチンとして多角形の塗り潰しはあるのですが、 基本的に現在の gnuplot は縦軸を独立変数、 横軸を従属変数としたグラフ描画は許されていません。 実は私もそういう機能があるといいのに、と思う場面はなくはないです (cf. 「情報やメモ (02/07 2015)」) が、 とりあえずは仕方ありません。
f(y) や g(y) によっては、それらの逆関数を考えて、 「f(y)≦ x ≦g(y)」の代わりに 「f-1(x)≧ y ≧g-1(x)」を塗る (領域を分割する必要がある場合もある) ような方法が取れる場合もありますが、 一般には無理です。
となるとやはり通常は回転する方法しかないような気がします。 ただ、単純にグラフを 90 度、あるいは -90 度回すと、それぞれ 「x 軸は上向き、y 軸は左向き」、「x 軸は下向き、y 軸は右向き」 のようになり、 多分本来あって欲しい「x 軸は上向き、y 軸は右向き」になってくれません。 しかし、軸を反対向きにするのは、 「set *range reverse」を指定するか、 範囲指定を逆にすれば可能なので、一応それらしいものはできます。 ただし、残念ながら key を回転することはできません。
以下に、「y-1 ≦ x ≦ y2」(-1 ≦ y ≦ 1) の間を塗り潰すサンプルを 3 つ紹介します。 1 つ目は、逆関数を利用する方法です:
set grid
# set xrange [-2:1]
set yrange [-1:1]
plot [t=-2:1] '+' using (t):(-1):(t+1) not w filledcurves lc 3, \
[t=0:1] '+' using (t):(-sqrt(t)):(sqrt(t)) not w filledcurves lc bgnd
データでなく疑似データ '+' を使っていますが、 これは、まず x = y-1 の逆関数の y=x+1 と y=-1 の間を塗り潰した上に、 x = y2 の逆関数である y=x1/2 (=sqrt(x)) と y=-x1/2 (=-sqrt(x)) の間の塗り潰しを重ね書きしたものです。 後半の塗り潰しは背景色 (bgnd) で行っているので、 一見そこが塗られなかったように見えます。 ただし、set grid すると、そこの grid が書かれなくなってしまいます。 なお、xrange 指定は、「[t=-2:1]」が plot についているので不要です。
2 つ目は、grid の部分を解消するために、 逆関数描画を領域分割して書いたサンプルです:
set grid
# set xrange [-2:1]
set yrange [-1:1]
plot
sample [t=0:1] '+' using (t):(sqrt(t)):(1) not w filledcurves lc 3, \
[t=0:1] '+' using (t):(-1):(-sqrt(t)) not w filledcurves lc 3, \
[t=-2:0] '+' using (t):(-1):(t+1) not w filledcurves lc 3
こちらは、x の範囲を x=0 で左右に分けて考えていて、 塗り潰す領域を 3 つに分けて塗っています。 最初は x≧0 の範囲の放物線の上の部分 (sqrt(x) ≦ y ≦ 1)、 次は x≧0 の範囲の放物線の下の部分 (-1 ≦ y ≦ -sqrt(x))、 最後は x≦0 の範囲の部分 (-1 ≦ y ≦ x+1) です。 こちらは、重ね塗りではないので、 grid の格子も塗らない部分はちゃんと表示されます。 なお、sample キーワードは、 部分範囲を最初のグラフに適用するために必要です (sample がないと「xrange = [0:1]」になる)。
これらの逆関数を用いる方法は回転を伴わないので、 key や set title なども普通に使えますが、 一般性はなく、事前に逆関数を知っている必要があります。
3 つ目は、set arrow を使って、横線を書いていく方法です:
set grid
N = 100.0
set for [Y=-1*N:1*N:1] arrow from Y/N-1, Y/N to (Y/N)**2, Y/N
nohead lc 3 lw 1.5
plot [-2:1][-1:1] 1/0 not
これは、201 本の横線を書くことで塗り潰しの代用を行っています。 よって、グラフ画像もやや線が見えていますが、 これは「lw 1.5」をもう少し太くするか、 線の数 N を増やしてやると消えてきます。 これだと、逆関数を知る必要はありませんし、 title や key も使えますが、 やはり事前に関数は知っておく必要があり、 データ描画には利用できません。
最後は、回転です:
set term wxt size 385,640
set ylabel "y-1 <= x <= y^2 の塗り潰し no.4: 回転"
rotate by 90
set grid xtics y2tics
set xtics rotate by 90 offset 0,-1.5
unset ytics
set y2tics rotate by 90
set margin 6, 5, 3, 2
plot [t=1:-1][-2:1] '+' using (t):(t-1):(t*t) not axes x1y2
with filledcurves lc 3
最後のは、set term と set ylabel の行もつけましたが、 だいたい他のグラフと同じ大きさになるように size を調整しています。 ytics (左) の代わりに y2tics (右) を使うことで、 回転したときに下に座標が出るようにしています。 set xtics, y2tics を rotate で回転し、offset で適宜位置の調整を行い、 set margin でグラフの回りのサイズの調整も行います。
そして、x 軸 (回転後の y 軸) の範囲を [1:-1] のように逆向きに指定することで、軸の向きを逆にします。 これによって、回転後に y 軸の向きが上向きになります。
この回転を使用する方法はは、確かに指定や調整が面倒かもしれませんが、 データ描画では唯一の方法でしょうし、一番現実的かもしれません。
何かの拍子に履歴が消える、という報告がありました (380, 394)。
「履歴」は gnuplot のコマンドラインヒストリのことだと思いますが、 確かに私も以前経験したことがあったような気がします。 環境と、gnuplot のバージョンと、 使っている readline の種類 (GNU readline か BSD editline か gnuplot オリジナルか) と、 問題の発生条件が特定できれば調査できるんですが、 ちょっと今はよくわかりません。
なお、環境や gnuplot のバージョンによってヒストリファイル名が違っていたり (.gnuplot_history, gnuplot.his 等) 環境変数 (GNUPLOT_HISTORY_FILE) で変更できたり、 ヒストリサイズが違っていたり環境変数 (GNUPLOT_HISTORY_SIZE) やコマンド (set history) で設定できたりできなかったり、 などが違っていたりするので、問題の特定は結構面倒です。 ちなみに、山賀さんの gnuplot+ でも ヒストリファイル名 (.gp_history)、それを設定する環境変数 (GP_HISTFILE)、 ヒストリサイズを設定する環境変数 (GP_HISTFILESIZE) などが独自実装されていたりするので、 特に複数の版の gnuplot を使っている人は、 ヒストリ回りは色々厄介な点があるのではないかと思います。
前回の報告 (01/26 2015)以後、 現在の CVS 版に入れられた主な機能について紹介します (ChangeLog, manual の更新部分等より)。
2 ヶ月位開きましたが、今回はそれほど多くの変更はありません。 gd ドライバの修正は、 「情報やメモ (02/19 2015)」 で報告した話です。
「with labels point の point を key サンプル表示」は、 with labels だけだと指定場所に文字列を書くだけですが、 with labels の後に例えば「with labels point pt 7」のように point 指定をすると (主に hypertext 用)、 その場所に point 記号をつけることもできます。 その point 記号が今までは key には出ていなかったのですが、 それが出るようになった、ということです。 labels 部分 (文字列) は従来通り key には出ません。
「with filledcurves の y1=... と y2=... を y=... に統合」は、 filledcurves の仕様の変更です。実は従来 with filledcurves に y1= や y2= のような指定をすると以下のようになる、 と help では説明されていました:
しかし実際には、
plot 'data' using 1:2 with filledcurves y1=5
plot 'data' using 1:2 with filledcurves y2=5
の結果は同じで、どちらもデータの曲線と
「y1 軸」の y = 5 の水平線とで囲まれる部分を塗り潰します。
「y2 軸」の y = 5 の水平線とで囲まれる部分を塗り潰すには、
plot 'data' using 1:2 axes x1y2 with filledcurves y2=5
と、axes 指定をしなければいけませんでした。もしそうなのであれば、
y1 や y2 と書くのは意味がないのでは、という話になり、
結局 with filledcurves の後ろは y1=, y2= ではなく y= と書き、
どちらの y 軸かは axes で指定することになりました。
つまり、今後は y1 軸の 5、y2 軸の 5 と囲まれた部分を塗り潰すには、
それぞれ、
plot 'data' using 1:2 with filledcurves y=5
plot 'data' using 1:2 axes x1y2 with filledcurves y=5
とすることになります。
「key に拡張文字列が入るときの処理の修正」は、 「plot ... title "{/:Bold ...}"」 などのような指定の場合 (svg terminal) の問題の話のようです。
「key サンプルの図形の色をグラフの最初の点の色で塗る」は、 主に lc variable の場合の問題で、 その場合は色が次々変わりうるので key ではどの色で塗ればよいのか、 ということを明確にした、ということでしょう。
(cf. 「情報やメモ (05/06 2015)」)
「こんなグラフ描けるかな」シリーズの一つをまたやってみますが、 最近高校の数学の教科書を見たら「四分位グラフ」が載っていました。 「四分位グラフ」は、現在の gnuplot でも描ける (boxplot)、 データの最小値、中央値 (メジアン)、最大値、および四分位境界を、 箱ひげで描くグラフです。
しかし、gnuplot の boxplot は縦方向に上下に四分位値を表すものですが、 高校の数学の教科書 (数学 I) に載っているのはそれとは違い、 横に寝た形の四分位グラフ (箱ひげ図) です。 ヒストグラムの下に四分位グラフを並べて描いていて、 四分位グラフの説明をしているのですが、 今回はそのようなグラフを gnuplot 5.0 で描いてみようと思います。
gnuplot では普通には横向きの四分位グラフは描けませんが、 stat コマンドを使えばデータの四分位値を知ることはできますので、 今回はそれを元に set object rectangle と set arrow で自作することにします。
データは、とりあえず -1.0 から 1.0 までのランダムな 100 点位のデータ (1 列) を使いますが、 そこからある階級幅の度数分布のヒストグラムを描くには、 gnuplot のマニュアル (help smooth frequency) にも載っている標準的な手法があります:
bw = 0.1 bin(x, w) = w*(floor(x/w) + 0.5) set grid set boxwidth 0.8*bw set xrange [-1.0-bw:1.0+bw] set xtics -1, bw*2, 1 set fillstyle fs solid 1.0 plot 'data' using (bin($1, bw)):(1.0) smooth frequency w boxes fc 1
bin(x, w) は x の値から w の階級幅での階級値を求める関数 (例えば階級幅が 0.1 の場合は、0.234 という値は 0.2 から 0.3 の間に入るので、階級値はその真ん中の 0.25 となる)、 smooth frequency は x の値が同じデータの y の値の累積値 (合計) を y の値とするもので、y の値を 1.0 にすることで、 その合計は階級値が同じデータの「個数」になり、 それが y 座標になります。 これを、幅が階級幅 (set boxwidth) の棒グラフ (with boxes) で描けば、 めでたく度数分布のヒストグラムができあがります。
なお、このやり方の場合、yrange の設定に問題があります。 棒グラフの一番上がグラフ領域の天井につかないようにしたい場合、 例えば棒グラフの最大高さが 40 とわかっていれば、 「set yrange [-5:50]」のようにします。 通常のデータであれば stat コマンドを利用すれば、 その最大値は事前に取得できるのですが、 しかしこの smooth frequency は stat コマンドで利用できないため、 単純な stat コマンドでは smooth frequency の結果の最大値を 事前に取得することができません。
awk 等の外部処理をせずにこの最大値を取得するには、 一度ヒストグラムの table データを掃き出させて、 それに stat を適用するしかありません。 従来は、table データは外部ファイルにしか出力できませんでしたが、 gnuplot 5.0 では「データブロック」という メモリ領域に保存できるようになりましたので、 今回はそれを利用します。 つまり、以下のようなものを上の plot の前に追加します:
set table $datablock plot 'data' using (bin($1, bw)):(1.0) with boxes smooth frequency unset table stat $datablock using 2 nooutput ymax = STATS_max ymarg = ymax/4 set yrange [0:ymax+0.5*ymarg]
データブロックは $ で始まる名前を使います。 そこに table 出力したデータは、 通常のデータファイルと同様に stat や plot で利用できます。 smooth frequency のデータは 1 列目が x 座標、 2 列目が累積された y 座標なので、2 列目の値が棒グラフの高さになります。
次は、いよいよこのヒストグラムの下に四分位を表す箱ひげ図を描きます。 データの四分位値は stat で以下のように取得できます。
ひげ部分は set arrow nohead で、箱部分は set object rectangle で描きます。 ひげを描いた後で箱を上書き (front) して箱の下の線を消すようにすれば、 水平の中央線は 2 本に分けて描く必要はありません。 例えば、以下のような具合です。
stat 'data' using 1 nooutput x1 = STATS_min x2 = STATS_lo_quartile x3 = STATS_median x4 = STATS_up_quartile x5 = STATS_max yc = -0.5*ymarg # 箱ひげの中央の y 座標 w1 = 0.2*ymarg # 髭高さ w2 = 0.3*ymarg # 箱高さ set arrow from x1, yc - 0.5*w1 to x1, yc + 0.5*w1 nohead lc black set arrow from x5, yc - 0.5*w1 to x5, yc + 0.5*w1 nohead lc black set arrow from x1, yc to x5, yc nohead lc black set object rectangle from x2, yc - 0.5*w2 to x4, yc + 0.5*w2 \ fc bgnd fs solid 1.0 border lc black front set arrow from x3, yc - 0.5*w2 to x3, yc + 0.5*w2 nohead lc black front set yrange [-ymarg:ymax+0.5*ymarg]
箱の背景色 (塗り潰し色) は、全体の背景色である「bgnd」(background) を使用しています。 yrange は、箱ひげ図が収まるように下の方に少し伸ばしておきます。
このような手動による図の作成はちょっと汚く、 あるいは面倒に見えるかもしれませんが、 この部分は call スクリプトにしておいて、 call で呼び出すようにしてもいいでしょう。 例えば以下のような具合です。
# ARG1 = データファイル # ARG2 = 列番号 # qrtyc = 中央 y 座標 # qrtw1 = ひげ高さ # qrtw2 = 箱高さ # qrtfc = 線の色 # qrtbc = 背景の色 if (!exists("qrtyc")) { qrtyc = 0.0 } if (!exists("qrtw1")) { qrtw1 = 1.5 } if (!exists("qrtw2")) { qrtw2 = 2.0 } if (!exists("qrtfc")) { qrtfc = "black" } if (!exists("qrtbc")) { qrtbc = "bgnd" } qrtn = 1 if (ARGC < 1) { exit } if (ARGC >= 2) { qrtn = ARG2 } stat ARG1 using qrtn nooutput qrtx1 = STATS_min qrtx2 = STATS_lo_quartile qrtx3 = STATS_median qrtx4 = STATS_up_quartile qrtx5 = STATS_max set arrow from qrtx1, qrtyc - 0.5*qrtw1 to qrtx1, qrtyc + 0.5*qrtw1 \ nohead lc @qrtfc set arrow from qrtx5, qrtyc - 0.5*qrtw1 to qrtx5, qrtyc + 0.5*qrtw1 \ nohead lc @qrtfc set arrow from qrtx1, qrtyc to qrtx5, qrtyc \ nohead lc @qrtfc set object rectangle from qrtx2, qrtyc - 0.5*qrtw2 \ to qrtx4, qrtyc + 0.5*qrtw2 \ fc @qrtbc fs solid 1.0 border lc @qrtfc front set arrow from qrtx3, qrtyc - 0.5*qrtw2 to qrtx3, qrtyc + 0.5*qrtw2 \ nohead lc @qrtfc front
先頭に書いたように、この call スクリプトが参照する引数は、 call スクリプトの引数 2 つ (1 つ目がデータファイル名、 2 つ目が参照する列番号) で、内部で使用する変数は、 「qrtyc = 中央 y 座標、qrtw1 = ひげ高さ、qrtw2 = 箱高さ、 qrtfc = 線の色、qrtbc = 箱の背景色」で、 これらはこのスクリプトを使用する前にあらかじめ設定するか、 設定していなければデフォルト値を使うようにしてあります。 なお、それらの名前は call スクリプト外部の変数とぶつからないように、 頭に「qrt」をつけてあります。
また、色指定である qrtfc (= "black") や qrtbc (= "bgnd") のデフォルトの値である black や bgnd は、 実際には文字列ではなく、 それらを値として評価してもらう必要があるので @ でマクロ展開しています。 よって、逆にこれらに "blue" のような文字列を あらかじめ与えたい場合は、マクロ展開後に文字列になるように、 「qrtfc = '"blue"'」のような 2 重の引用符で囲んだ指定をしなければいけません。
この call スクリプト (例えば quart1.gp) は、例えば以下のように呼び出します。
qrtyc = -0.5*ymarg qrtw1 = 0.2*ymarg qrtw2 = 0.3*ymarg call 'quart1.gp' 'data' 1
結局、全体のスクリプトは、 箱ひげ部分には上の call スクリプト quart1.gp を利用するとすれば、 以下のようになります。
# 棒グラフの最大値を取得 set table $datablock plot 'data' using (bin($1, bw)):(1.0) smooth frequency with boxes unset table stat $datablock using 2 nooutput ymax = STATS_max ymarg = ymax/4 # 四分位グラフを描く call スクリプトの呼び出し qrtyc = -0.5*ymarg qrtw1 = 0.2*ymarg qrtw2 = 0.3*ymarg qrtbc = '"#ffffcc"' # 四分位グラフの背景色 call 'quart1.gp' 'data' 1 # 棒グラフの描画 set grid set boxwidth 0.9*bw set xrange [-1.0-bw:1.0+bw] set yrange [-ymarg:ymax+0.5*ymarg] set xtics -1, bw*2, 1 set style fill solid 1.0 set xzeroaxis lt 1 lc black plot 'data' using (bin($1, bw)):(1.0) not smooth frequency w boxes fc 1
このように、箱ひげ部分は call スクリプトを使っているので 割とシンプルに書けますが、 call スクリプト部分をこちらに直接書いても それほどたいした量ではありません (実質 12 行位)。 stat コマンドや smooth frequency, call スクリプト、データブロック、 set object などの新しい機能を使うことで、 以前は awk などの外部処理を必要としたものが、 現在は gnuplot だけでもかなり行えることがわかると思います。
「情報やメモ (01/29 2015)」, 「情報やメモ (01/30 2015)」 で報告した、gnuplot 5.X で gd 系 terminal (png/jpeg/gif) で lt 0 の arrow が曲がった線になってしまう問題ですが、 lt 0 は grid でも使われているため、 2 次元だと斜めの grid はありませんが、 3D の斜めの grid がやはり曲がってしまう、という報告が 「gnuplot を使おう。その 3」(2 ちゃんねるの掲示板) や 「gnuplot Q&A 掲示板」(2929 番) などで報告されていました。
「plot 1-x w l lt 0」だとサンプル数が多いので再現しませんが、 「set sample 2」とかにして「plot 1-x w l lt 0」とかすると plot でも再現します。
gd ドライバを調べたところ、量子誤差が原因だとわかりました (libgd の問題ではありませんでした) ので、 パッチを送ったところ、その修正が無事採用されたようです。
なお、この一見不規則に曲がる曲線はあまり綺麗ではなく、 コンピュータが描いたにしてはなかなかシュールな線なので、 これを参考に「手書き補間」とかいう妙な機能 (実用性のない機能) があったらどうか、とかちょっと考えてみたくなりました。
(cf. 「情報やメモ (03/23 2015)」)
「情報やメモ (02/07 2015)」 で帯グラフを紹介しましたが、 これはグラフの要素を強制的に 90 度回転しているので、 確認する際少し見にくいと感じていました。
x11 terminal のグラフウィンドウ自体が回転できればいいのですが、 そういう機能を持たせるには大がかりな変更が必要です。 しかし、ホットキーの機能とスクリーンショットを使えば、 簡単に回転した画像を見ることはできるのでは、と思って少し試してみました。
対象にするのは、とりあえず x11 terminal です。 この場合、xwd を使えば簡単にスクリーンショットが取れます。 xwd は、ウィンドウのスクリーンショット (ダンプ画像) を取るための x11 のコマンドですが、通常は
% xwd > tmp1.xwd
のように実行して、
スクリーンショットを取りたいウィンドウの上にカーソルを移動し、
クリックをすると tmp1.xwd というスクリーンショットファイルが作成され、
それは xwud というコマンドで
% xwud < tmp1.xwd
のようにして表示させます。
xwd には、クリックなしでも、 Window ID やウィンドウマネージャ用の名前 (WM_NAME 属性) などを指定してスクリーンショットを取る機能もありますので、 今回はこちらを使います。
画像の回転は、netpbm の pamflip で行います。 なお、pnmrotate は -90 度から 90 度までの回転なので、 180 度などの回転を使わなければ pnmrotate でも結構です。
以下のような bind 命令を .gnuplot に追加します:
bind "ctrl-l" 'system("xwd -name Gnuplot
| xwdtopnm | pamflip -r90 | pnmtoxwd | xwud")'
bind "ctrl-r" 'system("xwd -name Gnuplot
| xwdtopnm | pamflip -r270 | pnmtoxwd | xwud")'
bind "ctrl-f" 'system("xwd -name Gnuplot
| xwdtopnm | pamflip -r180 | pnmtoxwd | xwud")'
これで、グラフウィンドウ上で
C-l とすると左 (反時計回り) に 90 度回転させた画像が表示され、
C-r とすると右 (時計回り) に 90 度回転させた画像が表示され、
C-f とすると 180 度回転させた画像が表示されるようになります。
今回は、古い X11 のコマンドである xwd/xwud と Netpbm 系のコマンドを使いましたが、 ImageMagick 系の import や convert でもできるでしょうし、 さらに、この bind + system の組を もっと色々なことに利用することも考えられると思います。
円グラフに続いて、今度は帯グラフを考えてみます。 これは、以前 「情報やメモ (02/23 2005)」 で紹介した横向きの棒グラフ (積み上げ型ヒストグラム) で、かつ 「情報やメモ (12/03 2005; no.3)」 で紹介したようにヒストグラムの対応する部分が線で結ばれるものです。 主に 100% の中の割合の変遷を示すようなグラフとして使われるもののようで、 日本語では「帯グラフ」と呼ばれるようです。
なお、英語では普通に「棒グラフ」(bar chart) のように呼ばれることが多いかもしれません。
今回は、このサイトにある帯グラフのサンプル (産業別就業者数の構成率の変化) を gnuplot で書いてみたいと思います。
gnuplot では、基本的にグラフの向きを回転することができませんので、 「情報やメモ (02/23 2005)」 で紹介したように実際には縦に書き、そこに現れる文字列の方をすべて 90 度回転する、という方法でごまかします。 with labels による文字列描画でも文字列の回転ができますので、 ヒストグラムとグラフの中の文字列部分はそう難しくはありません。 xtics, ytics の文字列も回転できますので、そのあたりまでは容易です。 むしろ厄介なのは、以下の要素です。
1. は、set label で代用すれば、回転する文字列を書くことは可能です。 2. は回転できないのですが、 これも key のサンプルは set object (for を併用) で長方形を自作し、 with labels でその隣に対応する文字列を書き出してやればなんとかなりそうです。
一番厄介なのは、3. の線です。 ちなみにこれは上の統計局のサンプルにはありませんが、 変遷を示す多くの帯グラフでは点線などで描かれています。 「情報やメモ (12/03 2005; no.3)」 でもそれを gnuplot 内部だけでやるのは難しいので、 そこに AWK 処理を併用したのですが、 今回はこれも gnuplot の機能だけでやってみようと思います。
まず、データは以下のものを利用します:
年号 第一次産業 第二次産業 第三次産業 1920 54.9 20.9 24.2 1940 44.6 26.2 29.2 1960 32.7 29.1 38.2 1980 10.9 33.6 55.4 2000 5.1 29.8 65.1
まず、3. の線以外を書くスクリプトを示します。
set term wxt size 480,640 stats 'datafile' using 1 nooutput N = STATS_records M = STATS_columns bw = 0.5 # 棒グラフの幅 set boxwidth bw set style histogram rowstacked set style fill solid 0.5 border lc black set xrange [-1.5:N+1] set yrange [0:100] unset key set grid lc black lt 1 # ラベル set xtics rotate by 90 offset 0,-2 set ytics rotate by 90 offset 0,0.5 set lmargin 12 set bmargin 5 set label "産業別就業者数(15歳以上)の構成率の変化" \ at screen 0.05, screen 0.2 rotate by 90 font ",17" set label "(%)" at screen 0.1, screen 0.53 rotate by 90 #set label "(年)" at screen 0.5, screen 0.02 rotate by 90 # ==> なぜか化ける set label " (年)" at screen 0.5, screen 0.01 rotate by 90 # これなら OK. # colsum(n) = $2 から $n までの和 colsum(n) = (n <= 2)? column(n) : colsum(n-1) + column(n) # 自作の key のサンプル長方形の描画 ep = 0.1 set for [j=1:M-1] object rectangle \ from (-1.5+0.5*j-ep),78 to (-1.5+0.5*j+ep),82 fc lt j \ fs solid 0.5 border lc black # 棒グラフとグラフ内の文字列と自作の key の見出し文字列の描画 plot for [k=2:M] 'datafile' using k:xtic(1) with hist,\ for [k=2:M] '' \ using 0:(colsum(k)-$k/2.0):(sprintf("%.1f%%",$k)) \ not with labels rotate by 90,\ for [k=2:M] '' \ every ::0::0 using (-2+0.5*k):(90):(strcol(k)) with labels rotate by 90
なおこのグラフは、wxt terminal のメニューから PNG ファイルへの出力を行ったものです。 現在の gnuplot の wxt terminal にはそういうものが用意されていて、 pngcairo terminal の出力とほぼ同じものが出力されます。
まず stats コマンドを利用してデータの行数 N (= 5)、 列数 M (= 4) を取得し、棒グラフの幅 (bw) と ヒストグラム、塗りつぶしの指定 (set style fill) を行います。 ヒストグラムは x = 1 から x = N の場所に積み上げたグラフを書きますので、 あとで自作の key を入れる場所を取って x の範囲は -1.5 から N+1 とし、 y の範囲は割合なので 0 から 100 とします。 key はあとで自作するので削除し、 割合が見やすいように格子線 (grid) を入れておきます。
次はラベル部分ですが、title や xlabel は回転できないので、 tics 以外はすべて set label で回転して書きます。 左側に回転したタイトルを書くことになるので、 やや大きめにマージン (lmargin) を取り、 下にもマージン (bmargin) を取ります。 グラフの外に書く label は、 キャンバス全体を (0,0) (左下) から (1,1) (右上) の長方形と見た screen 座標で指定します。 なお、なぜか「(年)」というラベルは短すぎて wxt terminal がコーディングを正しく取得できないのか、 文字化けして正しく表示されませんでした。 よってその前に全角の空白を一つ入れてあります。
積み上げ型のヒストグラム (rowstacked) は自動的に上に積み上げた場所に書いてくれますが、 with labels で書く文字列も累積した高さの位置に書かないといけませんので、 2 列目から n 列目までのデータの累積値を計算する colsum() という関数を再帰関数として定義します。
次の set for object は、key の部分の自作用です。 key のサンプル部分は固定位置に長方形を書けばよいので set object rectangle で描き、 文字列部分は文字列をデータから取得しないとけないので、 plot の with labels で描画します。 for を使えば複数の長方形も一度に描けます。
最後の plot で、棒グラフ (積み上げ型ヒストグラム)、グラフ内の文字列、 および自作の key の文字列部分を描いています。 棒グラフ部分は with hist で 1 つの列データを与えて描きますが、 「using k:xtic(1)」として 1 列目の値をヒストグラムの x 座標の見出しに利用します。 次の for がグラフ内の文字列部分で、y 座標は「k 列目までの和」の高さから 「(k 列目の値)/2」を引くことで、k 列目の棒の真ん中になるようにしています。 最後の for が key の文字列部分で、「every ::0::0」と「strcol(k)」で k 列目の先頭の文字列だけを取り出して書くようにしています。
convert (ImageMagick) などを使えば容易に回転することもできます。
通常の gnuplot のグラフと比較すると、横軸のラベルはグラフの下、 元のグラフで言えば左ではなく右にあった方がよかったかもしれません。 その場合は ytics ではなく y2tics を使えばいいわけです。
帯グラフとしてはこれでも十分かもしれませんが、一応 3. もやってみます。 しかしこれが結構厄介です。 以下の図で説明します。
図 1 は、元の縦方向の帯グラフの図で、赤紫の接続線がついています。 この帯グラフは、5 種類の x 座標 (x1, x2, ..., x5) に対して、 下のヒストグラムの値が 5 つ (y1, y2, ..., y5)、 上のヒストグラムの値が 5 つあることになりますが、 上のデータはいずれも (100 - yj) という形の値になるので、 今は下のデータのみ考えます。また d は箱の幅の半分 (bw/2) の値です。
実際には図 2 の 4 本の赤紫の線を書けばいいわけですが、 いずれもつながっていません。 もし、元のデータを単純に折れ線にすると、 それは図 2 の青の点線で示されているものになり、 赤紫の線にはなりません。 しかも、赤紫の線分を構成する端点の数を見てみると 元のデータ点よりも点の数が多いことがわかります。 AWK 処理なしでデータ点を増やすことはできませんので、 よって with lines での単純な折れ線では描けません。
これを描くためには、いくつかの考え方ができます。
これもできなくはないのですが、 一般的に帯グラフのデータは 2 次元的にあるわけですから、 これを行うには 2 次元的に繰り返しを行わなければいけません。 plot for の「for」はネストができませんので、 それを実現するには、多分以下のいずれかが必要でしょう。
multiplot を使う方がシンプルですが、 margin や tics の管理をうまくやらないときれいに重ならない場合があります。 「2 次元的な回数だけ繰り返す 1 個の for を使う」というのは、 例えば以下のようにする方法です:
plot for [ind=0:(M-2)*(N-1)-1] 'datafile' \
  every ::(m=ind%(int(M-2))+1, n=int(ind/(M-2))+1)::(n+1) ...
これは、1 次元的なループ変数 ind を (M-2) で割った商と余りを使って
2 次元的な変数 (m,n)=(1,1), (2,1), ..., (M-2,1),
(1,2), (2,2), ..., (M-2,2), ...
を順に生成し、
それを使って 1 線分ずつのデータを取りながら描いていく方法です。
with lines ではデータの値が 1/0 のような不正な値になると その点を描かないだけでなく、折れ線を一旦そこで切りますので、 それを利用すれば複数の線分を描くことができます。 ただし、例えば y3 を不正な値で置き換えると、 y3 に関わる 2 本の線分 (y2 から y3 と y3 から y4) が描かれなくなるので、 次に描かれる線分は y4 から y5 の線分となります。 よって、線分を 2 つ飛ばしずつに描くことになるので、 全部を完成させるには 3 回同じことを行う必要があります。 ただし、これならば M や N が大きくても plot for を 3 回行うだけ済みます。 例えばそれだけ取りせば以下のようになります。
yv(v, j, m) = (j%3 == m) ? 1/0 : v xv(j, m) = ((j+2)%3 == m) ? (j+bw/2.0) : ((j+1)%3 == m) ? (j-bw/2.0) : j plot \ for [k=2:M-1] 'datafile' using (j=int($0),xv(j,0)):(yv(colsum(k),j,0)) not w l lt 0,\ for [k=2:M-1] '' using (j=int($0),xv(j,1)):(yv(colsum(k),j,1)) \ not w l lt 0,\ for [k=2:M-1] '' using (j=int($0),xv(j,2)):(yv(colsum(k),j,2)) \ not w l lt 0
xv(j, m), yv(v, j, m) は、j 行目のデータに対する x 座標の計算と、 y 座標に不正値をもぐりこませる関数です。 m は、j を 3 で割った余りが m になったら そこを不正値に変えるために指定するもので、 1 回目は 0、2 回目は 1、3 回目は 2 を指定します。 x 座標は j を 3 で割った余りに応じて j から右か左ににずらさないといけないので その計算も場合分けでやっています。
一番考えやすいのは多分これだろうと思うのですが、 実はこれもそれほど簡単ではありません。 線分を描くので矢先のない with vector で描けばいいのですが、 現在の点 (を左にずらしたもの) と、 一つ前のデータ点 (を右にずらしたもの) を結ばないといけないので、 前の点の y 座標は少なくとも保持する必要がありますし、 for で次のグラフの描画に進むときに、 そのデータを破棄する (初期化する) 必要があります。 例えばこんな具合です。
set style arrow 1 nohead lt 1 lc black dt 2 ylastv = 0 ydiff(n) = ($0 == 1) ? (ylastv = colsum(n), -1) : \ (yv = ylastv, ($0 == N) ? ylastv = 0: ylastv = colsum(n), colsum(n) - yv) plot for [k=2:M-1] 'datafile' \ using ($0 - 1 + bw/2):(ylastv):(1 - bw):(ydiff(k)) with vectors \ arrowstyle 1まず set style arrow で矢のスタイルを一つ定義します。 with vectors では (x,y) = ($1,$2) から ($1+$3, $2+$4) までの線分 (ベクトル) を描きますので、 (x,y) = ($0 - 1 + bw/2, ylastv) が接続線の左端の、 一つ前の点を右にずらした点の座標です。 ($3, $4) = (1 - bw, ydiff(k)) がベクトルの成分になりますが、 ydiff(k) が現在の y 座標値から前の点の座標値を引き、 現在の y 座標値を ylastv に保存する関数です。 ただし、1 行目では -1 を返すようにしてあり、 ylastv も 0 なのでグラフの描画範囲には出てこないようになっています。 また、最後の行 ($0 == N) になったときに ylastv は 0 に戻すように (初期化) してあります。 for で次の k に進んだときのための措置です。
多分一番考えやすいのは、最後の with vectors を使う方法だろうと思います。 ちょっと工夫が必要ですが、とりあえず AWK なしでも、 この程度でこういうものが描けるようになります。
(cf. 「情報やメモ (02/13 2015)」, 「情報やメモ (05/09 2023)」, 「情報やメモ (06/07 2024; no.2)」)
レーダーチャートに続いて、今度は円グラフを考えてみます。 これも、以前 「情報やメモ (02/08 2005)」, 「情報やメモ (02/12 2005)」, 「情報やメモ (02/23 2005; no.2)」, 「情報やメモ (02/20 2010; no.2)」 などで考えたものです (今回も含めてなぜか 2 月ばっかり ?)。
2005 年のものは、いずれも AWK を利用していますが、 2010 年のものは with circle で AWK なしで円グラフは書いています。 ただし、key に文字列を書くために AWK を使用しています。 現在の gnuplot なら with labels もありますので、 それで AWK なしに円グラフが書けます。 ついでに、通常の円グラフ以外のものも考えてみます。
データは、以前の場合は最初から百分率になっていましたが、 今回は生データを使用して、そこから百分率を計算することにします。 逆に以前は合計して 100 になっていませんでしたが、今回はそれはありません。 使用するデータは以下の通りです:
中国史物 45$1 が分野、$2 が本の冊数を意味します。
推理小説 72
SF 25
科学関係 30
ルポ 18
まずは普通の円グラフです。 百分率の計算は、先に $2 の合計を求める必要がありますが、 それは現在は stats コマンドでできます:
stats 'datafile' using 2 nooutput
total = STATS_sum
nooutput を指定することで、stats の表示が抑制され、
stats で計算する種々の統計量は STATS_* という変数に保存されます。
あとは、
「情報やメモ (02/20 2010;
no.2)」
とほぼ同じですが、with labels で円グラフの中に分野や冊数、
百分率の値を直接書いてみました。
stats "datafile" using 2 nooutput total = STATS_sum # 合計 set term pngcairo size 400,400 set output "pichart-3-normal.png" set title "普通の円グラフ" font ",20" set style fill transparent solid 0.5 noborder set xrange [-1:1] set yrange [-1:1] unset key unset tics set size square r = 0.8 # 円グラフの半径 set angles degrees ar = 90 # 円グラフの描画時の累積角度 ar2 = 90 # ラベル描画時の累積角度 v2a(v) = v/total*360 # $2 の値を角度に変換 sl(v, s) = sprintf("%s %d%%\n(%d冊)", s, v/total*100, v) # ラベルを書く関数 (v = $2, s = $1) px(v) = 0.7*r*cos(ar2 + v/2) # ラベルを置く場所の x 座標 py(v) = 0.7*r*sin(ar2 + v/2) # ラベルを置く場所の y 座標 plot "datafile" \ using (0):(0):(r):(p=v2a($2)),ar=ar-p):(ar+p):($0+1) with circles lc var, \ "" using (q=v2a($2),ar2=ar2-q,px(q)):(py(q)):(sl($2,strcol(1))) \ with labels
ラベルの部分は、sprintf() を使ってラベル文字列を作る関数を用意して、 $2 の値と $1 の値からラベル文字列を生成しています。 $1 は文字列なので $1 ではなく strcol(1) として取得します。 なお、データを読みながら角度の値を累積していく変数 ar, ar2 ですが、 ar 一つにして、
px(v) = 0.7*r*cos(ar + v/2) py(v) = 0.7*r*sin(ar + v/2) plot "datafile" \ using (0):(0):(r):(p=v2a($2)),ar=ar-p):(ar+p):($0+1) with circles lc var, \ "" using (px(p)):(py(p)):(sl($2,strcol(1))) with labelsとやってもできるように見えるかもしれませんが、 式の評価は with circle の分をファイルの先頭から最後までやったあとで 次の with labels の分の描画に移るので、ar や p はそちらでは更新されず うまくいきません。
これはこれでいいのですが、 小さい割合しかない範囲だとラベルが書きにくく、 隣のラベルと重なったりしますので、 狭い範囲のラベルを円グラフの外に書くようにしてみましょう。 そのため、上の px(), py() を以下のように変更します:
px(v) = ((v > 10*360/100.0) ? 0.7 : 1.2)*r*cos(ar2 + v/2)
py(v) = ((v > 10*360/100.0) ? 0.7 : 1.2)*r*sin(ar2 + v/2)
v は中心角を意味するので、上では 10% を越えている場合は内部 (半径 0.7)、
10% 以下の場合は外 (半径 1.2) に書くようにしています。
結果は以下の通りです。
10% や 0.7、1.2、および半径の値などは適宜調整をする必要はあると思います。
また、円グラフによってはちゃんとした円ではなく、 それぞれの扇形に切り分けて、少し中心から遠ざけた円グラフ (ショートケーキ型) のものもあります。 これも容易で、中心座標を少し移動すればいいわけです。まず、
px0(v) = 0.05*r*cos(ar + v/2)
py0(v) = 0.05*r*sin(ar + v/2)
のように、中心座標を計算する px0(), py0() を用意し、
以下のようにします。
plot "datafile" \ using (p=v2a($2),ar=ar-p,px0(p)):(py0(p)):(r):(ar):(ar+p):($0+1) \ with circles lc var,\ "" using (q=v2a($2),ar2=ar2-q,px(q)):(py(q)):(sl($2,strcol(1))) \ with labels
変わったのは p, ar の計算位置と with circle に渡す 1,2 つ目のデータ (中心座標) の部分です。 また、前の円グラフは境界を書いていませんでしたが、 切り分け型だと境界があった方が良いだろうと思いますので、 set style fill を noborder ではなく、「border lc black」としています。 なお、この例のように中心座標を操作することで、 複数の円グラフも容易に書くことができるようになります。
次は、円グラフの真ん中を白抜きにして、 そこに文字を書いてみます。 これは特に複数の円グラフが並んでいる場合によく見る表現方法です。 これも現在の gnuplot では難しくはなく、 中心に小さい白い円を set object circle を使って上書きすればいいわけです。 set object はもちろん plot の前に実行する必要がありますが、 front オプションを使うことで plot の描画要素よりも手前に書くことができ、真ん中を上書きできます。 よって、この場合は事前に以下のものを追加するだけです。
set object circle at 0,0 size 0.3*r front fs solid 1.0 fc bgnd
set label "個人的な\n蔵書" at 0,0 center front
fc bgnd は背景色 (background) の色指定です。
最後は、円グラフの亜種として、「鶏頭グラフ」を書いてみます。 これは、扇形の中心角で割合を表す代わりに、 中心角は全項目平等にして、扇形の半径で割合を表すもののようです。 これは、最初のスクリプトとは多少違いがありますので、 全体を示します。
stats "datafile" using 2 nooutput total = STATS_sum # 合計 N = STATS_records # 行数 max = STATS_max # 最大値 set term pngcairo size 400,400 set output "pichart-3-keito.png" set title "鶏頭グラフ" font ",20" set style fill transparent solid 0.5 noborder set xrange [-1:1] set yrange [-1:1] unset key unset tics set size square r = 0.8 set angles degrees ar = 90 ac = 360/N scale = 3 #len(v) = v/total*r # 項目毎の半径の長さ (100% = 最大半径) len(v) = v/max*r # 項目毎の半径の長さ (最大項目が最大半径) px(j, v) = (v>0.5*max ? 0.7*len(v) : 0.5*r)*cos(ar - (j - 0.5)*ac) py(j, v) = (v>0.5*max ? 0.7*len(v) : 0.5*r)*sin(ar - (j - 0.5)*ac) sl(v, s) = sprintf("%s %d%%\n(%d冊)", s, v/total*100, v) k = 0 m = 0 plot "datafile" \ using (0):(0):(len($2)):(k=k+1,ar-k*ac):(ar-(k-1)*ac):(k) \ with circles lc var,\ "" using (m=m+1,v=$2,px(m,v)):(py(m,v)):(sl(v,strcol(1))) \ with labels
まず、stats では合計だけでなく、 データの個数 (行数) N と最大値 max も取得しています。 N は、中心角を等分するために使い、 最大値は半径の上限値に対応させる値として利用します。 各値に対する半径 len(v) は、その最大値との比で求めています。 ラベルも、小さい半径の扇形の場合は外 (固定半径) に書いています。
ただし、図を見てわかる通り、あまり見やすいとも言えません (データがソートされていないため「鶏頭」にも見えません (^^))。 鶏頭図は、全体のサイズが事前にわからないため、 見やすくするためには事後の調整がかなり必要な気がします。
「情報やメモ (01/29 2015)」 の続報ですが、gif terminal で lt 0 の arrow がおかしくなるのは、 libgd のバグかもしれない、ということです。
ただ、そもそも lt 0 は水平、垂直の軸を書くためのもので 斜めの線を書くには適しておらず、 また gd ドライバはカスタム dashtype をサポートしていないので、 斜めの点線を書くには適さない、という話も聞きました。
gif/png 系でいえば、pngcairo は新しいもので dashtype もサポートしています。 同じ lt 0 で pngcairo で出力した画像は以下のようになります。
これまでは、古いブラウザでは PNG をサポートしてないものがあったので、 PNG よりはなるべく GIF の方がいいかと HTML 用には gif terminal や x11 のスクリーンショットの GIF 画像を使うこともあったのですが、 さすがに今のブラウザで PNG が見れないということはほとんどないでしょうし、 見てわかる通り pngcairo の出力はかなり綺麗です。 GIF が必要であれば、それを netpbm で変換すればいいわけですし、 今後は pngcairo でサンプルを作った方がいいかなと思いました。
なお、レーダーチャートですが、 考えてみれば今の gnuplot には parallel axis というものが実装されています。 これの極座標 (polar) 版がまさにレーダーチャートじゃないかなと思いました。 時間があったらそういうことが可能かどうか少し調べてみたいと思います。
以前レーダーチャートを gnuplot で書くには、という話をしました (「情報やメモ (01/29 2008)」)。 そこでは、データの転置から始まって、 いくつかの gnuplot コマンドを AWK で生成するかなりおおがかりなスクリプト (csh スクリプト) を紹介しましたが、 それを現在の gnuplot (5.X) でやるとどうなるか試してみました。
gnuplot コマンドを AWK で生成したのは、 多くの set arrow, set label コマンドを実行しないといけなかったからですが、 現在は for がありますので、 そのあたりは gnuplot 内部で簡単にできるようになっています。
また、事前にデータの行数や列数を調べるために 外部 Unix コマンドを使用していましたが、 それも現在は stats コマンドを使えば gnuplot 内部でできるようになっています。 そのあたりを使うことで、gnuplot 5.X だとかなり楽にできます。 ただし、データの転置、およびループさせるために最初の行のデータを 最後の行に追加する作業は必要なので、 それによって変換したデータ tmpf1 を使用します。 「情報やメモ (01/29 2008)」 の csh スクリプトでいうと run1 の部分だけ実行してできるデータです。
そのデータから同様のレーダーチャートを作る gnuplot スクリプトを 以下に示します。
max = 100 # レーダー最大値 divide = 5 # 刻の個数 labelsize = ",10" set size square unset tics set angle degree stats "tmpf1" using 2 nooutput rdN = STATS_records - 1 # = 科目の数 (最後の追加行は除いてある) rdM = STATS_columns - 1 # = データを取った人の数 (先頭のラベル列を除く) if (rdN < 2) exit if (rdM < 1) exit set xrange [-1:1] set yrange [-1:1] cx = 0 # 中心 x 座標 cy = 0 # 中心 y 座標 axlen = 0.8 # レーダーチャート軸の長さ # 時計回り順にする場合は以下を使う # theta(j) = 90 - (j - 1)*360/rdN # 反時計回り順にする場合は以下を使う theta(j) = 90 + (j - 1)*360/rdN # px(j,v) = 値 v の j 軸での x 座標, py(j,v) = y 座標 (1 <= j <= rdN) px(j, v) = cx + (axlen*v/max)*cos(theta(j)) py(j, v) = cy + (axlen*v/max)*sin(theta(j)) # 動径の描画 set for [j = 1 : rdN] arrow from 0, 0 to px(j, max), py(j, max) lt 0 nohead # grid の描画 do for [k = 1 : divide] { v = k*max/divide set for [j = 1 : rdN] arrow from px(j, v), py(j, v) \ to px(j + 1, v), py(j + 1, v) lt 0 nohead } # ticslabel の描画 set for [k = 0 : divide] label sprintf("%d", k*max/divide) \ at px(1, k*max/divide), py(1, k*max/divide) offset 0.05, 0 font labelsize # グラフ描画 (各軸のラベル、チャート、平均値) plot \ "tmpf1" using (px($0 + 1, max*1.1)):(py($0 + 1, max*1.1)):1 \ every ::1::(rdN) notitle with labels ,\ for [m = 2 : rdM] "" using (px($0 + 1, $m)):(py($0 + 1, $m)) \ title column(m) with lp pt m + 2, \ "" using (px($0 + 1,$(rdM + 1))):(py($0 + 1,$(rdM + 1))) \ title column(rdM + 1) with lines lt -1
前と少し変えてある部分もありますが、まず今回は polar は使っておらず、 自前で極座標を計算しています。その代わり、このようにすれば、 複数のレーダーチャートを書くことも容易にできるようになると思います。 その座標計算のために px(), py() という関数を用意し、 これによってレーダーチャート内の座標のアクセスに利用しています。
plot コマンドでは、まず各軸のラベルである科目名を with labels を使って tmpf1 の 1 列目にある文字列を書き出しています。 端に重ならないように「max*1.1」でレーダーチャートのやや外 (110 点の描画される付近) に描画するようにしていますが、 every を使って 1 行目と最後の行は捨てるようにしています。 px(), py() の第 1 引数の j を $0 + 1 としているのは、 every 指定によって「国語」が含まれる 2 行目が、 gnuplot 内部では「0 行目」($0 = 0) と扱われてしまうことによります。 + 1 によりそれを j=1 として px() に渡しています。
次は plot for で A さん、B さん、C さんのレーダーチャートを描画していますが、 タイトルは先頭行のタグを利用するように「title column(m)」を使っています。 これも、先頭行データは文字列なので読み飛ばされるために、 国語のデータである 2 行目は gnuplot 内部では「0 行目」($0 = 0) になってしまうので $0 + 1 を px(), py() の最初の引数に渡しています。 これらは with linespoints (lp) で表示しています。
最後は平均点を with lines で書くために、for 文とは別に書いてます。 rdM は 4 で、平均点は 5 フィールド目にあるので rdM + 1 の列を描画します。
do for, set for, plot for のおかげで、 「情報やメモ (01/29 2008)」 の作業に比べればずっと楽にできることがわかると思います。
なお、上の画像は wxt terminal のスクリーンショットになっていますが、 最初は gif terminal の出力を取ってみたら set arrow による grid とレーダー軸がなんともおかしなことになってしまいました。
直線にならず、手書きの線のように曲がってしまっています。 調べると、どうやら gif terminal で set arrow で lt 0 としたときだけに 起きるバグのようです。 gnuplot-5.0.0 であれば、Unix だけでなく MS-Windows 用の wgnuplot でも起きましたが、gnuplot 4.X では起きません。 後で本家に報告しておきます。
(cf. 「情報やメモ (01/30 2015)」, 「情報やメモ (02/19 2015)」, 「情報やメモ (03/29 2017; no.2)」, 「情報やメモ (04/06 2021)」)
前回の報告 (12/12 2014; no.2) 以後、 現在の CVS 版に入れられた主な機能について紹介します (ChangeLog, manual の更新部分等より)。
5.0.0 がリリースされた前後の期間ですので、 あまり大きな変更は今のところはありませんし、 実際に 01/01 以前のものはほぼ 5.0.0 に取り込まれています。 その後の修正も、リリース後に見つかったバグの修正が大半です。 multiplot, key, boxplot, margin, ascii matrix, filledcurves などに修正が少し入っているようです。
私も、test コマンドを続けて 2 回行うと、 右上向きのと左下向きの矢印の矢先のスタイルが 1 回目と 2 回目で 変わってしまうバグを報告し、その修正が取り込まれました。 caca terminal のヘルプがドキュメントに取り込まれないバグも報告したのですが、 こちらはまだのようです。
(cf. 「情報やメモ (03/23 2015)」)
MS-Windows 7 に入れた VC++ (2013) で、MS-Windows 版の gnuplot (wgnuplot) をビルドしてみました。その顛末を報告します。 以前も、例えば 「情報やメモ (08/29 2004)」 「情報やメモ (05/22 2008)」 「情報やメモ (12/05 2009)」 「情報やメモ (03/03 2011)」 などで紹介していますが、 今回はあらたに VC++ 2013 と MS-Windows 7 上での作業で、 いくつか今までにはないことなどもありましたので、 あらためて、備忘録も兼ねて、ここに残しておきます。
方針は、以下の通りです。
作業の説明の前に、コマンドプロンプトからの vc++ の利用と、 patch コマンドに関する注意を書いておきます。
VC++ でのコンパイルは、私はコマンドプロンプトから直接 nmake や cl 等を呼び出して行うことが多いです。 そのため、VC++ 用のコマンドプロンプトを作っています。
これは、VC++ インストール後に、
call "C:\Program Files
(x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x86
set Include=%Include%;"C:\Program Files
(x86)\Microsoft SDKs\Windows\v7.1A\include"
path=%path%;"(作業ディレクトリ)\bin"
と書いたバッチファイル vc++.bat を (作業ディレクトリ)\bat に置き、
それへのショートカット (VC++ 2013) を
%comspec% /k (作業ディレクトリ)\bat\vc++.bat (リンク先)
として作って使っています。
このショートカットをクリックすると、上のバッチファイルが実行された
コマンドプロンプトが立ち上がって、
その中で nmake 等が使えるようになります。
なお、パスを通してある (作業ディレクトリ)\bin には、 適当に持ってきたツールが入っていて、現在は
diff.exe (GNU diff 2.7), patch.exe (GNU patch 2.5.4), nkf32.exe (1.7), make.exe (GNU make 3.81), libiconv2.dll (make.exe 用), libintl3.dll (make.exe 用)などが入っています。 make.exe は、下で書くように freetype のコンパイル用に入れたものです。
パッチ当てには、普段は UnxUtils ( http://unxutils.sourceforge.net/) や どこかから持ってきた patch コマンド (GNU patch) を利用しているのですが、 MS-Windows 7 では、 「要求された操作には管理者特権が必要です」 とか、 「次の不明な発行元からのプログラムによる このコンピューターへの変更を許可しますか?」 などというメッセージが出て、実行できません。
他の Win32 用の gpatch.exe などをダウンロードしてみたのですが、 同様に使えません。 調べてみると、実行プログラムに「patch」 という名前が含まれているためなようです。 対処法としては、XML の manifest ファイルを作成して、 それを patch.exe に mt というコマンドを使って埋め込む必要があるらしいです。 例えば以下参照。
書いてある通りに manifest ファイルを作成し、
mt -manifest patch.exe.manifest -outputresource:patch.exe;1
とすることでようやく使えるようになりました。
しかし、実際にパッチを当てようとすると「patch.exe は動作を停止しました」 などといってまた動かなくなります。
これは、パッチファイルの改行コードの問題のようで、 差分ファイルの改行コードが LF だけの場合は失敗するようです。 nkf32 をインストールし、 nkf32 -c で改行コードを CRLF に変換することで ようやくパッチ当てが完了しました:
nkf32 -c makefile.diff | patch -p0 -b -z .ORG
では、作業について説明していきます。 まずは、必要なライブラリのコンパイルからです。 今回は以下のライブラリを使用しました。
実際の作業等について説明していきます。 なお、これらのライブラリは、コンパイル後に作業ディレクトリ内の common\bin (実行ファイル)、common\include (ヘッダーファイル)、 common\lib (ライブラリファイル) にインストールします。
Makefile は win32\Makefile.msc を使用。
の修正を行って、
> nmake -f win32\Makefile.msc
> cp zlib.h zconf.h ..\common\include
> cp zlib.lib ..\common\lib
(unxutils を使っているので、cp を使っていますが、
もちろん copy でも構いません)
Makefile は scripts\makefile.vcwin32 を使用。
の修正を行って、
> nmake -f scripts\makefile.vcwin32
> cp png.h pngconf.h ..\common\include
> cp libpng.lib ..\common\lib
jconfig.vc と makefile.vc を使用。
> cp jconfig.vc jconfig.h
> cp makelib.ds jpeg.mak
> cp makeapps.ds apps.mak
> nmake -f makefile.vc nodebug=1
> cp *.h ..\common\include
> cp *.lib ..\common\lib
なお、win32.mak が必要なんですが、 Visual Studio 2012 以降はついていないようです。 これは、うちの環境では、
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Includeにあったので、前述の vc++.bat で set Include にこのパスを入れてあります。
これは、まずコンパイルに GNU make が必要です。 以下のサイトから 3.81 をダウンロードします。
必要なのは、「Binaries」の make-3.81-bin.zip と 「Dependencies」の make-3.81-dep.zip です。 これらから make.exe と libiconv2.dll, libintl3.dll を取り出し、 パスの通っているディレクトリにコピーします。
をした後、
> make setup visualc
> make
> cp objs\freetype.lib ..\common\lib
> cp -r include ..\common\include\freetype
> cp include\ft2build.h ..\common\include
libiconv-1.12 以降だと nmake をサポートしていないようなので、 libiconv-1.11.1 を使用しました。
をした後、
> nmake -f Makefile.msvc NO_NLS=1 MFLAGS=-MT
> cp include\iconv.h ..\common\include
> cp src\iconv.exe src\iconv_no_i18n.exe ..\common\bin
> cp lib\iconv.lib ..\common\lib
いよいよ gd ですが、これは 2.0 系ではなく、2.1 系を使用してみます。
VC++ 用の Makefile はかなり不十分なようで、かなり手直ししました。 実際には、最初に libgd を作った後で gnuplot をコンパイルしたら またエラーが出たので、libgd の作り直しを何回か行いました。 未解決の外部シンボルだとか、 void (__stdcall *)... から void (__cdecl *)... に変換できないだとか、 Makefile の /DNONDLL をつける、つけないによる違いだとか、 gd_color.obj, gd_nnquant.obj が LIB_OBJS のエントリにないためのエラーだとか、 結構色々ありました。それらを修正したのが上のパッチです。
なお、うちでは上の他に、エンコーディングに関する独自のパッチも当てています (「情報やメモ (03/03 2011)」 の gd-charmap-1.diff)。
> cd windows
> nmake -f Makefile.w32 all
> cd ..
> mkdir ..\common\include\libgd
> copy src\*.h ..\common\include\libgd
> copy ..\gdbuild\bin\libgd_a.lib ..\common\lib
これで必要となるライブラリのコンパイルは終わりで、 次はいよいよ gnuplot のコンパイルです。
まず、VC++ 2013 は C99 系のコードが通るようになっていて、 以前以下で報告したオブジェクトの定義で使われているコードが、 そのまま通ります。
逆に、config/config.nt に C99 用の修正が必要になります。
新しい CVS 版の gnuplot や gnuplot-5.0.0 はこれでコンパイルできます。 なお、libgd 用に /D_WIN32 や /DBGDWIN32 などもいるようです。
そのあと、できた gnuplot バイナリで demo も実行してみましたが、 一通り通りました。 png terminal で日本語も出せますが、 今回の libgd には freetype は組み込んでいますが fontconfig は組み込んでいないので、 通常の 'MS Mincho' や 'MS 明朝' のような指定ではダメで、 TrueType フォント名を直接指定しなればいけません。 例えば以下のようにします:
set term png
set encoding sjis
set out 'test1.png'
set title '日本語' font 'msmincho.ttc,20'
plot sin(x)
set out
libgd では、デフォルトのフォントパスとして 'C:\WINDOWS\FONTS'
(と 'C:\WINNT\FONTS') が埋め込まれていますので、
そこにあるフォントならばパスを指定する必要はありません。
'MS 明朝' の実体 (フォントファイル名) は msmincho.ttc,
'MS ゴシック' の実体は msgothic.ttc なので、
それらを指定すればいいわけです。
'msmincho' だけではだめなようです。
ただ、現在の 5.0, 5.1 で導入されている Bold や Italic 指定は、 libgd には fontconfig が組み込んでないために効きません。 実際、test コマンドを実行してみるとその部分が表示されませんし、 コマンドウィンドウの方に
gdImageStringFT: Could not find/open font while printing string Bold with font arial:Boldという良くあるメッセージが表示されてしまいます。 まあこれくらいはとりあえず問題ありません。
gdImageStringFT: Could not find/open font while printing string Italic with font arial:Italic
gnuplot-5.0.0 になって、gnuplot-4.X から変わった点などについては、 gnuplot-5.0.0 の RELEASE_NOTES にまとめられています。 ということで、その簡単な日本語訳を作ってみました。 ある程度適当な訳なので、詳しくは原文を参照してください。
MS-Windows 環境の人は、ブラウザで見る分には変わらないかもしれませんが、 EUC-JP 版が化けるようなら Shift_JIS 版をご覧ください。
ついに 2015 01/01 に gnuplot 5.0.0 がリリースされました。 配布物に含まれる NEWS にはこれまでの変更等が書かれていますが、 5.0.rc1 での追加分 (「情報やメモ (09/09 2014)」)、 5.0.rc2 での追加分 (「情報やメモ (09/09 2014)」)、 5.0.rc3 での追加分 (「情報やメモ (12/12 2014)」) に加えて、5.0.rc3 から最終リリースまでの以下の変更が報告されています。
最後から 2 つ目の win terminal のフォントの問題は、 gnuplot の Q&A 掲示板 の 2889 番から 2909 番の記事にある日本語フォントに関する修正です。 だいたい様子がわかったところで本家に報告したら win terminal に詳しい Bastian Maerkisch 氏が あっという間に修正してくれました。
これまで紹介してきたように 4.6 系から見ればかなり変更されています。 私も把握できてないものも多いです。 また何か便利な機能などあれば、 今後随時紹介していきたいと思います。
(cf. 「情報やメモ (05/30 2016)」)