1. ホーム
  2. python

[解決済み] Ubuntu (WSL1 & WSL2) で matplotlib のプロット(と他の GUI)を表示する

2022-12-10 03:17:30

質問

Windows用のubuntu(linux用のWindowsサブシステム)では、Aggバックエンドを使用する必要があり、プロットを表示せずに画像を保存するだけでよいという意見があるようです。

import matplotlib
matplotlib.use('Agg') # no UI backend

import matplotlib.pyplot as plt
import numpy as np

t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2*np.pi*t)
plt.plot(t, s)
plt.title('About as simple as it gets, folks')

#plt.show()
plt.savefig("matplotlib.png")  #savefig, don't show

plt.show()が実際に画像を表示するようにするにはどうしたらよいでしょうか。 私の現在のオプションは、plot.show()をオーバーライドして、代わりにWindowsの/mnt/c/Users/james/plots/の下にplot-148123456.pngを保存して、単に画像を見るエクスプローラウィンドウを開かせるだけにしています。

私はそのフォルダをホストして、ブラウザを使用することができると思います。

私の目標は、画像をどこかに ftp するなどのコードを変更することなく、上記のコードのような単純な例を実行できるようにすることです。 私は、プロットがウィンドウに表示されるようにしたいだけです。

誰かがそれを行うための適切な方法を考え出しましたか?

どのように解決するのですか?

OK、それで私はそれが次のように動作するようになりました。 私はWindows上でUbuntuを持っており、anaconda python 3.6がインストールされています。

  1. ダウンロードとインストール VcXsrv または Xming (Windows 用 X11) を sourceforge からダウンロードすることもできます (以下の編集を参照)。
  2. sudo apt-get update
  3. sudo apt-get install python3.6-tk (をインストールする必要があるかもしれません。 python*-tk をインストールする必要があるかもしれません)
  4. pip install matplotlib (matplotlib用。ただし、他の多くのものも動作するようになりました)
  5. export DISPLAY=localhost:0.0 (追加 ~/.bashrc に追加し、恒久化する。 WSL2 を参照してください)。

とにかく、すべての後に、wsl上のubuntuで動作するこのコードは、そのまま動作しました。

import matplotlib.pyplot as plt
import numpy as np

t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2*np.pi*t)
plt.plot(t, s)

plt.title('About as simple as it gets, folks')
plt.show()

の結果です。

これはJupyterノートブックか何かでやったほうがいいのかもしれませんが、Windows版UbuntuとLinux版Subsystemで基本的なコマンドラインのpython matplotlibの機能があるのはいいことですし、これによって他の多くのGUIアプリも動きます。

例えば、xeyesをインストールすると、x11-appsをインストールするように言われ、それをインストールすると、多くのGUIアプリが使用するGTKがインストールされます。 しかし、重要なのは、いったん DISPLAY を正しく設定し、x サーバーを Windows にすれば、ネイティブの ubuntu で動作するほとんどのものが WSL でも動作するようになるということです。

編集 2019-09-04 : 今日、いくつかのライブラリをアップグレードした後、「画面リソースを取得できない」という問題が発生しました。 そこで、VcXsrvをインストールし、Xmingの代わりにそれを使用しました。 インストールは以下から https://sourceforge.net/projects/vcxsrv/ で、xlaunch.exeを実行し、複数のウィンドウを選択し、次へ次へ次へok。 そうすれば、すべてがうまくいきました。

WSL 2ユーザーのための編集 2020-06-23 WSL2(現在fast ringのインサイダー)はGPU/Dockerをサポートしているので、アップグレードする価値があります。しかし、それはvmで実行されます。WSL2の場合は、1-4と同じ手順で行ってください。

  1. ipはlocalhostではありません。resolv.confにあるので、代わりにこれを実行します(~/.bashrcにインクルードします)。
 export DISPLAY=`grep -oP "(?<=nameserver ).+" /etc/resolv.conf`:0.0

  1. ここで、ファイアウォールを再確認します。Windows セキュリティ -> ファイアウォール & ネットワークの保護 -> ファイアウォールを通してアプリを許可する -> VcXsrv が public と private の両方にチェックが入っていることを確認します。 (xlaunch 初回起動時に、ファイアウォールを通して許可するかどうかプロンプトが出る場合があります。これも有効です。また、VcXsrvがアプリのリストにない場合は、手動で追加することもできます。)
  2. VcXsrv を Disable access control" にチェックを入れて起動します。

注意:いくつかのWSL2ユーザは、次のようなエラーが発生しました。 couldn't connect to display "172.x.x.x:0" . このような場合は、次のコマンドで DISPLAY に格納されている IP アドレスを確認してみてください。 echo $DISPLAY . 表示された IP が間違っているようであれば ("8.8.8.8" または他の動作しない IP アドレス)、以下のコードを変更する必要があります。 ~/.bashrc のコードを、インスタンスの IP アドレスを取得するコードに変更する必要があります。あるユーザーは、これがうまくいったと言っています。 export DISPLAY=$(ifconfig | grep inet | awk '{print $2}' | head -n 1 | awk '{print $0":0"}') . しかし、他の何人かはうまくいきませんでした。YMMV、しかし、ちょうどあなたのIPを見つけ、DISPLAYのためにifを使用してください。 ほとんどのWSL2ユーザは、#5のコマンドでうまくいきます。

Windows11用に編集 : もし MS があなたに古いコンピュータを捨てて TPM 付きのものを買うように説得し、それで Windows 11 を手に入れたのなら、あなたは無料で GUI を手に入れることができるのです。Win10 は XP のようになり、Win11 が古いコンピュータでも問題なく動作するにもかかわらず、最近のコンピュータが必要だと MS が判断したため、長い間使えるようになるからです。