Juliaは学術目的で利用されることが多いため, 最終的には「論文に載せても恥ずかしくないクオリティ」のグラフが描けるパッケージが必要となります. そこで, 出版品質を目指して開発されたCairoMakie.jlを紹介します.
Makieについて
MakieはJulia言語の可視化ライブラリです. 名前の由来と読み方はGitHubリポジトリのREADMEに書いてあります. 名前の由来はなんと日本の蒔絵とのこと. 語感も込められた意味も素敵ですね.
Makie(マキエと発音します)という名前は, 漆に金銀粉を蒔く技法である日本語の「蒔絵」に由来しています. データは現代の金銀です. 画面上に美しく散りばめましょう!
選定理由
Plots.jlとMakie.jlどちらを選ぶべきでしょうか? 私がMakieを選んだ理由は次の2つです.
- Plots.jlの使用経験から限界を感じたから
私はJulia v1.0がリリースされた2018年頃からPlotsを使用していましたが, 2024年頃にMakieに移行しました. 理由は, Plotsで学会発表の予稿や論文に載せるクオリティを出すのにかなり苦労しており, 限界を感じていたためです. - 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..5
とsin
を渡します.
自作関数を渡すこともできます. 関数の宣言方法はこちらをご参照ください.
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つの文法でグラフを重ねてみましょう. まずsin
とcos
を重ねてみます. ここで, 最初に!が付く関数は, 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個を含む配列を作り, 確率密度関数
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グラフ
基本的な使い方は上記のheatmap
をsurface
に置き換えるだけです. ただし, 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への移植を検討している方, コード例だけで十分な方はこちらのリポジトリをご覧ください.
保存
以下のように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をご覧ください.
引用方法
Makieを使うときはこちらのBibTeXを使用してください. これもOverleafで実際に動いている例がご覧いただけます.
テンプレート
綺麗なグラフのテンプレートを用意しました.
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
関連記事
参考文献
この記事の元となったノートブックはこちらにあります. Google Colabで実際に動かすことができるのでお試しください.
Views: 0