読者です 読者をやめる 読者になる 読者になる

Kuroyagi飼育日誌

学んだことの備忘録

matplotlibをVirtualenvで使うときにひっかかったこと

Virtualenvでグラフを書こうとしましたが、tkinterがないよ!と言われて上手くいきませんでした。



tkinterはpythonGUIを組むためのツールキットらしいです。



調べてみるとどうやら標準でインストールされているpythonでは通るようですが、仮想環境になると仮想環境の中にちゃんと用意してあげなきゃいけないみたいです。当然といえば当然ですね(笑)



以下はその手順についてです。



参考にしたのは【記事1】です。



【記事1】
qiita.com



まずはmatplotlibrcというファイルを探します。その中に書かれているbackendが何に設定されているかを確認。


backend      : TkAgg


となっていれば、グラフは表示はされるようです。



しかし、この状態でグラフ描画のスクリプトを実行してもtkinterがないよ!と怒られます。これは【記事1】にあるようにmatplotlibインストール時にtkagg.pyが生成されていないために起こるエラーだそうです。解決するにはシステムにtk-devというパッケージをインストールすれば良いようです。



手順通りに進めましたが、【記事1】とは異なるエラーが出ました。


ImportError: No module named '_tkinter', please install the python3-tk package

これは書いてある通りにpython3-tkを仮想環境にインストールしてみます。



pip3 install python3-tk

そんなもんないよ!と怒られました。


Could not find a version that satisfies the requirement python3-tk

うーむ、どうすればいいのか…



ひとまず【記事2】を参考にしてみます。



【記事2】
stackoverflow.com



sudo apt-get install python-tk

仮想環境でこのコマンドを打つと、どこにインストールされるのか理解していませんがとりあえず実行!笑



試しに今までエラーを吐いていた.pyファイルを実行すると…



何も出ません!エラーもグラフも!笑



とりあえずtkinterについては怒られなくなりましたが、グラフが描画されない…。これだったらいっそのこと何かしらのエラーを表示してくれた方がありがたいのですが、このあと何をすればいいのか。調べてみてもmatplotlibのbackendをaggからTKaggに変えるという記事が出てくるのですが、確認してみても既にbackendはTKaggになっています。



いろいろと調べてみると、plt.show()してもグラフが表示されないならTKaggといろいろと書いてあるのですが、私の今実行しているのは【ソースコード1】



ソースコード1】

import numpy as np
import matplotlib.pyplot as plt
 
# 折れ線グラフを出力
left = np.array([1, 2, 3, 4, 5])
height = np.array([100, 300, 200, 500, 400])
plt.plot(left, height)

んー?showなんてメソッドないですね…つまり?これはグラフを出力はすれど、表示を実行していないのでは!?ということで以下に修正して実行しみると…



ソースコード2】

import numpy as np
import matplotlib.pyplot as plt
 
# 折れ線グラフを出力
left = np.array([1, 2, 3, 4, 5])
height = np.array([100, 300, 200, 500, 400])
plt.plot(left, height)
plt.show()                                     #追加コード

f:id:cocosuzu:20170401214440p:plain



でん!ということで、描画をしていませんでしたというオチ。素人にはこういうことがわからんのです。



基本が分かればこんなことも!



f:id:cocosuzu:20170401214913p:plain



あとはこんなものも!



ソースコード3】

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-5, 5, 0.2)
y = np.sin(x)
plt.plot(x, y)
plt.show()

f:id:cocosuzu:20170401215130p:plain



以上matplotlib+Virtualenvの使い方でした。