Mac で Julia #12 グラフを描く


前回に引き続きJuliaについてです。

[ドキュメント](https://docs.julialang.org/)に沿って試していきます。

今回はグラフを描画してみたいと思います。

## グラフを描く

### コマンドラインからグラフを描く

コマンドラインからグラフを描いてみたいと思いますが、コンソールでどうやって描けるんだろ？

PlotsとGRというパッケージを使います。

```sh
sh-3.2$ julia
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.0.0 (2018-08-08)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |

julia> import Pkg

julia> Pkg.add("Plots")
  Updating registry at `~/.julia/registries/General`
  Updating git-repo `https://github.com/JuliaRegistries/General.git`
 Resolving package versions...
  Updating `~/.julia/environments/v1.0/Project.toml`
 [no changes]
  Updating `~/.julia/environments/v1.0/Manifest.toml`
 [no changes]

julia> Pkg.add("GR")
 Resolving package versions...
  Updating `~/.julia/environments/v1.0/Project.toml`
 [no changes]
  Updating `~/.julia/environments/v1.0/Manifest.toml`
 [no changes]

julia> using Plots

julia> Plots.gr()
Plots.GRBackend()

julia> f(x)=sin(x)
f (generic function with 1 method)

julia> plot(f)

julia>
```

なんか画像がでました！GKSTermっていつのまにインストールされてたのか...

![gksterm.png](https://qiita-image-store.s3.amazonaws.com/0/51116/36e11148-3016-0d96-9f9b-7220e03864b3.png "gksterm.png")


調べたところ```~/.julia/packages/GR/fnyt8/deps/gr/Applications/GKSTerm.app```としてインストールされてました。

### Jupyter notebookでグラフを描く

おなじコマンドでうまくいました。

まず、Jupyter notebookを動かします。

```julia
julia> Pkg.add("IJulia")
 Resolving package versions...
  Updating `~/.julia/environments/v1.0/Project.toml`
 [no changes]
  Updating `~/.julia/environments/v1.0/Manifest.toml`
 [no changes]

julia> using IJulia

julia> IJulia.notebook()
```

コマンドラインのと同じコマンドをまとめて実行します。

![notebook.png](https://qiita-image-store.s3.amazonaws.com/0/51116/c38fa455-c84b-7bc1-1c0c-5ffc6a647ab7.png "notebook.png")

こちらもうまく描画できました。

## パッケージについて

PlotsとGRというパッケージはどういうのでしょう？

### Plotsパッケージ

[Plots](https://github.com/JuliaPlots/Plots.jl)

[Tutorial](http://docs.juliaplots.org/latest/tutorial/)はこちらです。

具体的にグラフを描くというパッケージなんですかね。

サンプルはこんな感じ

```julia
julia> using Plots

julia> x = 1:10; y = rand(10);

julia> plot(x,y)
```

![gksterm1.png](https://qiita-image-store.s3.amazonaws.com/0/51116/61307c5a-6da4-dde3-8eba-ed361a350d7e.png "gksterm1.png")


yを配列にすると2本のグラフも描けます。他にもプロパティを追加したサンプルです。

```julia
julia> x = 1:10; y = rand(10,2);

julia> plot(x,y,title="Two Lines",label=["Line 1" "Line 2"],lw=3)
```

![gksterm2.png](https://qiita-image-store.s3.amazonaws.com/0/51116/ab664792-f1ef-6193-c3cb-1f501d93d864.png "gksterm2.png")

既存の画像にプロパティを追加してみます。

```julia
julia> xlabel!("My x label日本語")
```

![gksterm3.png](https://qiita-image-store.s3.amazonaws.com/0/51116/a794dab1-98bb-1e87-5bf2-87654ec770f4.png "gksterm3.png")

X軸にラベルがでました、ただデフォルトだと日本語フォントではないらしく文字化けしました。

#### 画像を保存

```julia
julia> savefig("myplot.png")
```

GKSTermの画面が消えて画像が保存されました。

![myplot.png](https://qiita-image-store.s3.amazonaws.com/0/51116/d9f2c8b2-a30c-8f8a-e6fa-441e141b61f8.png "myplot.png")

なぜかフォントが違いますね。

#### Lorenz Attractor

[docs.juliaplots.org](http://docs.juliaplots.org/latest/)ではもっとすごいグラフのサンプルがあります。

```julia
# define the Lorenz attractor
mutable struct Lorenz
    dt; σ; ρ; β; x; y; z
end

function step!(l::Lorenz)
    dx = l.σ*(l.y - l.x)       ; l.x += l.dt * dx
    dy = l.x*(l.ρ - l.z) - l.y ; l.y += l.dt * dy
    dz = l.x*l.y - l.β*l.z     ; l.z += l.dt * dz
end

attractor = Lorenz((dt = 0.02, σ = 10., ρ = 28., β = 8//3, x = 1., y = 1., z = 1.)...)


# initialize a 3D plot with 1 empty series
plt = plot3d(1, xlim=(-25,25), ylim=(-25,25), zlim=(0,50),
                title = "Lorenz Attractor", marker = 2)

# build an animated gif by pushing new points to the plot, saving every 10th frame
@gif for i=1:1500
    step!(attractor)
    push!(plt, attractor.x, attractor.y, attractor.z)
end every 10
```

![tmp.gif](https://qiita-image-store.s3.amazonaws.com/0/51116/aa2161de-c4ed-2b12-8233-74490dc362be.gif "tmp.gif")

なんだかすごいです。

### GRパッケージ

Plotsのバックエンドとして実際の画像を生成するようです。可視化ライブラリっていうんですかね。


大元はここ[GR Framework](http://gr-framework.org)なのかな？

[Julia Package GR](http://gr-framework.org/julia.html)もドキュメント化されてます。


```julia
julia> Pkg.add("GR")
  Updating registry at `~/.julia/registries/General`
  Updating git-repo `https://github.com/JuliaRegistries/General.git`
 Resolving package versions...
  Updating `~/.julia/environments/v1.0/Project.toml`
 [no changes]
  Updating `~/.julia/environments/v1.0/Manifest.toml`
 [no changes]

julia> using GR

julia> histogram(randn(10000))
```

![gksterm4.png](https://qiita-image-store.s3.amazonaws.com/0/51116/02585f47-e08a-e02a-f1e4-6ec75cc234b3.png "gksterm4.png")


今日はこの辺で。