scientific computingと言えば可視化、すなわちプロットが大事なのは周知のことだが、可視化はscientific computingの中でも高レベルな1処理だ。 いくら計算が速くても、可視化の作業が大変な点でCやLuaは使いづらいと感じた。 その点Julia2は、高機能で文献も豊富なプロットパッケージを持っており、scientific programming languageとして申し分ない3

そんなJuliaには主なプロット用パッケージとして、Plots.jlMakie.jl4 があるが、それぞれ複数のバックエンドを選択でき、それらの違いを調べていると思ったより面白かったのでここにメモしておくことにした。 なお前半は普通、後半はややマニアックな内容になっている。

Juliaのplottingパッケージの概要

Plots.jlMakie.jlの違いを簡単に書くと、

  • Plots.jlはJuliaに限らずメジャーなplottingバックエンドの共通ラッパー
  • Makie.jlはJuliaで書かれたグラフィックライブラリを用いたパッケージ

といった感じである。

以下、それぞれの特徴を具体的にまとめる。

Plots.jl

基本的なことはなんでもできる。 バックエンドの選択肢が豊富だが、その違いをほとんど気にせずに共通の記述を用いることができる。 バックエンドの選択肢はbackendsに載っているが、 出力したいファイルのフォーマット、および処理の重さでおおよそ選ぶことができる。 主要なもの5を挙げると

name実装に使われてる言語特徴
GRC速い、基本
Plotly/PlotlyJSJavaScriptインタラクティブ、高機能、重い
PyPlotPython, C高機能
PGFPlotsXPGF/TikZ (on TeX)TeXとコンシステントな見た目、重い、依存関係が複雑6
UnicodePlotsJuliaアスキーアート、軽い、REPLで完結する、面白い

上3つは正統派といった感じで、Julia for VS Codeでも問題なくプレビューができる(第2カラムに自動で出てくる)。 下2つは個人的な印象だが、ネタというか用途が限られると思った。 PGFPlotsXはとても重く、また、TeX Liveが入っている環境なので問題なく動いたが、依存関係も複雑なのであまり実用的ではない7。 フォントやその他スタイルをTeXっぽくする方法は他でもあり8、数式はraw$\pi$を使ったり、 LaTeXStringsL"\pi"を使えば(バックエンドがTeXなのかMathJax等なのかは知らないが)、 GRでも問題なく表示できる9

出力の形式とサポートするバックエンドについてはSupported output file formats に載っている。10

Makie.jl

Plots.jlが既存のグラフィック/プロッティングバックエンドを使用していたのに対し、Makie.jlはバックエンドも含め全てJuliaで書かれている。 バックエンドの説明はBackendsに載っている。 纏めると

nameグラフィックライブラリ特徴・注意点
GLMakie.jlOpenGLGPUを使った処理ができる。インタラクティブなウィンドウが出てくる。出力でベクターグラフィックは出ない。
CairoMakie.jlCairoインタラクティブではない。svgなどの出力用。
WGLMakie.jlWebGLブラウザで使う用。
RPRMakie.jlRadeonProRenderレイトレーシング。試験段階

私は、GLMakie.jlしか使ったことがないが、独立したウィンドウに描画する以上、VS Code内でのプレビューはできなかった。 全体的な印象としては、まだそれほど触ったことがないため間違っているかもしれないが、普通の用途ではPlots.jlよりもバックエンドの選択による制約が大きく、 使いづらいと感じた。 しかし、Plots.jlよりも高機能ではあり、例えば色の透明度を扱うことができる。

これまではPlots.jlMakie.jlのみを紹介してきたが、他にもPlots.jlで出てきたそれぞれのバックエンドの純粋なJuliaラッパーも存在している。 Plots.jlはあくまで複数のバックエンドで共通の機能が主に扱われているので、Plots.jlでは除かれた機能 (例えばPlotlyJS.jl11では色の透明度や3Dプロットのアスペクト比などの変更) を用いることができる。 既にmatplotlib.pyplotplotlyに慣れてる人はこれらのほうが使いやすいかもしれない。

バックエンド自身についての雑記

