MATLAB移民のためのJulia tips

MATLAB移民のためのJulia tips

何も考えずに速く計算できないのならば、何もやりたくない。

プロット: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)

f:id:tatmann9:20160102213832p:plain

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)