[解決済み] Ubuntu (WSL1 & WSL2) で matplotlib のプロット(と他の GUI)を表示する
質問
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がインストールされています。
- ダウンロードとインストール VcXsrv または Xming (Windows 用 X11) を sourceforge からダウンロードすることもできます (以下の編集を参照)。
-
sudo apt-get update
-
sudo apt-get install python3.6-tk
(をインストールする必要があるかもしれません。python*-tk
をインストールする必要があるかもしれません) -
pip install matplotlib
(matplotlib用。ただし、他の多くのものも動作するようになりました) -
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と同じ手順で行ってください。
- ipはlocalhostではありません。resolv.confにあるので、代わりにこれを実行します(~/.bashrcにインクルードします)。
export DISPLAY=`grep -oP "(?<=nameserver ).+" /etc/resolv.conf`:0.0
- ここで、ファイアウォールを再確認します。Windows セキュリティ -> ファイアウォール & ネットワークの保護 -> ファイアウォールを通してアプリを許可する -> VcXsrv が public と private の両方にチェックが入っていることを確認します。 (xlaunch 初回起動時に、ファイアウォールを通して許可するかどうかプロンプトが出る場合があります。これも有効です。また、VcXsrvがアプリのリストにない場合は、手動で追加することもできます。)
- 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 が判断したため、長い間使えるようになるからです。
関連
-
[解決済み] Matplotlib のプロット: 軸、凡例、空白を削除する
-
[解決済み] matplotlib のプロットで軸のテキストを非表示にする
-
[解決済み】Matplotlibで図のタイトルと軸ラベルのフォントサイズを設定するには?
-
[解決済み] Django のテストデータベースをメモリ上だけで動作させるには?
-
[解決済み] 小数点以下1桁を取得する[重複]。
-
[解決済み] CSVデータを処理する際、1行目のデータを無視する方法を教えてください。
-
[解決済み] Pythonによる一対のクロスプロダクト [重複] (英語)
-
[解決済み] 単純な文字列からtimedeltaオブジェクトを作成する方法
-
[解決済み] Pythonでランダムなファイル名を生成する最良の方法
-
[解決済み] あるメソッドが複数の引数のうち1つの引数で呼び出されたことを保証する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] PythonでのAWS Lambdaのインポートモジュールエラー
-
[解決済み] googletransがエラー 'NoneType' オブジェクトに 'group' 属性がない、と言って動かなくなった。
-
[解決済み] タプルのリストを複数のリストに変換するには?
-
[解決済み] Django Rest Framework ファイルアップロード
-
[解決済み] 文字列から先頭と末尾のスペースを削除するには?
-
[解決済み] 文字列のリストを内容に基づいてフィルタリングする
-
[解決済み] pandasのタイムゾーンに対応したDateTimeIndexを、特定のタイムゾーンに対応したナイーブなタイムスタンプに変換する。
-
[解決済み] サブフォルダからのインポートモジュール
-
[解決済み] Pythonでマルチプロセッシングキューを使うには?
-
[解決済み] 単純な文字列からtimedeltaオブジェクトを作成する方法