忍者ブログ
物理学者(ポスドク)による日々の研究生活のメモ書きです ( python/emacs/html/Japascript/シェルスクリプト/TeX/Mac/C言語/Linux/git/tmux/R/ポケモンGO)
数年 gnuplot を使っているのに、今更 with circlesというオプションがあることに気づいた・・・
x y z みたいな3列のデータがデータがあったときに
plot "hoge.txt" with circles で3列目が円の半径となるような円を描くことができる。

これを色々と活用して、あーだこーだするとこうなる・・・

c1e94eef

ちょっと前に触っていた D3.js で描けそうなグラフができてしまった・・・


■ 参考ページ
gnuplot demo script: circles.dem





(追記 2014/11/16)
ちなみに使ったコードはこんな感じ

set term png
set output "color_plot.png"
set size square

set xrange [-3:3]
set yrange [-3:3]


set palette model HSV functions gray,1,1 # HSV color space
#set palette model RGB rgbformulae 7,5,15 # traditional pm3d (black-blue-red-yellow)
#set palette model RGB rgbformulae 30,31,32 # color printable on gray (black-blue-violet-yellow-white)
#set palette model RGB functions gray,0,0 # gray: 0以上1以下の実数
set key outside
unset colorbox

max_n=4
plot n=0, min=15,\
"mod_data.txt" u ( min < $3 ? $1 : 1/0 ):($2):(0.1) notitle w circles lw 2 palette frac n/4.0,\
n=n+1, max=min, min=5,\
"" u (( min < $3 && $3 <= max ) ? $1 : 1/0 ):($2):(0.04) notitle w circles lw 2 lc palette frac n/4.0,\
n=n+1, max=min, min=-5,\
"" u (( min < $3 && $3 <= max ) ? $1 : 1/0 ):($2):(0.04) notitle w circles lw 2 palette frac n/4.0,\
n=n+1, max=min, min=-15,\
"" u (( $3 <= max ) ? $1 : 1/0 ):($2):(0.1) notitle w circles lw 2 palette frac n/4.0
データは適当に用意したものなので意味なし
1列目にx座標
2列目にy座標
3列目に円の半径








PR
一つ前の布石記事を参考にして、ある分布関数に沿ったデータを手元に用意できたと思いますので、
次はそれをgnuplotを使ってfittingしていこうと思います




前の記事で書いたrayleigh分布のデータとそのヒストグラムデータをそのまま使います

gnuplotで
f(x, a,b)=x/a/a*exp(-x*x/2.0/a/a)*b
a=1
b=300
fit f(x, a, b) "${OUTPUT}" u 1:2 via a,b
plot[0:5] "foo.txt" with boxes, f(x, a, b) w l lw 3 lt 3
参考 :
result_fitting

画面にはfittingの結果が出力されています、最後だけ抜き出すと、
94ff932f
7回のfittingの結果、推定値はa=0.972823 , b=49.5786らしいです
fittingの方法は最小二乗法らしいです(他の方法も選べる?)


今回は精度とかはどうでもよくて、ただ確認がしたかっただけなのでこれだけ〜
もっとガチなことがやりたかったらやはりROOTを使うんだろうなぁ〜










例えばこんな感じで
gsl-randist 0 1000 rayleigh 1 > hoge.txt
ただしGSLをインストールして、PATHを通していないと使えない
デフォルトのPATHにインストールしたなら
$ which gsl-randist
/usr/local/bin/gsl-randist






gsl-randistの使い方を軽く説明・・・
[coffee@somewhere:~]gsl-randist
Usage: gsl-randist seed n DIST param1 param2 ...
Generates n samples from the distribution DIST with parameters param1,
param2, etc. Valid distributions are,

beta
binomial
bivariate-gaussian
cauchy
chisq
dir-2d
dir-3d
dir-nd
erlang
exponential
exppow
fdist
flat
gamma
gaussian-tail
gaussian
geometric
gumbel1
gumbel2
hypergeometric
laplace
landau
levy
levy-skew
logarithmic
logistic
lognormal
negative-binomial
pareto
pascal
poisson
rayleigh-tail
rayleigh
tdist
ugaussian-tail
ugaussian
weibull
要するに、gsl-randist には次の引数が必要
初期シード, 出力したいデータ点数, その乱数が沿った分布関数, パラメーター(必要な個数は分布によって異なる)

