質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

3回答

11978閲覧

Dockerでmatplotlib.pyplotのshow()が表示されない

退会済みユーザー

退会済みユーザー

総合スコア0

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

2クリップ

投稿2019/02/10 00:11

編集2019/02/10 05:05

問題が発生している環境の情報は以下となります。

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2019/02/10 05:02

xorg-server と ssh 入れて x-11 forwarding に対応した SSH クライアントでホスト側からアクセスすると、使えますよ 自分はこれで使えてます
guest

回答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
tiitoi

総合スコア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
RukaMenda

総合スコア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

KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RukaMenda

2020/04/29 22:50

質問領域に対し詳しくなく回答が提示できない癖に一丁前に質問者に説教垂れてて、何様?って思いました。私も質問者と同じところでつまづいてて、ニーズとしては欲しい解決策がダイレクトに手に入ることであり、必要情報が含まれないただの説教は無価値だと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問