😇

Makie.jlのAlgebraOfGraphics.jlがとても便利だった。

に公開

juliaでグラフを描画するとき、Plots.jlとMakie.jlの2つがある。
最近Makie.jlを使い始めたんだけど、ちょっとかゆいところに手が届かかないというか、Plotsのときののりで書いたら、思い通りいかなかったところがあった。
それが、AlgebraOfGraphics.jlをつかったら一発解決したので、記録しておこうと思う。

Plots.jlでサラッとできてMakieではサラッとできなかったこと

有名なデータセットirisを使って解説する。

Plots.jlの場合

irisのデータをscatterプロットしたときに
Plots.jlを使うと、いとも簡単に色分けされてプロットされる

using Plots,RDatasets,StatsKit
iris = dataset("datasets","iris");
scatter(iris.SepalLength,iris.PetalLength,group=iris.Species)

とするだけで、Species事に色分けされて、それの凡例もさらっとつけてくれる。

Makie.jlの場合

これが、Makieの場合は簡単にいかなくて苦労した。
色々調べて試行錯誤の結果

function myscatter(df; x_var=:x , y_var=:y,color_var=:c)
   species = unique(df[:,color_var])
    f = Figure()
    ax = Axis(f[1,1],
        xlabel = string(x_var),
        ylabel = string(y_var))
    
    for s in species
    scatter!(ax,
    iris[iris.Species.==s,x_var],
    iris[iris.Species.==s,y_var];
    label = s)
    end
    axislegend(position= :rb)
    f
end
using CairoMakie,RDatasets,StatsKit
iris = dataset("datasets","iris");
myscatter(iris,x_var=:SepalLength,y_var=:PetalLength,color_var = :Species)

こんな感じの関数を作って描画するに至った。
いえば、一旦要素ごとにバラバラにして、描画を重ねる。
おそらくPlotsは内部でいい感じにやってくれてるんだと思う。

Makieはデザインがきれいで、色々微調整できる反面、こういう、いい感じにやってくれるってのが難しいのかな?と思っていた。

AlgebraOfGraphics.jlをみつける

Makieのことを少し調べてたらAlgebraOfGraphics.jlってのを見つけた。
ドキュメントを読んでみると、思ってるようなことができそうな予感。
なので、実際にやってみた

using CairoMakie,RDatasets,StatsKit,AlgebraOfGraphics
iris = dataset("datasets","iris");
AlgebraOfGraphics.data(iris)*mapping(:SepalLength,:SepalWidth,color = :Species)|>draw

チュートリアルやexampleをたよりにやってみると

Plotsのときと同じぐらいの手間出できた。

まとめ

AlgebraOfGraphicsはMakieのプロジェクトの中だから、描画処理はMakieがやってるようで、それと組み合わせて色々できるらしい。
そしてメンテナンスも結構やってるので期待。
ggplotのような操作だよーと書いてあった

似たようなのでTidier.jlにあるTidierPlots.jlってのがあって、それはまさにggplotのような操作性を目指してるようだけど、使ってみたけどまだあまりうまくいかなかった。
TidierPlotsも内部はMakieのようなので、今後できるようになるかもしれないけどね。

今後もJuliaに期待。

Discussion