木曜日, 7月 10, 2025
木曜日, 7月 10, 2025
- Advertisment -

Makie.jl入門


Juliaは学術目的で利用されることが多いため, 最終的には「論文に載せても恥ずかしくないクオリティ」のグラフが描けるパッケージが必要となります. そこで, 出版品質を目指して開発されたCairoMakie.jlを紹介します.

Makieについて

MakieはJulia言語の可視化ライブラリです. 名前の由来と読み方はGitHubリポジトリのREADMEに書いてあります. 名前の由来はなんと日本の蒔絵とのこと. 語感も込められた意味も素敵ですね.

Makie(マキエと発音します)という名前は, 漆に金銀粉を蒔く技法である日本語の「蒔絵」に由来しています. データは現代の金銀です. 画面上に美しく散りばめましょう!

https://github.com/MakieOrg/Makie.jl

選定理由

Plots.jlMakie.jlどちらを選ぶべきでしょうか? 私がMakieを選んだ理由は次の2つです.

  1. Plots.jlの使用経験から限界を感じたから
    私はJulia v1.0がリリースされた2018年頃からPlotsを使用していましたが, 2024年頃にMakieに移行しました. 理由は, Plotsで学会発表の予稿や論文に載せるクオリティを出すのにかなり苦労しており, 限界を感じていたためです.
  2. Makie.jlの方が人気も勢いもあるから
    私が『Plots.jl入門』を執筆した2021年時点ではPlotsの方が人気でしたが, 2023年頃に逆転したようです (出典: GitHub Star History). 既にMakieの方が人気も勢いもあり, 今後の成長が期待できると考えたためです.

そこで『Plots.jl入門』のMakie版として『Makie.jl入門』を執筆しました. ただし, Makieにおけるデータ構造を理解しやすくするために, 解説の順番は変えてあります.

インストール

次のコマンドをREPLまたはJupyter Notebookで実行して, CairoMakie.jlをインストールします. これは初回のみ行います.

import Pkg; Pkg.add("CairoMakie")

使用方法

次のコマンドを実行することで, REPLやJupyter Notebook上でCairoMakieが使用できるようになります. これは毎回行う必要があります.

Hello World!

lines()に描写範囲と関数を渡すことで描写できます. ここでは0..5sinを渡します.

自作関数を渡すこともできます. 関数の宣言方法はこちらをご参照ください.

f(x) = x^2
lines(0..5, f)

1行で書きたい時は無名関数(Anonymous Function)を渡します.

2つの配列を渡して, それぞれx軸とy軸の値として折れ線グラフや散布図を描くこともできます.

X = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Y = [0, 1, 0, 2, 0, 4, 0, 8, 0, 4, 4]

lines(X, Y)

2つの文法(重要)

以降の解説に先立ち, 2つの等価な書き方を紹介します.

前者の方が分かりやすいので, モチベーションのために最初に紹介しました. 後者は少し長くなってしまいますが, こちらの方がカスタマイズ性に優れており, データの構造がわかりやすくなっています. 最初は長ったらしくて慣れないかもしれませんが, グラフのサイズや軸ラベルなどデザインを指定したり, グラフを2つ並べたり, 重ねたりすると重要性が理解できます.

fig = Figure()
axis = Axis(fig[1,1])
lines!(axis, 0..5, sin)
fig

レイアウト編

グラフを重ねたり, 並べる方法を解説します.

グラフを重ねる

上記の2つの文法でグラフを重ねてみましょう. まずsincosを重ねてみます. ここで, 最初に!が付く関数は, push!([1,2,3], 4)のようにデータのサイズを変更する関数であるという意味です.

fig = lines(0..5, sin)
lines!(fig.axis, 0..5, cos)
fig

後者の文法では, 2つの関数が同じ方法で描写されるため, axisに追加していくということが直観的にわかりやすくなっています.

fig = Figure()
axis = Axis(fig[1,1])
lines!(axis, 0..5, sin)
lines!(axis, 0..5, cos)
fig

グラフを重ねるときは凡例を付けることが多いので, 凡例を表示する例も紹介しておきます.

fig = Figure()
axis = Axis(fig[1,1])
lines!(axis, 0..5, sin, label="sin(x)")
lines!(axis, 0..5, cos, label="cos(x)")
axislegend(axis, position=:rt)
fig

グラフを並べる

1つのFigureに対して4つのAxisを定義し, それぞれのAxisに描写する例です. このように, Axis(fig[i,j])でi行j列目のグリッドの軸を定義できます.

fig = Figure()

axis1 = Axis(fig[1,1])
axis2 = Axis(fig[1,2])
axis3 = Axis(fig[2,1])
axis4 = Axis(fig[2,2])

lines!(axis1, -5..5, sin)
lines!(axis2, -5..5, cos)
lines!(axis3, -5..5, exp)
lines!(axis4, -5..5, abs)