例えば今、Rayleigh分布についての乱数データを100個欲しいとする
gsl-randist 0 1000 rayleigh 1 > hoge.txt
0が初期シード
1000は1000点乱数生成する
rayleighは分布関数
1はパラメーター, ここでは分散に相当


???「ね、簡単でしょ?」


え、ほんとに分布関数に沿っているか確認したい?
GSL「任せてください」
cat hoge.txt | gsl-histogram 0 5 100 > foo.txt
これでヒストグラムが取れる
gst-randistが使えるなら、gst-histogramというヒストグラムを取ってくれるコマンドも使えるはず〜


あとはgnuplotでグラフを書くだけ
plot [0:5]"foo.txt" u 1:3 w boxes
参考 :
result




賢明な読者の方はRayleigh分布は1つのパラメーターで表せることはすでにご存知だと思うが、
もしど忘れしてしまったときは
$ gsl-randist 0 1000 rayleigh
Error: arguments should be sigma = scale parameter
と打つと、必要なパラメーターは1つだと教えてくれる
なので、「とりあえず gsl-randist と打つ」とだけ覚えておけば他は覚えなくてよいだろう






ちなみに beta分布〜weibull分布 までいくつかの分布を選べたがこれらはすべてGSLに実装されている
つまり自分でソースを書いて、GSLの必要なヘッダーをincludeして・・・という作業をしなくてよいのでかなり楽

一方であくまでデモンストレーションなので、ガチのシミュレーションには使えない
シェルで全部やるのは時間がかかりすぎるので・・・・













統計分布のような2つの塗りつぶし線をグラフに書いてみたいが、重なった部分がどうなっているのかわからないので困っていた
d3.jsではopacityというオプションを使えば綺麗にプロットできたことを思い出して調べてみると、
さすがgnuplot! そういうオプションがあった。

実際に自分が書いたグラフはここに貼ることができないので、とりあえず参考リンクだけ残しておく


■ 参考リンク

gnuplot demo script: transparent.dem

transparency in gnuplot


1つめのdemoの通りにやっても、透明にならなかったので
2つめの記事にあるように
set term png truecolor
としてみると設定が反映された

よくわからんが、とりあえず今回はこれで・・・
どうでもいいけど、淡い色合いもいいなぁ〜











データ生成から記事を書いてたけど、長い上にどーでもいいのでカット。


plot "3.txt"
としてみると・・・・

e95bd33f
完全にx軸の値が被ってしまっている
(実はgnuplotさんがちゃんとしてくれているので本当は被らないのだけど、fontサイズを大きくしたりすると被ることが稀によくある)


そこでx軸の値を回転させて見る
set xtics rotate by -60
plot "3.txt"
すると・・・
6e36b786

なかなかいい感じ。
x軸にGPS時刻とかをとるときに、やたら被って困ったけど 今回はこれで解決


■ 参考
gnuplot で軸ラベルが重なったときは回転させて逃げる


あと実はlabelとかも回転させれるらしい(こっちは使いどころがなさそう)















結論から書くと、gnuplotの機能にはそういうものはないらしい。

■ 参考
gnuplot plot data from two files: in one x coordinate, in other y

リンク先で提案されているのは
paste data1.txt data2.txt > mod_data.txt
と、pasteコマンドを使って1つのデータにまとめる方法

もしくは
plot "<paste data1.txt data2.txt"
とする方法
おそらく < の文字はshでコマンドを実行するのだろう
こちらの方がすっきりしているが、うまくいかないケースがあった

今回は前者の方法で解決した。









まずは以下のようなデータを用意する
めんどくさかったので awk コマンドを使って作成した ( 前記事参照 )


そのデータを使ってgnuplotで等高線 + pm3d mapのplotをしてみる




