DISLIN解説①

 最近、C++でのグラフ描画のためにDISLIN(マックス・プランク研究所開発)を試していた私だが、C++からグラフを描くには多くの場合Gnuplotが選択されるようで、そうでない場合もROOT(CERN開発の統計解析ライブラリ)やせいぜいPLplot(多言語対応のグラフ描画ライブラリ)あたりが使われる。DISLINはどうやらほとんど普及していないようだ。
 私はGnuplotを長らく利用してきたからこそその混沌とした仕様にうんざりしているし、素粒子宇宙系に属しておりしばしば強制的に利用させられるからこそROOTなんぞゴミだとしか思っていないし、PLplotも依存関係が多く出来は半端だ。導入が簡単で依存ライブラリもなく機能もよく纏められているDISLINはC++プログラマにとっては一つの選択肢だと思っている。ただ致命的な問題があって、ラスター画像への出力が恐ろしく不得手であり、とても汚らしくなってしまう。これについてはもう、ベクター画像中心に使うのが正しい選択だと思っている(実はベクター画像にも多少問題があるのだが)。
 私はとうとうDISLINを使うのを諦めてしまったが(今はGnuplotをラップした自作ライブラリを使っている)、しかしツールとしての簡潔さと機能の豊富さには大きな魅力もあるし、使ってみたいと思う人が出てくるかもしれない。折角なのでこれを試す間に理解できたことなどをちょっとばかり纏めておこうかと思う。

1.1. ライセンスと環境について

 DISLINのライセンスは非商用と商用とがあり、非商用ライセンスはフリーで、販売を行わない個人または研究機関での用途であれば自由に利用してもよい。商用は費用が設定されており、販売などを目的とする場合はいくらか必要である。GPLとかではないので、非商用目的なら特に何も気にしなくていいはず。  DISLINは多様な言語(C/C++FortranPerlPythonJavaRuby、Tcl)とプラットフォームに対応している。私はVisual Studio 2017からC++で利用しているのでそれを想定して解説するが、他の言語でも理屈は同じである。

1.2. インストール

 Windows 64bit Visual Studio用は公式サイトのDownloads->Distributions->Windows 64-bit->dl_11_vc.zip。解凍後、setup.exeを実行してインストールすれば良い。ビルド済みの状態で配布されているので、面倒な作業は特になにもない。

1.3. 大まかなDISLINのルーチン

 DISLINのルーチンにはlevel0~3の段階があり、各段階でどのような設定を行うのかが厳密に定められている。DISLINのオンラインマニュアルには関数名の横にlevel1,2,3みたいな表示があるが、これはこの関数を呼び出すことのできるlevelを示している。
 各段階では大体次のような設定を行いつつ、必要な設定を終えたら特定の関数を呼び次の段階へ移動、または前段階へ戻る。

  • level0 ... まだ初期化されていない最初の段階。出力時のページフォーマット、ファイルフォーマットやファイル名など、初期化に必要なパラメータを与える。必要なパラメータを与えたらdisinit関数を呼ぶことで初期化し、level1に移行する。
  • level1 ... level1でないと呼べない関数というのは多くないが、境界線やページ塗りつぶし、各軸のラベルなどおおよそキャンバス全体の設定を行う箇所。grafなどの関数を呼ぶことで“どのような座標系でグラフを描くか”を明示し、level2または3に移行する。
  • level2 ... 2次元グラフの形状(線や点、シンボルなど)と具体的なデータ点などを与えるところ。普通の2次元グラフであればこのlevelまでで完結する。
  • level3 ... 3次元ないしカラーバー付きグラフを扱う段階。level1から直接こちらへ移行する。3D surfaceやカラーマップや色付き散布図、色付きvector fieldなどもここで設定する。共存可能なものなら、2次元グラフの関数も呼び出せるらしい。

 こんな面倒くさい設定したくない!って人のために、DISLINは簡略化された機能も用意している。詳しくはオンラインマニュアルのChapter 16: Quick Plotsを参照されたい。面倒な設定をすっ飛ばして、単にデータ点を与えるだけで描画してくれる便利機能の一覧である(たぶん)。

1.4. DISLINの利点、欠点

 DISLINはC++から利用できる数少ないグラフ描画ライブラリである。導入の手軽さは素晴らしいし機能も豊富で、他のライブラリにできてDISLINにできないことはほとんどないだろう。また英語のみだがドキュメントはきちんと纏められており、設定の組み合わせによる影響なども細かく触れてくれているため、隠れた仕様で悩むこともそうそうないだろう。
 ただし上述のように、ラスター画像がとても汚いという欠点がある。DISLINは線の描画がいい加減で、デフォルトではアンチエイリアスさえかかっていない。ラスター画像へのアンチエイリアス機能自体は存在するが、はっきり言って“ないよりはマシ”程度にしか改善しない。フォントは様々なものが用意されているけれども描画方法に問題があるためか輪郭が潰れてしまうので、Gnuplotのような美しい文字を表示するのは諦めたほうがよい。ベクター画像であればこうした劣化は起きないので気にすることはないが、しかしベクター画像ではAlpha Blendingを行えないので、半透明色を重ねていくような表現はできなくなる。
 また機能そのものはよくまとまっているものの、設計がどうにも古めかしく、オブジェクト指向が体に染み付いているC++プログラマから見て直感的とは言い難い。パレットが2色のペイントツールで曲線を一本一本描いていくかのように命令するのだ。
 総じて、見た目や使いやすさよりもとにかく“意図したようなグラフを描けるかどうか”を重視する場合は良い選択肢になるだろう。挙動の理解は難しくなく、理解してしまえば大体のことはできる。ただ出力される画像のクォリティには文句言うな。

 解説2へ。