fig

for文でグラフを並べる例です.

fig = Figure()

for n in 1:9
  axis = Axis(fig[div(n-1,3)+1,rem(n-1,3)+1])
  lines!(axis, -5..5, x -> x^(n-1) * exp(-x^2))
end

fig

スタイル編

折れ線グラフ, 散布図, ヒストグラム, ヒートマップ, 3Dグラフの例を紹介します.

散布図

scatter()またはscatter!()に横軸の配列と縦軸の配列を渡します.

X = [1, 2, 3, 4, 5]
Y = [1, 4, 9, 16, 25]

scatter(X, Y)

ヒストグラム

hist()またはhist!()に配列を渡すことでヒストグラムを描くことができます.

X = [1, 2, 3, 3, 4, 5, 5]

hist(X)

normalization=:pdfというオプションによって総面積が1に規格化されたヒストグラムを描くことができます. ここでは, randn(100000)によって標準正規乱数100000個を含む配列を作り, 確率密度関数f(x) = \exp(-x^2/2)/\sqrt{2\pi}と比較しています.

R = randn(100000)
fig = Figure()
axis = Axis(fig[1,1])
hist!(axis, R, bins=50, normalization=:pdf)
lines!(axis, -5..5, x -> exp(-x^2/2)/sqrt(2*pi), color=:black)
fig

ヒートマップ

heatmap()またはheatmap!()にx軸とy軸それぞれの定義域と, 2変数関数fを渡すことで描写でっきます. 配色についてはこちらを参照してください.

f(x,y) = x^2 + y^2

heatmap(-3:0.01:3, -2:0.01:2, f)

2次元配列を渡すこともできます. このとき, 軸は配列の添え字になります.

Z = randn(30,20)

heatmap(Z)

X軸とY軸に相当する1次元配列を渡すこともでき, これによって目盛りの数値が上記と異なる値になります.

X = [0.1*i for i in 0:30]
Y = [0.1*i for i in 0:20]
Z = randn(31,21)

heatmap(X, Y, Z)

3Dグラフ

基本的な使い方は上記のheatmapsurfaceに置き換えるだけです. ただし, axis=(type=Axis3,)というオプションを入れてください.

f(x,y) = x^2 + y^2

surface(-3:0.01:3, -2:0.01:2, f, axis=(type=Axis3,))

デザイン編

全てのオプションはこちらに載っています. ここでは, よく使うものをピックアップして紹介します.

文字列

フォントサイズは全てFigure()fontsizeオプションで一括して指定し, タイトルや軸ラベルなど, 強調したいものだけ個別に変更すると楽です.

説明 渡し先 オプション 引数例
タイトル Axis title “title”
x軸ラベル Axis xlabel “ylabel”
y軸ラベル Axis ylabel “xlabel”
全てのフォントサイズ Figure fontsize 11
タイトルのフォントサイズ Axis titlesize 17
x軸ラベルのフォントサイズ Axis xlabelsize 15
y軸ラベルのフォントサイズ Axis ylabelsize 15

凡例はデフォルトでは非表示ですが, axislegend()で追加することができます. また, グラフ内に文字列を追加する場合はtext!()を使用します.

説明 渡し先 オプション 引数例
凡例のラベル lines!, scatter!, … label “label”
凡例の位置 axislegend position :rt, rb, :lt, :lb
凡例のフォントサイズ axislegend labelsize 11
凡例の囲み線 axislegend framevisible false, true
fig = Figure(
  fontsize = 11,
)

axis = Axis(
  fig[1,1],
  title = "title",
  xlabel = "xlabel",
  ylabel = "ylabel",
  titlesize = 17,
  xlabelsize = 15,
  ylabelsize = 15,
  xticks = ([0,1,3], ["A","B","C"]),
)

lines!(axis, -3..3, sin, label = "label")

axislegend(axis, position=:lt)

text!(axis, -pi/2, -1, text=   "min", align=(:center,:bottom))
text!(axis,     0,  0, text="origin", align=(:center,:center))
text!(axis,  pi/2,  1, text=   "max", align=(:center,:top))

text!(axis, -1, 0.5, text="aaaaa")

text!(
  axis,
  [pi/2, pi/2, pi/2],
  [0.0, 0.1, 0.2],
  text = ["a","b","c"],
  rotation = [0, 45, 90],
  align = (:center,:center),
)

fig

デザイン

線の種類・太さ・色, マーカーの形・大きさ・色は次のように設定できます.

説明 渡し先 オプション 引数例
線の種類(実線, 破線等) lines! linestyle :solid, :dot, :dash, etc.
線の太さ lines! linewidth 1, 2, 4
線の色 lines! color :red, :blue, :black, “#FF0000”
マーカーの形 scatter! marker :circle, :rect, :diamond, :cross, :xcross, etc.
マーカーの大きさ scatter! markersize 20
マーカーの色 scatter! markercolor :red, :green, :blue, “#FF0000”
fig = Figure()
axis = Axis(fig[1,1])
lines!(axis, 0..5, sin, linestyle=:dash, linewidth=4, color=:black)
scatter!(axis, 0..5, cos, marker=:cross, markersize=10, color="#FF0000")
fig