基本的には次のページを参考にした
Contour plots




まず 前記事 のデータを
そのままpm3d mapでplotしてみると
set pm3d map
set xtics 1
set ytics 1
splot "hoge.txt"
でこんな感じになる

9504a390

次に等高線のデータをtableコマンドを使って作成する
set contour base
set cntrparam level incremental 0, 20, 100
unset surface
set table "contour.dat"
splot "hoge.txt"
unset table
でできたデータをwith lineでplotしてみると
plot "contour.dat" w l lw 2 lc -1


9feb35d5


これらを重ね書きしてみる。
set xrange [0:4]
set yrange [0:4]
set xtics 1
set ytics 1
#set isosample 250, 250
set table 'image.txt'
splot "hoge.txt"
unset table

set term png
set output "image.png"
set pm3d map
splot "image.txt"



reset
set contour base
set cntrparam level incremental 0, 20, 100
unset surface
set table 'contour.txt'
splot "hoge.txt"
unset table

set term png
set output "contour.png"
set xtics 1
set ytics 1
plot "contour.txt" w l lw 2 lc -1



reset
set term x11
set xtics 1
set ytics 1
set xrange [0:4]
set yrange [0:4]
unset key
set palette rgbformulae 33,13,10
set term png
set output "op_image.png"
p 'image.txt' with image, 'contour.txt' w l lt -1 lw 2

set term png
set output "op_image2.png"
set pm3d explicit map
splot "hoge.txt" with pm3d, "contour.txt" w l lw 2 lt -1
長いですが、そのまま書いておきます

op_image.pngとop_image2.pngを比較してみると・・・

■ op_image.png
op_image

■ op_image2.png
op_image2
びみょーに違いますね・・・
自分は下の方がお好みなので、下で行くことにします

もし下で良いならば、最初のtableの段落は不要なのでかなり短くなります

参考にしていたページにはもう一つ、等高線に数字を付けるというスクリプトも載っていましたが、それはそのうちやってみようと思います










研究で必要に迫られたわけではない・・・けど、あると理解しやすい気がしたので作ってみました

基本的には以前書いた記事と同じことをしてるので詳細はパス。

前回記事 : 【Gnuplot】のみを用いてgifアニメを作る






(サムネイルなので、クリックしたらgifアニメになっているのが見れます)

やっているのはのこぎり型の関数をフーリエ級数展開して、
何次の項まで足し合わせたかの影響を見せています


もう一枚・・・

こっちは収束が早いので、画面更新の速度を遅くしています




gnuplotで

set terminal gif animate

と打ったときに画面に表示される文字に注目すると、

ptions are 'nocrop font "arial,12" fontscale 2.0 animate delay 10 loop 0 nooptimize size 1080,720 '

・animate delayが画面更新の速度
・sizeが画像のサイズ
・loopはいじってみたけど、よくわからない・・・おそらくloopするかしないかだと思うけど・・・

これをset terminal gif animateの後ろに付けてからset termminalすればおーけー















■ x軸に平行な場合
plot 1
でこんな感じ↓



■ y軸に平行な場合
set parametric
plot [-5:5]1,t
でこんな感じ↓





ただしこの方法だと、普通のxy座標を使った方法とは共存できないっぽいので、
結局この方法は使わずに2点のデータを書いたテキストファイルを書きました・・・・。








2週間ほど前に思い立って、「よくつかう確率分布の有為度早見表」を作ってみました
とりあえずガウス、ポアソン、レイリー分布をピックアップ

追加するとしたらカイ2乗分布とか?