さて、これまではJuliaからプロットをするという観点で記述してきたが、今度はこれまで出てきたバックエンド自身とその周辺に焦点を当てていく。 とりあえずGRが調べて面白かったので、まずはGRについて纏め、後で気が向いたらほかのバックエンドについても追記する。

GR

GRという単語のsearchabilityが低いので若干探すのが大変だが、GRの説明をGR Frameworkから引用すると、

GR is a universal framework for cross-platform visualization applications. It offers developers a compact, portable and consistent graphics library for their programs.

とある。 さらにAbout the GR Frameworkには、

GR is essentially based on an implementation of a Graphical Kernel System (GKS) and OpenGL. As a self-contained system it can quickly and easily be integrated into existing applications (i.e. using the ctypes mechanism in Python or direct calls from Julia with ccall syntax).

とあるように、Julia以外にも、Pytonなどで使うことができる。 その下の図を引用すると、

GR structure
  • Python, Julia, C/C++, Swift等々から使うことができ、
  • バックエンドはGKS(Graphical Kernel System)およびOpenGL(⊃WebGL)
  • GKSはQt, wx, TikZ, OpenGLなどのドライバがある
  • (GR3は3D)

他のドキュメントから、

  • C, Python, Juliaだけでなく、Fortran, JavaScript, Rubyなどからの使用も考えられてる。
  • Matplotlibのバックエンドとして使うことができる
  • LIGOに使われた
  • ドイツの研究所がメインで作られた

纏めると、GRは様々な言語からの使用でき、GKSという規格を通して様々な出力が可能なフレームワークであることが分かった。 そして、Juliaのwrapper GR.jlはこのGR Frameworkの一環で作られたものの1つだった。

冒頭でCやLuaはプロット用のツールがあまりないと書いたが、 C用のAPIがあるということは、CやLuaからも簡単に使用できるかもしれないことが分かったので、いつか試してみたい12

感想

思ったよりも複雑なフレームワークだったが、ブラウザや独立のウィンドウから特に指定しなくても見ることができていたように、 複数の出力ができるのは当たり前といえば当たり前だった。 特に記述する必要なくよしなに表示してくれるPlots.jlのAPIの高レベルさを改めて感じた。

ROOT

https://root.cern.ch/

CERNが作った高エネルギー物理で使われてるデータ解析、可視化フレームワーク。

C++ベース(LLVM)のインタプリタ(!?)13があったり、データの前処理から含めた総合的なフレームワークのようだ(GUIもある)。 インストールが面倒そうで複雑そうなので使っていない。 Juliaのラッパーも存在する(ROOT.jl)。


  1. CPUの処理の近さの文脈 ↩︎

  2. which I recently hooked on ↩︎

  3. もちろんPythonやRもまた然り ↩︎

  4. Makieは日本語の"蒔絵"由来らしいが、“まきえ"と発音してる人を見たことがない ↩︎

  5. 触ったことのあるもの ↩︎

  6. .tex出力もできるらしいが、試したことがない ↩︎

  7. とはいえバックエンドでTeXを使うプログラムも幾つか使ってるので、TeXを使う以上このようなアプローチになるのは仕方がないのだろう ↩︎

  8. https://discourse.julialang.org/t/nice-fonts-with-plots-gr-and-latexstrings/60037 ↩︎

  9. LaTeXStringsは他のStringと結合することができるので、例えばグラフ中に変数を参照して埋め込むこともできるが、(horizontal, vertical)spacingが変になる ↩︎

  10. unicodeplotsでtextを出力すると、ターミナルでの色を指定するエスケープシーケンスもついてきて驚いた。 ↩︎

  11. https://plotly.com/julia/, http://juliaplots.org/PlotlyJS.jl/stable/ 参照 ↩︎

  12. ドキュメントがPlots.jlMatplotlibPlotlyJSに比べると少なく、使いやすいわけではなさそうではある ↩︎

  13. Clingといい、だいたいC++のインタプリタになっており、Jupyter kernelもあるらしい(https://github.com/root-project/cling, https://github.com/jupyter-xeus/xeus-cling↩︎