[C++][ADAPT]2次元ヒストグラム、3Dの追加。Gnuplotライブラリ更新(2)。

タイトルのとおりである。前回は1次元の一般的なヒストグラムを実装したが、今回は2次元の方を追加した。と同時に、その周辺での色々な設計の整理を行った。

プロット機能の詳細はこちらへ
GitHubリポジトリはこちらへ

2次元ヒストグラム(binscatter)の実装

PlotBinscatterという関数を追加した。これは散布図を描くのと似たようなものだが、その点の密度を色として表示するものである。2個のモードがあり、デフォルトでは一般的なカラーマップによる2次元ヒストグラムになり、もしplot::bs_pointsというオプションを与えると各点に密度に対応する色を割り当てた散布図になる。ただし前者の場合、エントリー数0の空のビンは白色で表示される。空のビンも0に対応する色で塗りつぶしたい場合はplot::bs_no_lowlimをオプションとして与える。
添付図は全く同じデータを、デフォルトのカラーマップ(左)、plot::bs_pointsを与えた色付き散布図(右)でプロットし比較したものである。若干異なるのが分かるだろうか。コードはこちらのexample_binscatterを参照

現状、色は単純にビンで区切ってその中に収まるデータ点の数を与えているだけである。昔は色付き散布図の場合にはカーネル密度推定を用いて大雑把にスムージングしていたこともあったが、使う予定がないので現時点で未実装だ。気が向いたら作ることもあるかもしれない。

CanvasCMの廃止とCanvas2Dへの統合

前回更新でも少し触れたことだが、カラーマップの表示方法をpm3dではなくimageで行うように変更し、これによりCanvasCMの存在意義が消失したためCanvas2Dへと一本化した。使い方は以前と変わっておらず、単にCanvasCMを使っていたところを機械的にCanvas2Dへと置き換えれば動作するはずである。動かなかったらバグ報告を。

ちなみに、pm3dからimageへと変更したことによる副次効果で、PlotColormapに与えるデータのzの値をNaNにするとカラーバーの色を無視して白で表示されるようになった。上のPlotBinscatterで空のビンを白抜きで表示するとき、この挙動を利用している。……もしこれがGnuplotのバグに近い特殊な挙動だったりすると、将来的に使えなくなったりするかもしれないが。

Canvas3Dの追加

上で廃止したCanvasCMだが、丸ごと処分してしまうのはちょっと勿体なかったので、Canvas3Dへと転生させた。今までのCanvasCMは実質、内部でset views mapというコマンドを実行し3Dを真上から見下ろす形にしていただけなので、実質的にはset views mapを削除し、ちょっと機能を足した程度の変更である。

なおCanvas3Dのみの機能としてPlotSurfaceを用意した。Colormapと似ているが、曲面の表面をグリッド線、等高線等を組み合わせて表示するものである。コード例はこちらのexample_surfaceに

余談

学会発表が終わってから一息つく間もなく、学会直線に行った解析で発見された不可解なデータを調べてみようとしたところで、どうしても2次元ヒストグラムが欲しくなってしまい、大急ぎで実装した。とはいえ、基本機能が揃っていたのでそれほど大変な作業ではなかった。

ADAPT本体の方のSIMD対応作業が大分進んで、Join周辺を除けばテストもクリアしている。とはいえADAPTにおいてはJoinこそが最大の難敵なので、これを突破できるかどうかだ。
そんなわけで、本体の更新は緩やかに進行しているもののなかなか公開できる状況ではなく、おまけ程度のつもりでくっつけたグラフ描画機能ばかりが更新されている。SIMDの方は高速化を目的としたものなので現状必須ではなく、どちらかと言えば私の自己満足に近いものであるのに対し、グラフの方は私の研究の中で要求されるため実装せざるを得ないのである。

学会前があまりに忙しかったのでしばらく放置気味だったが、その発表も終わって以前の日々が戻ってきたので、今のうちにもう少し開発を進めたいところだ。