JuliaでMATLABのようにグラフィックス オブジェクトを弄って作図する
最終更新:2021/08/15
普段MATLABで作図するとき, gcf
やgca
を使用して, グラフィックス オブジェクトを取得し, そいつらを直接いじってプロパティを変更することが多い.
この方法は, 若干複雑だかシステマティックなのでストレスが少ない.
Juliaはそんなに触らないが, 思い通りの図が描けると判っていないと不安を感じてしまうので, MATLABと同じようにグラフィックス オブジェクトを取得することで成形する方法をまとめた.
備忘録なので用語はかなり適当.
間違い・疑問点などあれば, ぜひコンタクトフォームへ連絡いただけると幸いです.
Julia Version 1.6.2
MATLABの例
特に詳しくは解説しないが, 公式サイト にあるように, MATLABでは図の情報が階層的に格納されている.
例
以下のような図の場合, fig
という変数に図の情報がデータまでも含めてすべて入っている.
fig = figure; subplot(121) scatter(rand(1, 30), rand(1, 30)) xlabel('X'); ylabel('Y') subplot(122) x = 0:0.01:pi; plot(x, sin(x));hold on plot(x, cos(x)); legend('sin', 'cos', 'Box', 'off') xlabel('X'); ylabel('Y')
このfig
をもちいての図の弄くり方は
この記事
にあるので, そちらもみてもらいたいが, トップにfig
があり, その下に ( Childとして ) axis
( 今回の場合左右2つの図と凡例 ) がある.
さらに axis
の下にはline
やscatter
がある.
これらは, 左図ではマーカーを, 右図では2つのラインをしめしている.
例えばもし, 左図のscatterの情報が欲しかったり変えたかったりすれば, fig.Children(3).Children(1)
をみればよい.
ここで, fig.Children(3)
が左の図全体 ( axis ) を, fig.Children(3).Children(1)
がその下にいるscatterを指している.
以下のように, scatterのマーカーのサイズや性質, データが入っていることがわかる.
>> fig.Children(3).Children(1) ans = Scatter with properties: Marker: 'o' MarkerEdgeColor: 'flat' MarkerFaceColor: 'none' SizeData: 36 LineWidth: 0.5000 XData: [1×30 double] YData: [1×30 double] ZData: [1×0 double] CData: [0 0.4470 0.7410] Show all properties
Juliaで同じことをする
Plots.jlを使う. 例として, 公式サイト にある図を使う.
t = range(0, stop = 1, length = 100) θ = (6π) .* t x = t .* cos.(θ) y = t .* sin.(θ) p1 = plot(x, y, line_z = t, linewidth = 3, legend = false) p2 = scatter(x, y, marker_z = (+), color = :bluesreds, legend = false) fig = plot(p1, p2)
基本的には, 上のコードにあるようにfig = plot(p1, p2)
のように変数に図を渡せばいいようである.
この中で, Attributes
をいじれば図の情報がとれるよう.
Attributesは, 上から以下のような階層構造になっている.
それぞれのAttributeについて, 対応する要素をMATLABで取得する一般的な方法を右側に示している.
また, リンク先には, 全Attributeがリストアップされている.
- Plot:Figureに相当.
fig = gcf
,fig = figure
- Subplot:Axesに相当.
ax = gca
orfig.Children(I)
- Series:Lineに相当.
ax.Children
,fig.Children(I).Children
,p = plot(x)
など.
情報を見る
上に例示したプロットについて, 情報をみてみる.
上のコードでは, 図の情報をfig
という変数に格納している.
以下に, いくつかの情報を取得する例を挙げる.
- Plot ( 図全体の情報 ) :
fig.attr
- 左図の情報 ( subplot1 ) :
fig[1].attr
- 右図の情報 ( subplot2 ) :
fig[2].attr
- 左図のラインの情報 ( Series ) :
fig[1][1]
例えば, fig.attr
とすると以下のように図全体の情報がでてくる.
dpiやサイズなど.
julia> fig.attr RecipesPipeline.DefaultsDict with 30 entries: :dpi => 100 :background_color_outside => :match :plot_titlefontvalign => :vcenter :warn_on_unsupported => true :background_color => RGBA{Float64}(1.0,1.0,1.0,1.0) :size => (400, 200) :inset_subplots => nothing :display_type => :auto ⋮ => ⋮
実際は, 特定の情報をみることが多いと思う ( 公式サイトのAttribute一覧を参考にして ) . そのときは, 以下のように指定できる.
julia> fig[:dpi] 100
情報を変更する
図の情報を変えたければシンプルに値を代入すればよい.
例1:dpiを上げて, サイズを変えて保存
fig[:dpi] = 600; fig[:size] = (800, 300); png("img2.png")
例2:右図のマーカーを半透明に ( アルファを0.3にする ) .
fig[2][1][:markeralpha] = 0.3 png("img3.png")
MATLABで図のプロパティを直接触っている人は馴染みやすいと思う.