Makieを使ったグラフ作図例

# 綺麗なグラフ
論文の図としても使えるようなグラフをJuliaで書きたいですよね。そんな時はMakieを使いましょう。具体的には、CairoMakieというパッケージを使います。実際に論文に使った図を描くときのコードもご紹介します。

# 作図例1
例えば、ダミーデータを作る関数を
```julia
function makedummy()
    Ms_data = []
    M_data = []
    T_data = []
    for i=1:3
        numdata = 100
        T_i = zeros(numdata)
        Ms_i = zeros(numdata)
        M_i = zeros(numdata)
        for k=1:numdata
            T_i[k],M_i[k],Ms_i[k] = k,cos(k)+rand(),k*sin(k)+rand()
        end
        push!(T_data,T_i)
        push!(M_data,M_i)
        push!(Ms_data,Ms_i)
    end
    return T_data,M_data,Ms_data
end
```

としておきます。

横軸が```T_data```で縦軸が二種類あるようなものを描きたいです。例えば、

```julia
using CairoMakie

function main()
    T_data,M_data,Ms_data = makedummy()
    println(T_data)
    println(M_data)
    println(Ms_data)

    f = Figure()
    f1 = Axis(f[1, 1],
        #xlabel = L"T [t]",
        ylabel = L"|M|",
        xscale =log10)
        
    f2 = Axis(f[2, 1],
        xlabel = L"T [t]",
        ylabel =  L"|M_s|",
        xscale =log10)

    colsize!(f.layout, 1, Fixed(400))
    scatterlines!(f1, T_data[3], M_data[3], markercolor = :blue,transparency=true,marker = :circle,label = "cat")
    scatterlines!(f1, T_data[1], M_data[1], markercolor = :red,transparency=true,marker = :star5,label = "dog")
    scatterlines!(f1, T_data[2], M_data[2], markercolor = :green,transparency=true,marker = :utriangle,label = "pig")
    scatterlines!(f2, T_data[3], Ms_data[3], markercolor = :blue,transparency=true,marker = :circle,label = "cat")
    scatterlines!(f2, T_data[1], Ms_data[1], markercolor = :red,transparency=true,marker = :star5,label = "dog")
    scatterlines!(f2, T_data[2], Ms_data[2], markercolor = :green,transparency=true,marker = :utriangle,label = "pig")
    axislegend(f1, merge = true, unique = true,position = :rb)

    save("Tdep.png", f) 
end

main()
```
のようにすれば描けます。こちらのコードは論文の図を描くのに使いました。

この実行結果は

![Tdep.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246113/bb7968a5-267d-dc86-2a0b-f84a90dba95d.png)

です。ここではpngとしましたが、pdfとすれば鮮明な図が得られます。ここでは```f1```が上のグラフ、```f2```が下のグラフになっています。```f1=```の部分で上のグラフの設定を行っています。```scatterlines```は記号と線を結びます。

# 作図例2

今度は4枚のグラフを一枚の図として入れてみましょう。
コードは
```julia
using CairoMakie
function main2()
    T_data,M_data,Ms_data = makedummy()
    println(T_data)
    println(M_data)
    println(Ms_data)

    f = Figure()
    f1 = Axis(f[1, 1],
        #xlabel = L"T [t]",
        ylabel = L"|M|",
        xscale =log10)
        
    f2 = Axis(f[2, 1],
        xlabel = L"T [t]",
        ylabel =  L"|M_s|",
        xscale =log10)

    f3 = Axis(f[1, 2],
        #xlabel = L"T [t]",
        #ylabel = L"|M|"
        )
        
    f4 = Axis(f[2, 2],
        xlabel = L"T [t]",
        #ylabel =  L"|M_s|"
        )

    colsize!(f.layout, 1, Fixed(300))
    colsize!(f.layout, 2, Fixed(300))
    scatterlines!(f1, T_data[3], M_data[3], markercolor = :blue,transparency=true,marker = :circle,label = "cat")
    scatterlines!(f1, T_data[1], M_data[1], markercolor = :red,transparency=true,marker = :star5,label = "dog")
    scatterlines!(f1, T_data[2], M_data[2], markercolor = :green,transparency=true,marker = :utriangle,label = "pig")
    scatterlines!(f2, T_data[3], Ms_data[3], markercolor = :blue,transparency=true,marker = :circle,label = "cat")
    scatterlines!(f2, T_data[1], Ms_data[1], markercolor = :red,transparency=true,marker = :star5,label = "dog")
    scatterlines!(f2, T_data[2], Ms_data[2], markercolor = :green,transparency=true,marker = :utriangle,label = "pig")
    scatterlines!(f3, T_data[3], M_data[3], markercolor = :blue,transparency=true,marker = :circle,label = "cat")
    scatterlines!(f3, T_data[1], M_data[1], markercolor = :red,transparency=true,marker = :star5,label = "dog")
    scatterlines!(f3, T_data[2], M_data[2], markercolor = :green,transparency=true,marker = :utriangle,label = "pig")
    scatterlines!(f4, T_data[3], Ms_data[3], markercolor = :blue,transparency=true,marker = :circle,label = "cat")
    scatterlines!(f4, T_data[1], Ms_data[1], markercolor = :red,transparency=true,marker = :star5,label = "dog")
    scatterlines!(f4, T_data[2], Ms_data[2], markercolor = :green,transparency=true,marker = :utriangle,label = "pig")

    axislegend(f1, merge = true, unique = true,position = :rb)

    save("Tdep2.png", f) 
end

main2()
```
です。出力は

