プロット:Gadflyのtips
Juliaの上でプロットしたかったら、PyPlotかGadflyが標準的らしい。
- Gadflyは配色のセンスがいい。
- 他のに比べて重い。(特に最初に読み込むときは信じがたいほど遅い)
もっと比べたい人はこちらへ: Graphics in Julia
DataFrameを使ってプロットする方法と、配列や関数をそのままプロットする方法の2通りあるらしい。
- 素朴なプロットならDataFrameなしの方がお手軽。
- ちょっと複雑なプロットならDataFrameを使った方がよい。
基本DataFrame推しのようなので、諦めてDataFrameを使った書き方に慣れた方がよさそう。
準備
JuliaのターミナルでGadfly, DataFramesを入れる。
Pkg.add("Gadfly") Pkg.add("DataFrames") # <-複数形ね
(Cairoも入れておくとよいと言われているけど、今のところCairoで解決した問題がないので保留 [1/2/2016])
使うときは、最初に
using Gadfly using DataFrames # <-複数形ね
と書いてから始める。 (欲張って using PyPlot
も書くと、競合して動かない(っぽい)ので注意。)
配列データをプロットする
2次元density plot: rectbin
x-座標(x)、y-座標(y)、(x,y)での値(value)の3つを、ベクトルX, Y, Zとして与える:
plot(x=X,y=Y,color=Z,Geom.rectbin)
<例> N-by-M行列PSIの行列要素をdensity plotする。
X = Int64[] Y = Int64[] Z = Float32[] for y = 1:size(PSI,1) for x = 1:size(PSI,2) push!(X,x) push!(Y,y) push!(Z,PSI[y,x]) end end plot(x=X,y=Y,value=Z,Geom.rectbin)
ref: (参考にさせていただいた記事が見つからない。。。)
DataFrameを使ってプロットする
こんなサンプルデータを考える*1。
n = 10 x = collect(1:n) y1 = rand(n) y2 = rand(n) y3 = rand(n)
配列データをDataFrameにする
# Put the data in a DataFrame using DataFrames d = DataFrame( x = vcat(x,x,x), y = vcat(y1,y2,y3), group = vcat( rep("1",n), rep("2",n), rep("3",n) ) )
- データは行列ではなく、配列にしておかないとダメ。行列になっていたら
vec()
で変換。 rep
はreplicateの略で、n成分の配列を作ってくれる*2。- x, y, groupは名前を変えてもよい。これで軸名を指定できる。
scatter plot
# Plot using Gadfly plot( d, x=:x, y=:y, color=:group, Geom.point, Scale.discrete_color_manual("green","red","blue") )
Scale.discrete_color_manual("green","red","blue")
はいろいろwarningが出るけど、とりあえず実行できた。- colorは名前を変えてはダメ。ぜったい。
histogram
単純。
using DataFrames using Gadfly v = [1,2,2,0,0,0,4,3] # 例えばこんなデータを考える d = DataFrame( x = v # vが配列データじゃなかったら、vec(v)で配列にする ) plot(d, x="x", Geom.histogram(bincount=6))
- オプションの
bincount
はなくてもOK。 - 整数要素の場合、x=0のbinがバグるっぽいので、微小乱数でも付けておけば大丈夫かと。(整数だと、常にbinの境界の値を判定しているから。たぶん。)
- 「規格化のオプションがない!」と思ったら、それは
Geom.histogram
ではなく、Geom.density
を使えばよい。
プロットに軸名、タイトルをつける
例としてrectbinのところで用いた行列のdensity plotを扱う。
x軸とy軸の軸名、プロットのタイトルをつけるには、
plot( x=X,y=Y,color=Z, Guide.xlabel("row"), Guide.ylabel("column"), Guide.title("matrix"), Geom.rectbin)
でできる*3。
随時更新予定
(以上、R移民にしてみれば常識かもしれないが、MATLAB移民に言わせればry)
*1: 以下の数小節は、julia lang - How to overplot multiple arrays of data in one Gadfly plot? - Stack Overflow のVincent Zoonekynd氏の回答の内容ほぼそのままです。
*2:Rプログラム (TAKENAKA's Web Page)
*3:Introducing Julia/Plotting - Wikibooks, open books for an open world