回答編集履歴

2 文章訂正

KSwordOfHaste

KSwordOfHaste score 18197

2018/11/25 15:10  投稿

自分の環境(Windows 10 + Anaconda 2.7)では質問者さんのコードとほぼ同じもの(h5py, numpy, matplotlibを使ったもの)が動作したので参考までに自分の環境についてコメントしてみます。
## Anacondaインストール前の環境
WindowsにはCPython 3.7がインストールしてあります。こちらは普段使いなのでPATHにもつなげてます。
## Anacondaインストール
[https://www.anaconda.com/download/](https://www.anaconda.com/download/)から最新の5.3.1 Python 2.7 VersionをDLしてインストールしました。
(A)Just Meを選択
(B)インストール先はC:\Users\ksoh\Anaconda2
(C)Add Anaconda to my PATH environment variable =>チェックしない
(D)Register Anaconda as my default Python 3.7 =>チェックしない
(C)はAnacondaのuninstall/reinstallで問題を引き起こす可能性があるので推奨しないとのことですが、「なんで?」と思ったものの、自分は普段CPythonを使うためあまり気にしないことにしました。また同じ理由でAnaconda環境はAnaconda Prompt/Notebook/Spiderを通じて利用し、PyCharmなどはあえて使わないと決めたので(D)のチェックも外しました。
## インストール後の環境
(E) matplotlibバージョン
Anaconda NavigatorのEnvironmentで見るとmatplotlibバージョンは2.2.3でした。
`import matplotlib.colors as colors;print hasattr(colors, "to_rgba")`はTrueです。(動いたんだから当然といえますが)
(F) 環境変数PATH
Start MenuからNotebook起動
Start MenuからAnaconda Promptを起動しそこからipythonを動かす
このパターンで環境変数PATHを`for p in os.environ['PATH'].split(';'): print p`で調べると
C:\Users\ksoh\Anaconda2
C:\Program Files\Python37 <= 最初から入っていたCPython 3.7
の順(期待通り)になってました。一方念のためStart MenuからPowerShellを起動し`$env:path.split(";")`を見るとAnacondaがPATHに含まれてません(期待通り)でした。
(G) matprotlibrc
自分はこれを作成していません。よって
C:\Users\ksoh\.matplotlib
にもプログラムを動かしている作業ディレクトリーにも
matplotlibrcが存在しない前提で確認しました。
## 問題のプログラムの実行
スタックトレースを拝見するとmatplotlibのバックエンドがinline表示用(`module://ipykernel.pylab.backend_inline`)のようでしたので、
Start MenuからNotebook起動
Anaconda NavigatorからQtConsoleを起動
の2パターンでまず以下をやってみました。(IPythonのプロンプトは省略してます)
```ptyhon
import matplotlib.pyplot as plt
plt.plot([1, 3, 2]) # => [<matplotlib.lines.Line2D at 0x7ba4978>]
# (QtConsoleではこの時点でグラフがインライン表示された)
plt.show()
# (Notebookではセルにここまで書いて初めてインライン表示された)
import matplotlib as mpl
print mpl.get_backend() # => module://ipykernel.pylab.backend_inline
                        # inline用のバックエンドになってました
```
Notebookの記事を見ますと`%matplotlib inline`なんて指定しているのを見かけますがAnacondaからNotebookやQtConsoleを起動する限りはこのようなバックエンドの指示は不要のようです。
一方、Anaconda Promptから上記の内容のPythonスクリプトtest.pyを次のようにpythonで実行すると
```
(base) C:\User\ksoh>python test.py
Qt5Agg
```
バックエンドはinline用ではなくQt5Aggとなり、Anaconda Promptとは別のウィンドウが出てそこにグラフが表示されます。
## ちょっと疑問
Anacondaでinline用の表示をするにもかかわらずフロントエンドがipythonでない(それはスタックトレースの形式からわかります)という質問者さんの状況がよくわかりませんでした。
具体的にどのようにプログラムを起動しておられるのでしょうか?そのあたりも明記するとよいと思います。
---
基本的な環境情報のいくつかを調べる簡単なスクリプトを書いてみました。
あれみてこれみて・・・と調べるより、このスクリプトを「どういう手順で起動したか」「実行した結果」をそのまま記載した方が質問側・閲覧側に情報伝達の祖語がおきにくいかも知れません。
```python
# python 2.7 について
import os, sys
print 'sys.executable:', sys.executable
print '%PATH%:'
for p in os.environ['PATH'].split(';'):
   print "   '%s'" % p
print 'sys.path:'
for p in sys.path:
   print "   '%s'" % p
# matplotlibについて
import matplotlib as mpl
print 'matplotlib: ', mpl.__version__
print 'backend: ', mpl.get_backend()
# numpy, h5py
import numpy
print 'numpy: ', numpy.__version__
import h5py
print 'h5py: ', h5py.__version__
```
1 環境を補足

KSwordOfHaste

KSwordOfHaste score 18197

2018/11/25 15:06  投稿

自分の環境では質問者さんのコードとほぼ同じもの(h5py, numpy, matplotlibを使ったもの)が動作したので参考までに自分の環境についてコメントしてみます。
自分の環境(Windows 10 + Anaconda 2.7)では質問者さんのコードとほぼ同じもの(h5py, numpy, matplotlibを使ったもの)が動作したので参考までに自分の環境についてコメントしてみます。
なお、ご質問には**事実の記載が少ない**と感じました。なんでもかんでもたくさん情報があればよいわけではありませんが、閲覧者には質問者さんがどんな環境で何をどうやったのか正確にわからないのですから、例えばmatplotlibのバージョンが古い可能性があるかも知れないと思ったなら実際のバージョンを明記しておくべきだと思います。「どの事実を明記すべきか」についてもう少し配慮できるとよいと思います。以下は逆にかなり冗長かも知れませんが。
## Anacondaインストール前の環境
WindowsにはCPython 3.7がインストールしてあります。こちらは普段使いなのでPATHにもつなげてます。
## Anacondaインストール
[https://www.anaconda.com/download/](https://www.anaconda.com/download/)から最新の5.3.1 Python 2.7 VersionをDLしてインストールしました。
(A)Just Meを選択
(B)インストール先はC:\Users\ksoh\Anaconda2
(C)Add Anaconda to my PATH environment variable =>チェックしない
(D)Register Anaconda as my default Python 3.7 =>チェックしない
(C)はAnacondaのuninstall/reinstallで問題を引き起こす可能性があるので推奨しないとのことですが、「なんで?」と思ったものの、自分は普段CPythonを使うためあまり気にしないことにしました。また同じ理由でAnaconda環境はAnaconda Prompt/Notebook/Spiderを通じて利用し、PyCharmなどはあえて使わないと決めたので(D)のチェックも外しました。
## インストール後の環境
(E) matplotlibバージョン
Anaconda NavigatorのEnvironmentで見るとmatplotlibバージョンは2.2.3でした。
`import matplotlib.colors as colors;print hasattr(colors, "to_rgba")`はTrueです。(動いたんだから当然といえますが)
(F) 環境変数PATH
Start MenuからNotebook起動
Start MenuからAnaconda Promptを起動しそこからipythonを動かす
このパターンで環境変数PATHを`for p in os.environ['PATH'].split(';'): print p`で調べると
C:\Users\ksoh\Anaconda2
C:\Program Files\Python37 <= 最初から入っていたCPython 3.7
の順(期待通り)になってました。一方念のためStart MenuからPowerShellを起動し`$env:path.split(";")`を見るとAnacondaがPATHに含まれてません(期待通り)でした。
(G) matprotlibrc
自分はこれを作成していません。よって
C:\Users\ksoh\.matplotlib
にもプログラムを動かしている作業ディレクトリーにも
matplotlibrcが存在しない前提で確認しました。
## 問題のプログラムの実行
スタックトレースを拝見するとmatplotlibのバックエンドがinline表示用(`module://ipykernel.pylab.backend_inline`)のようでしたので、
Start MenuからNotebook起動
Anaconda NavigatorからQtConsoleを起動
の2パターンでまず以下をやってみました。(IPythonのプロンプトは省略してます)
```ptyhon
import matplotlib.pyplot as plt
plt.plot([1, 3, 2]) # => [<matplotlib.lines.Line2D at 0x7ba4978>]
# (QtConsoleではこの時点でグラフがインライン表示された)
plt.show()
# (Notebookではセルにここまで書いて初めてインライン表示された)
import matplotlib as mpl
print mpl.get_backend() # => module://ipykernel.pylab.backend_inline
                        # inline用のバックエンドになってました
```
Notebookの記事を見ますと`%matplotlib inline`なんて指定しているのを見かけますがAnacondaからNotebookやQtConsoleを起動する限りはこのようなバックエンドの指示は不要のようです。
一方、Anaconda Promptから上記の内容のPythonスクリプトtest.pyを次のようにpythonで実行すると
```
(base) C:\User\ksoh>python test.py
Qt5Agg
```
バックエンドはinline用ではなくQt5Aggとなり、Anaconda Promptとは別のウィンドウが出てそこにグラフが表示されます。
## ちょっと疑問
Anacondaでinline用の表示をするにもかかわらずフロントエンドがipythonでない(それはスタックトレースの形式からわかります)という質問者さんの状況がよくわかりませんでした。
具体的にどのようにプログラムを起動しておられるのでしょうか?そのあたりも明記するとよいと思います。
---
基本的な環境情報のいくつかを調べる簡単なスクリプトを書いてみました。
あれみてこれみて・・・と調べるより、このスクリプトを「どういう手順で起動したか」「実行した結果」をそのまま記載した方が質問側・閲覧側に情報伝達の祖語がおきにくいかも知れません。
```python
# python 2.7 について
import os, sys
print 'sys.executable:', sys.executable
print '%PATH%:'
for p in os.environ['PATH'].split(';'):
   print "   '%s'" % p
print 'sys.path:'
for p in sys.path:
   print "   '%s'" % p
# matplotlibについて
import matplotlib as mpl
print 'matplotlib: ', mpl.__version__
print 'backend: ', mpl.get_backend()
# numpy, h5py
import numpy
print 'numpy: ', numpy.__version__
import h5py
print 'h5py: ', h5py.__version__
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る