問題が発生している環境の情報は以下となります。
Host OS: macOS Mojave 10.14.2 Container OS: Ubuntu 18.04.1 LTS Docker Desktop: 2.0.0.2 Docker Engine: 18.09.1
Dockerのコンテナ上で matplotlib.pyplot のグラフを表示しようとしており、
Python3インタプリタで次のコードを実行しました。
Python3
1import matplotlib.pyplot as plt 2plt.plot([1,2,3,4]) 3plt.show()
plt.show()は特にエラーもなく終了するのですが、グラフが表示されません。
matplotlibの使い方の誤り、あるいはDocker環境による問題かと考えております。
余談ですが、plt.savefig()は成功し、ファイルが保存されます。
詳しい方がおりましたら、ご教授頂けないでしょうか。
どうぞ宜しくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
matplotlibの使い方の誤り、あるいはDocker環境による問題かと考えております。
Docker のどのイメージを使っているかによりますが、ほとんどのイメージではデフォルトでは GUI アプリケーションは利用できないと思われます。(必要なソフトが入っていないため)
以下のようにコンテナに x-org-server と ssh クライアントを入れて、ホスト側から SSH クライアントでアクセスすると、表示されます。
サンプルコード
以下は Anaconda 公式のイメージを使ったサンプル
Dockerfile
1FROM continuumio/anaconda3 2 3RUN apt-get update 4 5# xorg-server をインストールする。 6RUN apt-get install -y --no-install-recommends debconf-utils && \ 7 echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections && \ 8 echo keyboard-configuration keyboard-configuration/layout select 'Japanese' | debconf-set-selections && \ 9 echo keyboard-configuration keyboard-configuration/layoutcode select 'jp' | debconf-set-selections && \ 10 apt-get install -y --no-install-recommends xorg 11 12# ssh-server をインストールする。 13RUN apt-get install -y --no-install-recommends openssh-server && \ 14 echo PermitRootLogin yes >> /etc/ssh/sshd_config && \ 15 echo "root:root" | chpasswd 16 17# ssh 用のポートを開ける。 18EXPOSE 22 19 20CMD service ssh start && /bin/bash
1. イメージをビルドする。
2. コンテナを起動する。
bash
1$ docker build --tag test . 2$docker run -itd -p 2222:22 --name anaconda test
3. X-11 forwading に対応した SSH クライアント (自分は Windows なので Mac のソフトはわかりません) を使い、以下の情報で SSH ログインする。
ユーザー root パスワード root ポート番号 2222
4. ログインしたコンテナで matplotlib が使えるか試す
bash
1$ python 2Python 3.7.1 (default, Dec 14 2018, 19:28:38) 3[GCC 7.3.0] :: Anaconda, Inc. on linux 4Type "help", "copyright", "credits" or "license" for more information. 5 6>>> import matplotlib.pyplot as plt 7>>> import numpy as np 8>>> x = np.linspace(-3, 3, 100) 9>>> y = x**2 10>>> plt.plot(x, y) 11>>> plt.show()
x11-forwading によりホスト側にウィンドウが表示されます。
投稿2019/02/10 05:48
編集2019/02/10 05:49総合スコア21956
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
plt.show()は特にエラーもなく終了するのですが、グラフが表示されません。
単純に、matplotlibのplt.show()で表示される(はずの)グラフを確認したい、ということであれば、anacondaのJupyterLabを使えば良いです。
おそらくですが、質問者様は以下コマンドで公式(https://hub.docker.com/r/continuumio/anaconda3)からイメージを引っ張った後、
docker pull continuumio/anaconda3
以下コマンドでdockerコンテナの中に入って、対話型シェルスクリプトか何かでpythonのコードを実行したのではないでしょうか?
docker run -i -t continuumio/anaconda3 /bin/bash
というか私がそれでやって、plt.show()を実行してもグラフ出なかった、というか、グラフ表示のためのGUIツールが起動されなかったので・・・。
なので、JupyterLabというWebアプリケーション型のIDEをanacondaから起動してあげて、そこで任意のファイルを実行してあげればOKです。
手順としては、まず以下コマンドでJupyterLabを起動。
$ docker run -it -p 8888:8888 continuumio/anaconda3 /bin/bash -c "/opt/conda/bin/conda install jupyter -y --quiet && mkdir /opt/notebooks && /opt/conda/bin/jupyter notebook --notebook-dir=/opt/notebooks --ip='*' --port=8888 --no-browser"
そしたら
To access the notebook, open this file in a browser: file:///root/.local/share/jupyter/runtime/nbserver-1-open.html Or copy and paste one of these URLs: http://81d6027bbe25:8888/?token=00a94af51e704cb66a105c576377081cd5ac0619c2137429 or http://127.0.0.1:8888/?token=00a94af51e704cb66a105c576377081cd5ac0619c2137429
という感じのメッセージが出てここにアクセスしろと案内されるので、アクセスする。
(こちらのサイトを参考にさせていただいております)
右上の方に「New」っていうのがあるのでクリック。python3を選択。
別ウィンドウでエディタみたいなのが開くので、そこで任意のコードを入力し上の方にある「Run」ボタンを押す。
→グラフが表示される。
なので、ホスト側のGUIツールを利用できるようにするとか、別に必要ないのでは、と思いました。
投稿2020/04/30 00:36
編集2020/04/30 00:53総合スコア17
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
残念ながら、自分は詳しくないので的確なアドバイスはできそうにないです。
それでも自分が思いつく関係しそうなものを挙げてみます。ほとんどが「質問者さんへの逆質問」ですが、以下のようなことについてもう少し(質問を編集して)追加情報を加えれば本当に詳しい方から適切なアドバイスが得られるかも知れません。
- OS(ホスト/コンテナ側両方。ディストリビューションやバージョンもできるだけ詳しく)
例: ホスト Windows 10 64bit version ...., コンテナ Ubuntu 18.04LTS
- X Window Systemの環境はどうなっているか
コンテナOSはLinuxのどれかのディストリビューションだと思うのですが、server editionのようにそもそもX Windowがインストールされてない環境もあるのでは?
- X Serverはどこでどのようなものを起動しているか?
多分ホストOS側で稼働させているX Serverへ接続するのだと思います(詳しくないので推測です)。
- コンテナ内のアプリケーションからホストのX Serverへ接続できる環境になっているか
Docker X11で少し検索しただけですがそこそこコツがあるようです。質問者さんはそのあたりを疑っておられるようですが「Docker X11」で検索などされたでしょうか?
- matplotlibのバックエンドはどうなっているか
matplotlibはTcl/TkやGTK+やQtなどいろいろなGUIバックエンド(ミドルウェア的なもの)を介してGUIを実現しています。それは環境設定で切り替えたりプログラムコード上で切り替えたりできますが、それがGUIなしのバックエンド('Agg')になっていると画面には何も出せません。
等々。
余談:質問に書くべき情報について
自分が色々挙げたいくつかはハズレ(既に質問者さんがよくわかっていること)と思いますが、自分にとって情報が少なすぎてどの程度まで意識しておられるかわからないので無暗に挙げました。
ひょっとしたら自分がDockerの経験がないため「普通に環境設定すればすんなりGUIは動くもの」なのかそうでないのかがわかってないからかも知れません。が、ご質問の内容だけでは
(A)「え?X11て何?」というレベルの話
(B)「Dockerにそんな設定が必要だったのかそれは知らなかった」というレベルの話
などありえる原因にそこそこ幅がある印象です。わかっている方でも質問に情報を載せ忘れる(あるいは面倒がって載せない)人もままいるようですが、ご質問に情報が少ないとどのあたりまで正しく進めておられるか閲覧者にしぼりこめないことを忘れないでほしいです。自分の印象では(B)に近いように思えますが、いかがでしょう?
せっかく質問するならせめて「X11についてはxeyeとかxtermなら動く」といったちょっとした情報でもよいから載せてくれているとずっとわかりやすいと思います。あるいは
・ホストOSはなになにでバージョンはこれこれ
・Dockerはこういうふうに設定した
・X Serverについてはこれこれの記事を参考にそのとおりに設定した
・コンテナOSはDockerのこのURLからこれを落とした
・Pythonの環境設定はこんなふうにやった
等々についていくつかの項目の情報を記載されていれば詳しい方にとってあなたの状況を推測する材料は大分違ってくるでしょう。とにかく他者に相談するにはあなたの状況を相手にいかに的確に把握してもらうかが肝心です。そのために正確で具体的な情報をできるだけ書くようにしたほうがよいと思います。Q&Aでも訊かれてから答えるのではなくなるべく最初から情報を提示することが大事ではないでしょうか。
例えば同僚に「ちょっと相談に乗ってくれない?これこれのことをしているのだけど、ここでこういう問題がおきたんだ。ちょっと詳しく話たいんだけど時間ある?」と相談するようなとき、まず問題を整理し、伝えるべき肝心な情報をできるだけ用意してから話しかけるのではありませんか?本サイトでの質問も同じと思います。どちらかといえば離れた場所にいる先輩にメールで技術的な質問をする感覚ぐらいがちょうどいいかも知れませんね。
投稿2019/02/10 04:50
総合スコア18392
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。