Eplot: Emacsでチャートを作る新しいパッケージ
(lars.ingebrigtsen.no)- eplot は、Emacs 内で数値データから簡単なチャートを描くためのパッケージで、
chart.elと Org/Gnuplot の組み合わせにおける軸表示と使い勝手の限界を出発点としている - 最大の課題は Y軸の目盛り で、1・2・5 系列の見やすい数字と極端なスケール・時間区間を自然に処理する必要がある
- 既存の PHP チャートライブラリの経験を Emacs Lisp に移し、SVG ベースのグラデーションやダークモードのような表現を実装したが、ピクセル単位の処理が必要な一部の効果は除外された
- 数字が多いバッファで
M-x eplotを実行するとチャートバッファが開き、headers とC-c C-cで設定を素早く変更して結果を確認できる - コードは GitHub で公開されたが、1週間にわたってテストケース中心で急いで書かれた 作業中のコード であり、コードパスの整理と可読性の改善がまだ残っている
Emacs の中で直接チャートを描こうとした理由
- 簡単なプロットを手軽に作る方法を長く探していて、映画の評価に関する記事を書く際に Emacs 内蔵の
chart.elを使ってみた chart.elは Emacs に含まれているが、もともとeieioのテストツールから出発した機能であり、活用範囲は 限定的 だった- 必要な作業はおおむね可能だったが、とくに Y軸表示 には満足できなかった
チャートの品質を左右する軸の目盛り
- 悪い軸表示は目につきやすいが、実際に自然なものを作るには多くの境界事例を慎重に扱う必要がある
- Google Finance も以前は、最大値を Y軸の最上段の目盛りに置き、原点方向へ同じ間隔の線を追加する 不自然な軸 を使っていた
- このようなチャートは 2021 年ごろまで存在していたと記憶している
- その後、サイト全体を再実装したことで、より良い軸を持つようになった
- 1997 年ごろに証券会社で働きながら chart library を実装した経験がある
- 軸目盛りの問題は難しい数学の問題というより、見栄えの良い数字と例外的な範囲を細かく選ぶ問題に近い
- 見やすい数字はたいてい 1, 2, 5 のさまざまなスケールで構成される
- 株価チャートでは
$0.00001~$0.00002、1e9~1e10のような範囲も現れうる - 時間軸では年、半期、四半期、月、週、さらには月を週単位に分ける場合まで考慮する必要がある
既存ツールをそのまま使いにくい点
- 以前に作った PHP のチャートライブラリは、Web サーバー上で成果物を作るには便利でも、Emacs 内で数値をいじりながら試行錯誤する用途には向いていない
- Excel や Jupyter Notebook が人気である理由と同じように、データを 対話的に調整 しながら、求めるチャートに近づけていく過程が重要になる
- Org もプロット機能を提供しているが、Org plot はバックエンドとして Gnuplot を使用している
- Gnuplot はおおむね実用的ではあっても、例にある Y軸の数値フォーマットのようにデフォルト値を変えようとすると負担が大きくなりうる
eplot の実装と表現機能
chartという名前はすでに使われていたため、新しいパッケージ名を eplot に決めた- 既存の PHP ライブラリの機能をすべて移植するつもりはなかったが、実装を始めると結局その大半を作り直すことになった
- 新バージョンには ダークモード のような機能も含まれている
- PHP ライブラリのグラデーションは手書きの方式で、GIF のカラーマップリソースのようなものも含まれていたと記憶している
- Emacs Lisp 版では SVG を使用する
- SVG はグラデーションをサポートしているため、ポリゴンとグラデーションを組み合わせて似た効果を出している
- PHP の元実装に近い結果を得られる
- もうひとつの変わったグラデーションは実装していない
- ピクセル単位、あるいは少なくともライン単位の実装が必要で難しいため
- 数学計算が必要になる可能性もあり、除外した
使用フローと設定方法
- 数字が多く入ったバッファで
M-x eplotを実行すると、別バッファにチャートが表示される - チャートを望む形に調整するため、headers という概念を導入した
- 有用なオプションの大半は headers で制御できる
- headers を追加した後
C-c C-cを押せば、結果をすぐ確認できる - それを簡単にするための eplot mode もある
- headers を追加した後
- 簡単な例は小さく表示されたチャート形式で提供されており、記事冒頭の画像にあるさまざまなバリエーションの大半も headers で作られている
公開状況と残された作業
- さまざまな可能性を文書化した
README.mdを作成した - コードは Microsoft Github で公開されている
- 現在の状態は依然として work in progress である
- 基本的にはある程度有用だと思うが、1週間ずっと修正しながら書いた状態なので、安定性を断言するのは難しい
- コードはテストケースごとに非効率な形で書かれており、整理が必要な状態 だ
- 複数のコードパスを統合する必要がある
- コードの可読性を高める必要がある
- ひとまず休息のため現在の状態で push したが、実際の利用者にはまだ注意が必要だ
1件のコメント
Hacker News のコメント
この分野が好きなので一般的な助言を付け加えると、以前 Our World in Data で Max Roser と Hannah Ritchie と一緒に Grapher ライブラリ(https://github.com/owid/owid-grapher)のエンジニアとして働きながら、良いチャートの作り方をたくさん学んだ。
例を見ると、タイトル・サブタイトル・キャプションをおろそかにしないのがよさそう。すでに「簡単なヘッダー」を作ってあるなら入れやすいはずだし、短い文言をいくつか加えるだけで大きな差が出る。Cole Nussbaumer Knaflic の『Storytelling with Data』もおすすめ。
発展を続けるなら、いつかはデータフローライブラリと DSLも入れたくなるはず。R の Hadley Wickham の dplyr が最高で、私の Ohayo ツールや OWID Grapher の CoreTable ライブラリ(https://github.com/owid/owid-grapher/tree/master/packages/%4...)でもそのやり方を参考にした。Jeffrey Heer の比較的新しいライブラリ Arquero(https://idl.uw.edu/arquero/)も同じ系統。
最近は Mike Bostock の新しいツール Plot(https://observablehq.com/plot/)を見ているところで、まだ一、二日使った程度だが期待している。今は Emacs を使っていないけれど、上の内容が役に立つことを願う。
たとえばデータファイルを生成している途中で、チャートを描く前に手動で修正したくない場合や、大きなデータファイルのディレクトリで各ファイルに手でヘッダーを付けず、必要なときにその都度描画してみたい場合があり得る。
元記事で言っているように、必要なコード量が直接実装するより多くなるケースになりかねない。
Y 軸の第 3 レベルの目盛りサイズを変えるには
set_third_level_y_ticks()みたいなものを呼ぶ、という具合。必ずしも悪いというわけではなく、もしかするとそうならざるを得ないのかもしれないが、すべてが特別扱いされているように見えて、直交性が低い感じがする。それでも純粋な elisp で何かを作ろうとする試みは尊重する。
これらのプロットが SVG なので、LaTeX や Web ブラウザに持っていける点も大きい。第一に、論文に挿入するプロットを作るときにはかなり有力な候補になる。良い成果物だ。
それでも今では Codeberg が自由・オープンソースプロジェクトの間で、ようやくある程度勢いを得ているように見える。
さっき github.com のトップページを開いて Ctrl-F で「Microsoft」を探したら 0 件だった。