JuliaでMATLABのようにグラフィックス オブジェクトを弄って作図する

普段MATLABで作図するとき, gcfgcaを使用して, グラフィックス オブジェクトを取得し, そいつらを直接いじってプロパティを変更することが多い. この方法は, 若干複雑だかシステマティックなのでストレスが少ない. Juliaはそんなに触らないが, 思い通りの図が描けると判っていないと不安を感じてしまうので, MATLABと同じようにグラフィックス オブジェクトを取得することで成形する方法をまとめた. 備忘録なので用語はかなり適当.


間違い・疑問点などあれば, ぜひコンタクトフォームへ連絡いただけると幸いです.

Julia Version 1.6.2

MATLABの例

特に詳しくは解説しないが, 公式サイト にあるように, MATLABでは図の情報が階層的に格納されている.

以下のような図の場合, figという変数に図の情報がデータまでも含めてすべて入っている.

name
MATLAB
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の下にはlinescatterがある. これらは, 左図ではマーカーを, 右図では2つのラインをしめしている.

例えばもし, 左図のscatterの情報が欲しかったり変えたかったりすれば, fig.Children(3).Children(1)をみればよい. ここで, fig.Children(3)が左の図全体 ( axis ) を, fig.Children(3).Children(1)がその下にいるscatterを指している. 以下のように, scatterのマーカーのサイズや性質, データが入っていることがわかる.

MATLAB
>> 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を使う. 例として, 公式サイト にある図を使う.

name
Julia
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がリストアップされている.

  1. Plot:Figureに相当. fig = gcf, fig = figure
  2. Subplot:Axesに相当. ax = gca or fig.Children(I)
  3. Series:Lineに相当. ax.Children, fig.Children(I).Children, p = plot(x)など.
加えて, JuliaにはAxisというものもあるようで, 公式ドキュメントを読む限りPlotの下のすべてのSubplotに共通のAttributeを設定することができるようである.

情報を見る

上に例示したプロットについて, 情報をみてみる. 上のコードでは, 図の情報をfigという変数に格納している. 以下に, いくつかの情報を取得する例を挙げる.

などなど.

例えば, fig.attrとすると以下のように図全体の情報がでてくる. dpiやサイズなど.

Julia
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
julia> fig[:dpi]
100

情報を変更する

図の情報を変えたければシンプルに値を代入すればよい.

例1:dpiを上げて, サイズを変えて保存

Julia
fig[:dpi]  = 600;
fig[:size] = (800, 300);
png("img2.png")
上に示した図は, 実際このような条件で保存した図である.

例2:右図のマーカーを半透明に ( アルファを0.3にする ) .

Julia
fig[2][1][:markeralpha] = 0.3
png("img3.png")

name

MATLABで図のプロパティを直接触っている人は馴染みやすいと思う.

この記事のTOP    BACK    TOP