はじめに
marimo 0.20.0 のリリースを見て、新しく追加された mo.ui.matplotlib の box select / lasso select 機能が Chemical Space の探索に使えそうだと思い、Chemical Space Viewer ノートブックを作りました。
molab からブラウザ上で直接動かすこともできます。
このノートブックを X(旧 Twitter)でシェアしたところ、marimo チームからリプライをもらい、marimo 公式ギャラリー に採用していただきました。
デモ
散布図上で分子を選択すると、その分子の構造式や物性情報がテーブルに表示されます。
marimo とは
marimo は Jupyter のようにインタラクティブに Python を実行できるリアクティブノートブックです。
日本語の解説はこちらの記事が参考になります。
marimo は更新が頻繁なため、最新の情報は必ず公式サイトを確認してください。
mo.ui.matplotlib によるインタラクティブな選択
このノートブックの核となるのが mo.ui.matplotlib です。matplotlib の散布図を mo.ui.matplotlib でラップするだけで、box select(クリック&ドラッグ)や lasso select(Shift+ドラッグ)が使えるようになります。
fig, ax = plt.subplots()
ax.scatter(x_coords, y_coords, c=labels, cmap="tab20")
chart = mo.ui.matplotlib(ax)
選択された点のインデックスは chart.value.get_mask() で取得でき、そのまま DataFrame のフィルタリングに使えます。
selected = np.where(chart.value.get_mask(x_coords, y_coords))[0]
table_data = props_df.iloc[selected]
ちょっとした工夫として、HDBSCAN はどのクラスタにも属さない点を cluster = -1(ノイズ)として扱うので、ノイズ点を含めるかどうかを mo.ui.checkbox で切り替えられるようにしました。こういった UI をサッと追加できるのも marimo の良さです。
include_noise_checkbox = mo.ui.checkbox(value=True, label="Include cluster -1 (noise)")
if not include_noise_checkbox.value:
table_data = table_data[table_data["Cluster"] != -1]
公式ギャラリー採用の経緯
このノートブックを作った後、X で marimo 公式アカウントのポストをリポストしたところ、marimo チームからリプライをいただき、公式ギャラリーに採用していただきました。
現在は marimo 公式ギャラリーから直接ブラウザ上で動かすことができます。
ただし公式ギャラリー版は私の molab 版とは少し内容が異なるので、試す場合は molab 版をおすすめします。
まとめ
- marimo のリアクティブ実行と UI 要素を活用して、Chemical Space の対話的な可視化ノートブックを作りました
- 散布図上での分子選択とテーブル表示の連携がシームレスです
- marimo はケモインフォマティクスのようなインタラクティブな探索的解析と相性が良いと感じました
- X でシェアしたことがきっかけで公式ギャラリーに採用していただきました
ソースコードは以下のリポジトリにあります。