応用編

実用上, 必要になることが多い内容を補足します.

PlotsからMakieへの移植

下記のリポジトリでは, 色々なグラフを題材にPlotsとMakieの両方でコードを作成し, 出力の比較を行いました. これを元に上記の記事の移植を行いました. PlotsからMakieへの移植を検討している方, コード例だけで十分な方はこちらのリポジトリをご覧ください.

https://github.com/ohno/Plots-Makie

保存

以下のようにsave()にファイル名とFigureオブジェクトを渡すことで保存できます. ファイル名の中の拡張子で自動的に保存されます.

fig = lines(0..5, sin)
save("./figure_01.png", fig)
save("./figure_01.svg", fig)
save("./figure_01.pdf", fig)

論文で使うには

グラフをLaTeXで使うには\usepackage{graphicx}の読み込みが必要です. .pdfで保存して\includegraphicsで読み込みましょう. .svgはブラウザでは綺麗に表示されますが, PDFでは表示できないことが多々あったので諦めました.

\begin{figure}[h]
  \centering
  \includegraphics[width=80mm,pagebox=cropbox,clip]{./figure_01.pdf}
  \caption{hello}
\end{figure}

実際に動いている例はOverleafをご覧ください.

https://ja.overleaf.com/read/hpbnjwznryct#d5a7a9

引用方法

Makieを使うときはこちらのBibTeXを使用してください. これもOverleafで実際に動いている例がご覧いただけます.

https://github.com/MakieOrg/Makie.jl/blob/eb1ad5b7dfef3b93106760e2b5a1ca59495c0dc9/DanischKrumbiegel2021.bibtex

テンプレート

綺麗なグラフのテンプレートを用意しました.

fig = Figure(
  size = (420,300),
  fontsize = 11,
  backgroundcolor = :transparent,
)

axis = Axis(
  fig[1,1],
  limits = (0, 5, 0, 50),
  title = "Title",
  xlabel = L"x",
  ylabel = L"y",
  titlesize = 16.5,
  xlabelsize = 16.5,
  ylabelsize = 16.5,
  backgroundcolor = :transparent,
)

lines!(
  axis,
  0..5,
  x -> x^2,
  label = L"y = x^2",
  color = "#224466",
)

lines!(
  axis,
  0..5,
  x -> x^3,
  label = L"y = x^3",
  color = "#BC1C5F",
)

axislegend(
  axis,
  position = :rt,
  framevisible = false
)

fig

論文誌のガイドライン

図の細かい設定は投稿先のガイドラインに従ってください. 物理系を中心にピックアップしました:

まとめ

CairoMakie.jlの選定理由 (GitHub Star History), Plots.jl入門 と同等の解説 (Google Colab), Plots.jlからの移植例 (GitHub), 論文での使い方 (Overleaf), 引用方法 (BibTeX), 論文誌のガイドライン集を紹介しました. CairoMakie.jlは高品質なグラフを簡単に作成できる強力なツールです. ぜひ試してみてください.

動作環境

Julia Version 1.10.9
Commit 5595d20a287 (2025-03-10 12:51 UTC)
Build Info:
  Official https://julialang.org/ release
Platform Info:
  OS: Linux (x86_64-linux-gnu)
  CPU: 2 × Intel(R) Xeon(R) CPU @ 2.20GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-15.0.7 (ORCJIT, broadwell)
Threads: 2 default, 0 interactive, 1 GC (on 2 virtual cores)
Environment:
  LD_LIBRARY_PATH = /usr/local/nvidia/lib:/usr/local/nvidia/lib64
  JULIA_NUM_THREADS = auto

関連記事

https://docs.makie.org/dev/reference/plots/overview

https://beautiful.makie.org/dev/

https://akitoshiblogsite.com/julia-cairomakie-install/

https://qiita.com/cometscome_phys/items/38ac9a89b96579b6a34b

https://qiita.com/cometscome_phys/items/40f2c5d067ea44d6a8b1

参考文献

https://github.com/MakieOrg/Makie.jl

https://docs.makie.org/stable/

https://zenn.dev/ohno/articles/3101433fbe9231

https://github.com/ohno/Plots-Makie

この記事の元となったノートブックはこちらにあります. Google Colabで実際に動かすことができるのでお試しください.

https://colab.research.google.com/drive/1gKg4Y2s4CIZ_D6cKr2GQQLm8IiwXBfcL?usp=sharing



Source link

Views: 0

RELATED ARTICLES

返事を書く

あなたのコメントを入力してください。
ここにあなたの名前を入力してください

- Advertisment -