はじめに
gradsは地球流体関係のデータ可視化に威力を発揮してきたけど、開発元のCOLAのページがなくなってしまっており、OpenGradsのページも最終更新が2026年時点で7年前などもうメンテナンスが期待できない。また、X11もmacOSではアップデートが行われておらず、X11自体の存続も危うい。そのため、grads+X11に変わる新しいクイックルックのツールが必要になった。
考えられる選択肢
chatGPTに問い合わせてみると最近はpython+xarrayでのデータハンドリングが主流らしい。しかし、それは分かりきっていることで(実際論文データなどは今もxarrayで処理することがほとんど)、欲しいのはgrads並のクイックルックの方法である。X11なしで可視化する方法を聞いてみると
- xarray+sixel
- xarray+VSCode
- xarray+jupyterlab
- xarray+データ転送
となっていて、他の選択肢は似たようなものだった。リモートのデータを処理するので、ブラウザを立ち上げたりデータ転送をして可視化をするのは時間と手間がかかるため除外。そうするとsixelあるいはVSCodeでの可視化しか残らない。
VSCode
まずはやってみた
VSCodeで可視化するにはパッケージをローカルとリモートにインストールする必要がある。
- VSCodeをインストール後、ExtensionsからRemote-SSH, Python, Jupyterをローカルにインストール
- Cmd + Shift + Pでコマンドを入力してSSH接続する。入力するコマンドは
Remote-SSH: Connect to Host - .ssh/configに登録しているホスト一覧が出てくるので、ここから接続先ホストを選ぶ
- リモート接続できたらリモート側でもExtensionsからPython, Jupyterをインストールする。
- terminal->new terminalでターミナルを開いて、python仮想環境を切り替え
- explorerから目的のディレクトリへ移動して例えば以下のようなスクリプトを作成
# %% import matplotlib.pyplot as plt import xarray as xr import colormaps as cmaps import cartopy.crs as ccrs import cartopy.feature as cfeature import pandas as pd ds = xr.open_dataset("out.nc") ds["time"] = pd.to_datetime(ds["time"].values) data_day = (ds["aprc"] + ds["aprl"]) * 86400 data_mon = data_day.resample(time="1ME").mean() data = data_mon.isel(time=0) proj = ccrs.PlateCarree(central_longitude=180) fig, ax = plt.subplots(figsize=(10,6), subplot_kw={'projection': proj}) cc=cmaps.WhBlGrYeRe data.plot(ax=ax, transform=ccrs.PlateCarree(), cmap=cc, vmin=0, vmax=20) ax.add_feature(cfeature.COASTLINE, linewidth=0.5) plt.show() - 最初に# %%とあるが、これがあればjupyter互換のスクリプトとしてGUIからRun cellが選択できるようになる。
- Run cellを実行すると別のウィンドウが開いて可視化結果がX11なしで表示される。
感想
- 準備の手間が多すぎる
- ローカル・リモートのどちらにもパッケージインストールというのが鬱陶しい
- 繰り返し実行するのにも手順が多い、特にexlorerから辿らないといけないのはすごく面倒
- GUIでの実行で、どこに手順を進めるためのボタンがあるのかわかりにくい
- 可視化画面が小さすぎる
- 色んな面で柔軟性に欠ける
正直拡張性が高くてもGUIメインの操作はどこに何があるのか、コマンドと違って空間的に把握しなくてはならず、操作がいちいち遅れてしまって、自分には合わなかった。その理由で元々VSCode自体もあまり使っていない。この方法だとちょっとgrads+X11の方がまだ快適だなと感じた。
Sixel (iTerm2)
iTerm2でやってみた
Sixelというのはかなり古くからあるグラフィックス表示機能であるらしく、ターミナル上で画像を表示することができる。この機能を使えばデータ転送無しでデータを可視化した画像ファイルをターミナル上で開くことが可能。iTerm2はsixelに対応しているので、画像表示スクリプトを以下からもらってくる。
やることは簡単で、pythonスクリプトを動かし、画像ファイルを出力した後、imgcatのスクリプトをリモート側で叩くだけである。これでターミナル上で(データ転送無しで)可視化画像が表示される。めちゃくちゃ簡単かつ快適。
感想
gradsとは違ってインタラクティブに表示内容を調整できないのは残念だけど、結局gradsでも納得行く表示にするためには何度もスクリプトを調整する必要があるので、手間はほぼ変わらないんじゃないだろうか。また、結局スクリプトは使いまわしたりするので、可視化に使うpythonスクリプトはgitlabなりに登録しておいて、自分でライブラリ化してしまえばよい。たぶん多くのpythonから入ったユーザーはすでにそうしているのだろう。
wezterm
weztermってなに?
検索をかけてみるとひっかかるターミナルアプリにweztermがあった。最近流行っているらしい。Rustで書かれているようで、iterm2ではGUIでいちいち設定していたconfigが設定ファイルで一発で設定できる。使用した感じはショートカットも充実していて、iterm2の上位互換のアプリぽさがある。
iterm2と違うところ
weztermにはimgcatがないので、sixelが有効といっても違う方法が必要。ちなみにimgcatをリモートで叩いてもターミナルに画像は表示されない。weztermを使う場合にはlibsixelをリモート側にconda installする必要がある。
conda install libsixel
libsixelが入るとimg2sixelが入るのでこれを使って画像を表示する。
img2sixel test.png
まとめ
iterm2やwezterm以外にも画像プロトコルに対応したターミナルはあるものの、動作が不安定であったり、kittyなど動作やリモートホスト側にもプロトコル対応が必要など、汎用性が低かった。そのため、sixelを手放すことはできないので、weztermでxarrayがいまのところクイックルックの可視化に適している。
xarrayでの可視化だが、本当に簡単な可視化であればほんの数行で実現することが可能。これについてはxarrayのまとめに書いておきたい。