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 = gcaorfig.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で図のプロパティを直接触っている人は馴染みやすいと思う.