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

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

ただいまの
回答率

87.59%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 5,583
退会済みユーザー

退会済みユーザー

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

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インタプリタで次のコードを実行しました。

import matplotlib.pyplot as plt
plt.plot([1,2,3,4])
plt.show()

plt.show()は特にエラーもなく終了するのですが、グラフが表示されません。

matplotlibの使い方の誤り、あるいはDocker環境による問題かと考えております。

余談ですが、plt.savefig()は成功し、ファイルが保存されます。

詳しい方がおりましたら、ご教授頂けないでしょうか。
どうぞ宜しくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tiitoi

    2019/02/10 14:02

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

    キャンセル

回答 3

checkベストアンサー

+3

matplotlibの使い方の誤り、あるいはDocker環境による問題かと考えております。

Docker のどのイメージを使っているかによりますが、ほとんどのイメージではデフォルトでは GUI アプリケーションは利用できないと思われます。(必要なソフトが入っていないため)

以下のようにコンテナに x-org-server と ssh クライアントを入れて、ホスト側から SSH クライアントでアクセスすると、表示されます。

サンプルコード

以下は Anaconda 公式のイメージを使ったサンプル

FROM continuumio/anaconda3

RUN apt-get update

# xorg-server をインストールする。
RUN apt-get install -y --no-install-recommends debconf-utils && \
    echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections && \
    echo keyboard-configuration keyboard-configuration/layout select 'Japanese' | debconf-set-selections && \
    echo keyboard-configuration keyboard-configuration/layoutcode select 'jp' | debconf-set-selections && \
    apt-get install -y --no-install-recommends xorg

# ssh-server をインストールする。
RUN apt-get install -y --no-install-recommends openssh-server && \
    echo PermitRootLogin yes >> /etc/ssh/sshd_config  && \
    echo "root:root" | chpasswd

# ssh 用のポートを開ける。
EXPOSE 22

CMD service ssh start && /bin/bash

1. イメージをビルドする。
2. コンテナを起動する。

$ docker build --tag test .
$docker run -itd -p 2222:22 --name anaconda test

3. X-11 forwading に対応した SSH クライアント (自分は Windows なので Mac のソフトはわかりません) を使い、以下の情報で SSH ログインする。

ユーザー root パスワード root ポート番号 2222

4. ログインしたコンテナで matplotlib が使えるか試す

$ python
Python 3.7.1 (default, Dec 14 2018, 19:28:38)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> x = np.linspace(-3, 3, 100)
>>> y = x**2
>>> plt.plot(x, y)
>>> plt.show()

イメージ説明

x11-forwading によりホスト側にウィンドウが表示されます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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ツールを利用できるようにするとか、別に必要ないのでは、と思いました。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

残念ながら、自分は詳しくないので的確なアドバイスはできそうにないです。

それでも自分が思いつく関係しそうなものを挙げてみます。ほとんどが「質問者さんへの逆質問」ですが、以下のようなことについてもう少し(質問を編集して)追加情報を加えれば本当に詳しい方から適切なアドバイスが得られるかも知れません。

  • 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でも訊かれてから答えるのではなくなるべく最初から情報を提示することが大事ではないでしょうか。

例えば同僚に「ちょっと相談に乗ってくれない?これこれのことをしているのだけど、ここでこういう問題がおきたんだ。ちょっと詳しく話たいんだけど時間ある?」と相談するようなとき、まず問題を整理し、伝えるべき肝心な情報をできるだけ用意してから話しかけるのではありませんか?本サイトでの質問も同じと思います。どちらかといえば離れた場所にいる先輩にメールで技術的な質問をする感覚ぐらいがちょうどいいかも知れませんね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/30 07:50

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

    キャンセル

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

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る