そのときに積分範囲を塗りつぶしたグラフを書く必要が出てきたので
どういうことをしたのかメモしておきます
f(x)=1.0/sqrt(2*pi)*exp(-x*x/2.0)
sigma = 1.5set lmargin 5
set rmargin 4
set tmargin 2
set bmargin 2
set size ratio 2.0/7.0
set term pdf size 7, 2
set output "gauss_twoside.pdf"
set multiplot layout 1,2
plot [-4:4][0:0.45] (-sigma < x && x < sigma ? f(x) : 1/0) with filledcurve x1 lc 3 notitle , f(x) w l lw 3 lc -1 notitle
plot [-4:4][0:0.45] (x < -sigma ? f(x) : 1/0) with filledcurve x1 lc 3 notitle , f(x) w l lw 3 lc -1 notitle, (sigma < x ? f(x) : 1/0) with filledcurve x1 lc 3 notitle
unset multiplot
これでこんな感じのグラフが書けます
gauss_twoside
横長出力、2つのグラフを重ねるあたりは過去記事を参考にしたらなんとかできました

■ 参考
【gnuplot】縦横比を自分好みに変えて、余白も指定したpdfを作りたい


【gnuplot】multiplotを使ってみたい








set label 2 center at graph 0.5,1.1 "R.A. [degree]"
ちなみに 前の記事 にこの設定を活かして書いたplotがこれ。
x軸のlabelの位置がx軸の下ではなく上になっている

a2b93926


■ 参考

上手なラベル配置のコツ

















set key spacing 1.5
前の記事 で書いたplotでも使っているが、このときのplotでは0.8倍と通常よりも詰めて書いている
以前も書いた気がするけど、もう一度メモ


■ 参考
凡例(Legend)あれこれ












週末にかけて東京の某所に出張に行っていた
gnuplotについて熟知していると錯覚していた作者は、後輩に新しいplotの仕方を教えてもらって驚いた


それを使うとこんな感じのグラフが描ける↓
be693aec

データの形式自体は pm3d mapとかと同じ
[x_data] [y_data] [contour_data]
もらったデータは、きりが良いところで毎回改行を1行だけ挟んでいたが、必要かどうかは不明


上の画像を作るのに使用したコマンドは以下の通り
set xlabel "R.A. [degree]"

set ylabel "Dec. [degree]"

set key below
#set key outside
set key spacing 0.8
#set key box

set xrange [360:0]
set yrange[-90:90]

set ztics 0,0,0

set term pdf
set output "hoge.pdf"

set contour
unset surface
set view 0,0
set cntrparam levels incremental 0,25,90
splot "data_mod.txt" w l lw 2
こんな感じ


注意すべきは set cntrparam levels incremental 0,25,90 の当たりか
これは0から90までを25刻みの等高線を書く設定
25, 50, 75に書かれるみたい


■ 他のオプションの参考
等高線のよりきめ細かい制御










gnuplotのpm3d mapを使ってcontour plotを書くことが頻繁にある
グラフを書くにあたって、4点の平均化をして色を塗っているらしい。
それをされると、思っている値とは違うグラフができることがある

そこでそれをキャンセルするオプションを同期から教えていただいた
set pm3d corners2color c1
c1のところをc2やc3とかに変えると、四角のうちどの点を参照するのか変えれるらしい
(c234とかも可能か?)


■ 参考
http://www-ise2.ist.osaka-u.ac.jp/~shinkai/gnuplot/


pm3d mapで極力データに"忠実な"画像を出力する












何度も詰まってるのに、記事にまとめないのはダメ。

トラブルの原因は
 1 バックスラッシュとスラッシュが超わかりづらい
 2 なんか出ない記号がある
 3 ダブルコーテーション""の中では、特殊文字(エスケープ文字)があるためバックスラッシュとかを2回書かないとだめ


結局よくわからん・・・・


自分用メモ
~ : {/Symbol \\176}













set key below

これでこんな画像になる↓
f11b5378
set key outside
だと、
78d7555c

おまけ

hoge3


■ 参考
以前書いた記事
【gnuplot】keyに関するメモ

凡例を設定する



■リンク
GNUPLOTメモ


gnuplotコマンド集


gnuplotの取扱説明書 日本語訳


pm3d: グラフの色が本来の値と違う?
↑pm3dの使い方とか

Top / Members / chinone / 覚書 / Gnuplot/Gnuplot


Demo scripts for gnuplot version 4.6
↑demo
gnuplot自体に含まれているから、ここで見なくてもいいけど、探すのが楽になりそう


