#author("2022-10-21T16:19:36+09:00","default:Miyashita","Miyashita") #author("2022-10-21T16:20:46+09:00","default:Miyashita","Miyashita") *Plots メモ [#p2e2f2c3] #contents **Plots について [#occbadc0] Julia には様々な図の作成方法があるらしい.~ その中で Plots は,他の描画ツールをバックエンドとして,Plots の文法で図を作成するというもの.~ メリットは,同じコードでもバックエンドを切り替えるだけで雰囲気の違う図が作成できる点.~ バックエンドを切り替えてみて,見栄えの良い図をその都度選べる.~ 下記リンクにあるように,(ほぼ)同じ文構造で図を作成できる. -[[GR バックエンド>https://docs.juliaplots.org/latest/gallery/gr/]]~ -[[PyPlot バックエンド>https://docs.juliaplots.org/latest/gallery/pyplot/]]~ -[[PlotlyJS バックエンド>https://docs.juliaplots.org/latest/gallery/plotlyjs/]]~ MATLAB や Python の matplotlib に近いので,これらに慣れていれば学習コストはあまり大きくならないかと.~ ただし,PyPlot というパッケージがあるので matplotlib 以外に興味がない人は新たに Plots に手をつける必要もなさそう.~ ~ ~ **図作成の基本 [#oe847565] Plots の図の書き方は原則2種類ある.~ plot で始まり,seriestype (linetype) 引数でスタイルを指定するか,そのまま scatter や contour などと書くかの2つ.どちらが良いかは好みの問題. #codeprettify(lang-julia){{ using Plots }} を宣言して,scatter は #codeprettify(lang-julia){{ plot(x, y, seriestype=scatter) # or scatter(x,y) }} contour は #codeprettify(lang-julia){{ plot(X, Y, Z, seriestype=contour) # or contour(X,Y,Z) }} という感じ.バックエンドによってはできないスタイルもある.~ (呼び出しているだけであり,バックエンド本体の範疇を超えることはない)~ contour や surface 系の平面図については,MATLAB や matplotlib とは異なり,~ X, Y がベクトル(Vector, Array{T,1})でなければならない点に注意.%%2次元配列 (Array{T,2}) ではエラーになる.%%←昔はそんな気がしたがそんなことなかった.あとバックエンドにもよるっぽいことがわかった.~ ~ ~ **体裁の整え方 [#z525e4e4] #codeprettify(lang-julia){{ plot(; color=(:plasma), xlims=(0,1), ylims=(0,1), label="Line 1", title="Figure", xlabel="X-axis") }} のように plot のキーワード引数を使う方法と #codeprettify(lang-julia){{ plot(...) xlims!(0,1) ylims!(0,1) }} または #codeprettify(lang-julia){{ plt = plot(...) plt = plot!(plt, xlims=(0,1), ylims=(0,1)) }} のように後付けする方法がある.~ [[Attributes>http://docs.juliaplots.org/latest/attributes/]] で,キーワード引数と入力の対応関係が確認できる.~ 引数の型が Tuple か普通の Array かよくわからなくなった時はこれを読む.~ ~ ~ **線やマーカーの色の取得 [#gc85472d] 線やマーカで使う(:auto で決まる)色を予め取得する場合.~ #codeprettify(lang-julia){{ c = palette(:auto) }} のようにする.~ ~ ~ **マーカーの設定 [#ge62e820] キーワード引数は marker (m や mark)でなんだけど,設定がややこしい. キーワード引数は marker (エイリアスの m や mark も可)で,設定が若干ややこしい. #codeprettify(lang-julia){{ scatter!(plt, x, y; marker=(:magenta, 0.8, Plots.stroke(1, :green))) }} [[Attributes>https://docs.juliaplots.org/latest/attributes/#marker]] を参照. ~ ~ **複数の図を1枚に表示 [#s41fa3df] 別々に作成した Plots.Plot 型の図を subplot のように使う.~ 事前にレイアウトを決定する必要がなく,後で決められるのが便利.~ pltA と pltB を並べる時は #codeprettify(lang-julia){{ # pltA::T, pltB::T where T <: Plots.Plot を 2x1 (縦 x 横) に並べる plts = plot(pltA, pltB, layout=(2,1), size=(600,600)) }} 結合した図の大きさはキーワード引数 size を使って調整する.~ この結合を複数回行うことで,(n x m) に限らず任意の配置で図が作れる.~ ただし,バックエンドによっては対応していなかったり図がぐちゃぐちゃになる.GR は大丈夫. ~ ~ **(GR) リモートサーバーでの出力エラー [#c14aa673] ssh で入っているコンピュータに対して処理をしたい時に,表示できないというようなエラーが出てくる.~ 画像ファイルとして出力しようにも,このエラーによって阻まれてしまう. #codeprettify(lang-julia){{ ENV["GKSwstype"]="nul" }} または #codeprettify(lang-julia){{ ENV["GKSwstype"]=100 }} とすると,エラー回避できる. ~ ~ **余白(margin)の設定 [#r1c6f0d5] キーワード引数 margin を使う.~ 4つのそれぞれの margin を指定したければ,bottom_margin, top_margin, left_margin, right_margin をキーワード引数にする. #codeprettify(lang-julia){{ plt = plot(; margin=Plots.Measures.Length(:mm, 10.0)) # 10mm }} ~ いつのバージョンからかはわからんが(確認が面倒くさい),Plots.Measures は Plots.PlotMeasures になった. #codeprettify(lang-julia){{ plt = plot(; margin=10*Plots.PlotMeasures.mm) # 10mm }}