![Tdep2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246113/fd61693f-6710-46d9-af7a-584e19cbd3df.png)

となります。このコードの数字を色々変えて遊んでみると、自分の好みのグラフが描けるかもしれません。

# 作図例3
次は、データに対して関数フィッティングを行い、そのフィッティングとデータを同時にプロットしてみます。フィッティングにはLsqFit.jlというパッケージを使いました。

コードは

```julia
using CairoMakie
using LsqFit

function main3()
    fdata(x) = 0.2*x^(-1.2)*(1+0.4*rand())
    xs = range(0.1,10,length=20)
    ydata = fdata.(xs)

    @. ffit(x,p) =  (p[1]/x^(p[2]))
    p0 = [0.3,-1]
    fit = curve_fit(ffit, xs, ydata, p0)
    println(fit.param)
    p = fit.param


    f = Figure()
    f1 = Axis(f[1, 1],
        xlabel = "num. of parameters",
        ylabel = L"|L_{\alpha}|",
        xscale =log10,
        yscale =log10,
        aspect = AxisAspect(4/3),
        xlabelsize = 24,
        ylabelsize = 24,
        xticklabelsize = 24,
        yticklabelsize = 24
        )

    colsize!(f.layout, 1, Fixed(600))
    scatter!(f1, xs, ydata, markercolor = :blue,transparency=true,marker = :circle,label = "cat")
    lines!(f1, xs, ffit(xs,p), color = :red,transparency=true,label = "$(p[1])/x^$(p[2])")
    axislegend(f1, merge = true, unique = true,position = :rt)
    save("loss.png", f) 
end
main3()
```
です。出力結果は、

![loss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246113/5f18b409-73c5-118a-9981-0d9d4233a25f.png)

となります。フォントサイズやアスペクト比なども調整していますので、このコードを参考に色々いじると好みの図が出力できるかもしれません。

刻みを調整したい場合には、例えば、

```julia

function main3()
    fdata(x) = 0.2*x^(-1.2)*(1+0.4*rand())
    xs = range(1,100,length=20)
    ydata = fdata.(xs)

    @. ffit(x,p) =  (p[1]/x^(p[2]))
    p0 = [0.3,-1]
    fit = curve_fit(ffit, xs, ydata, p0)
    println(fit.param)
    p = fit.param


    f = Figure()
    f1 = Axis(f[1, 1],
        xlabel = "num. of parameters",
        ylabel = L"|L_{\alpha}|",
        xscale =log10,
        yscale =log10,
        aspect = AxisAspect(4/3),
        xlabelsize = 24,
        ylabelsize = 24,
        xticklabelsize = 24,
        yticklabelsize = 24,
        xticks = ([1,10,50,100]),
        yticks = ([10.0^(-n) for n=0:3])
        )

    colsize!(f.layout, 1, Fixed(600))
    scatter!(f1, xs, ydata, markercolor = :blue,transparency=true,marker = :circle,label = "cat")
    lines!(f1, xs, ffit(xs,p), color = :red,transparency=true,label = "$(p[1])/x^$(p[2])")
    axislegend(f1, merge = true, unique = true,position = :rt)
    save("loss.png", f) 
end
main3()
```
とすると、
![loss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246113/5e987e64-ef0d-db4f-0a00-c3ad57824137.png)

こんな形になります。
その他、どのような設定ができるかは、
[公式の例](https://docs.makie.org/stable/reference/blocks/axis/#example_common_aspect_ratios)を見てください。