set autoscale [軸]
でうまくいきました

[軸]のところにxyzとか入れればおーけ
何も入れないと、x, y, z, cb, x2, y2, xyが全て自動でスケールされるようになるらしす

■参考
自動縮尺を使用する
53bc59fb
こんな感じで細かいgrid線を書きたいときは
set xtics 0.1
set grid xtics ytics mxtics mytics


今夜はこれで決まり!(もこみち風)
今日後輩が計算結果をグラフに書いているのを見て、初めて知ったこと:

lを押すと片対数表示になるらしい



調べてみたらこんなまとめを発見
gnuplotでグラフを表示しているときに使えるショートカットキー

eが地味に使えると思う。
set xlabel ""hoge
とか書いた後にreplotってしなくてもよくなるから




hって打つとヘルプが出てくるらしい↓

2x print coordinates to clipboard using `clipboardformat`
(see keys '3', '4')
annotate the graph using `mouseformat` (see keys '1', '2')
or draw labels if `set mouse labels is on`
remove label close to pointer if `set mouse labels` is on
mark zoom region (only for 2d-plots and maps).
change view (rotation). Use to rotate the axes only.
change view (scaling). Use to scale the axes only.
vertical motion -- change xyplane
scroll up (in +Y direction).
scroll down.
scroll left (in -X direction).
scroll right.
zoom in toward the center of the plot.
zoom out.
zoom in only the X axis.
zoom out only the X axis.

Space raise gnuplot console window
q * close this plot window

a `builtin-autoscale` (set autoscale keepfix; replot)
b `builtin-toggle-border`
e `builtin-replot`
g `builtin-toggle-grid`
h `builtin-help`
l `builtin-toggle-log` y logscale for plots, z and cb for splots
L `builtin-nearest-log` toggle logscale of axis nearest cursor
m `builtin-toggle-mouse`
r `builtin-toggle-ruler`
1 `builtin-decrement-mousemode`
2 `builtin-increment-mousemode`
3 `builtin-decrement-clipboardmode`
4 `builtin-increment-clipboardmode`
5 `builtin-toggle-polardistance`
6 `builtin-toggle-verbose`
7 `builtin-toggle-ratio`
n `builtin-zoom-next` go to next zoom in the zoom stack
p `builtin-zoom-previous` go to previous zoom in the zoom stack
u `builtin-unzoom`
Right `builtin-rotate-right` only for splots; increases amount
Up `builtin-rotate-up` only for splots; increases amount
Left `builtin-rotate-left` only for splots; increases amount
Down `builtin-rotate-down` only for splots; increases amount
Escape `builtin-cancel-zoom` cancel zoom region

* indicates this key is active from all plot windows
set multiplot layout 2,1
plot "hoge1.txt" u 1:2, "hoge2.txt" u 1:2
plot "hoge1.txt" u 1:3, "hoge2.txt" u 1:3
unset multiplot


こんな感じにしたらいけた。


駄目なパターン
set multiplot layout 2,1
plot "hoge1.txt" u 1:2
replot "hoge2.txt" u 1:2
plot "hoge1.txt" u 1:3
replot "hoge2.txt" u 1:3
unset multiplot

今までreplotばっかり多用してたのがあだになった感じか


ちなみにこれで書いたグラフが
overlap_no_offset










fftした結果をわかりやすく表示してくれるようなスクリプト

結果はこんな感じ↓


multiplotというのを活用しています。
multiplotの使い方は

set multiplot layout 2,1
plot sin(x)
plot cos(x)
unset multiplot

これで↓


layoutの後の数字で、画面を何分割するかを決めています。
縦に2列 横に1列という分け方

終了するときはunsetをお忘れなく



もうちょいお洒落にしたかったら、
set terminal pdf enhanced
set output "blog2.pdf"
set ytics 0.5
set xtics 0.5*pi
set format x "%1.1PPi"
set multiplot layout 2,1
set xrange[0: 2*pi]
plot sin(x) w l lw 2 lt 1
plot cos(x) w l lw 2 lt 3
unset multiplot


