MobaXtermを使ってWSLのmatplotlibを描画する


はじめに

VSCodeやWSL(Ubuntu)をインストールしていくと、特に何も考えずにRemote WSLが入ったりpythonが入ったりして環境が便利に整っていくのは本当に助かります。ただ、matplotlibで描画がされないという問題だけはちょっと作業が必要です。
検索するとVcXsrvを入れて対応している方が多い印象を受けましたが、このためにXServerだけを入れるのはつまらない……
というわけで、気になっていたMobaXtermを使ってみることにしました。

環境

  • Windows10 Home
  • WSL2 / Ubuntu 18.04 LTS

MobaXtermのインストール

MobaXtermのページ からFree版をダウンロードします。
Portable版とInstaller版のどちらを選んでもかまいませんが、私はInstaller版で入れました。
インストール時の選択肢はデフォルトのままでよいと思います。

初回起動時はWindows Firewallでブロックされますので、許可してあげてください。

MobaXtermが起動すると当たり前のようにUser sessionにWSLが表示されていました。
これをダブルクリックするとWSLが立ち上がります。すごい!

DISPLAY環境変数と接続の設定

X11はDISPLAY環境変数を参照してそこに描画情報を送ります。
WSL上でmatplotlibを使って描画すると、このDISPLAY環境変数を参照してMobaXtermで動いているXServerに描画情報を送ります。
毎回DISPLAY環境変数を設定するのも大変なので、3行目に表示されているYour DISPLAY is set to...のIPを参照して、WSLの.bashrc に設定を加えておきます。
設定するIPアドレスは各々違うと思うので、適宜変更してください。

~/.bashrc
$ echo 'export DISPLAY=192.168.xxx.yyy:0.0' >> ~/.bashrc
$ . ~/.bashrc

また、描画しようとする時にはMobaXtermが「つないで良い?」と聞いてくれます。
毎回聞かれるのが面倒な方はRemote Access Controlを無効にしておきます。
Settings → Configuration → X11 → X11 remote accessを'on demand' から 'full' にします。
他の設定にどんな意味があるか気になる方はMobaXterm Documentationを参照してください。

matplotlibで描画してみる

例はめっちゃシンプルな方がいいでしょうということで。
MobaXtermは起動したままにしておいてください。

import matplotlib.pyplot as plt

plt.plot([0, 1], [0, 2])
plt.show()