これでこんな感じ↓



plotfft自体もこれを使って書いています。
一瞬中身を公開しようと思ったけど、まぁ止めときますw
gnuplotが起動するときに読み込む設定ファイル .gnuplot に次のように書いておけば良い

set terminal png enhanced size 1080, 720
set terminal x11


これでpngで出力するときは自動的に上に書いたサイズになるよー
整数は%dで
実数は%fとか%e
とか

そういう使い分けをしなくても
set format x "%g"
set format y "%g"
としとけばgnuplotさんが全部やってくれることがわかった
(要するにデフォルトの設定)


きちんとしたグラフを書きたいときくらいだけでいっか・・・・
■参考 : pm3dによる等高線図(カラーマップ)に2次元グラフを重ねる方法



先日見つけたdemoに入っているworld.datを活用してみたい
(実は以前からこの世界地図の存在は知っていた・・・・)


plot [-180:180][-90:90]"world.dat" w l lw 2
で、こんな感じ↓

world

これをpm3dのグラフと重ねてみたら色々とできるかも!





で、試行錯誤して書いた結果がこれ。
書き方は上のサイトを参考に

detector_4




(2013/1/21 追記)


上のサイトから引用
処方:
set pm3d explicit map
splot "hoge1.dat" with pm3d, "hoge2.dat" with point

ここでhoge1.datは等高線図(カラーマップ)のもとになる
3次元のデータファイル (x_i,y_i,z_i) (i=1,...,N)
hoge2.dat はこの上に重ねたい2次元のデータファイル (x'_j,y'_j) (j=1,...,N')
ですが z=0 を加えて (x'_j,y'_j,0) のように擬似的に3次元データに改変しています。
最後の with point は  with line でもOKです。


この書き方がけっこう便利
プロフィール
HN:coffee
職業:物理屋(自称)
趣味:映画鑑賞、登山
出身:大阪府の南の田舎
自己紹介:
import MyProfile
import coffee_pote from TWITTER
import amazonのほしい物リスト from WISH_LIST

print "先月子供が産まれました!"

# 最終更新 2022/10/25
カウンター
カウンター カウンター
ブログ内検索
ツイートするボタン
リンク
相互リンク募集中です (Twitterにてお知らせください)

Demo scripts for gnuplot version 5
(gnuplotのさまざまなデモ画像と作り方がまとめられている、眺めているだけでできるようになった気分になれる)

gnuplotスクリプトの解説
(米澤進吾さんの個人ページ、gnuplotと言えばこのかた)

gnuplot のページ
(Takeno Lab、うちのブログがリンクされていたのでリンク返し)

Twitterから映画の評価が分かる & 映画の鑑賞記録が残せる coco
(映画の感想をまとめられるサイト、いつもお世話になっています)

Astronomy Picture of the Day Archive
(天文や宇宙関連の最新の話題について画像とともにNASAが説明しているページ)

今日のほしぞら
(任意の時刻の空で見える星を表示してくれる、国立天文台が管理している)

GNUPLOTとアニメーション
(応用の項目の「見せてあげよう!ラピュタの雷を!!」あたりからすごすぎる)

読書メーター
(読んだ本をリストできる便利なサイト)

flickr難民の写真置き場
(20XX年、flickrは有料化の炎に包まれた。あらゆるflickr無料ユーザーは絶滅したかに見えた。 しかし、tumblr移住民は死に絶えてはいなかった。)

教授でもできるMac OS X へのLaTeX, X11, gccのインストレーションと環境設定
(阪大の山中卓さんのwebページ、タイトルにセンスが溢れている、内容は超充実してる、特にTeX関連、学振DCとかPDの申請書類作成時にはお世話になっております)

英語論文執筆用の例文検索サービス
(とんでもないものを見つけてしまった・・・・ arXivに収録されている 811,761報の 英語論文から,例文を検索するための検索エンジン)


Template "simple02" by Emile*Emilie
忍者ブログ [PR]