Archlinuxでpyenvを使いつつmatplotlibを動かす

Archlinuxでmatplotlibを使いたい場合、pacmanに用意されたパッケージを利用すれば簡単にグラフが出せます。たぶん。

ただそれを自分で入れたpyenvの環境でやりたかったがためのメモ

なぜmatplotlib

今回はO'Reilly Japan - 実践 機械学習システムの環境を整えました。

まずは本の内容通りにコードを書いて表示しよう!と思ったのですがまったく結果が表示されない。
原因がわからない。 GUIに利用できるライブラリがないんじゃないかこれと思い、とりあえずQtバインディングのライブラリを入れました。

Pythonとmatplotlib

matplotlibPythonで利用可能なプロットツールです。 プロットツールということで、プロットしたものを表示するGUI環境が必要です。 今回はQtを利用することにし、QtとPythonについて調べました。

PythonとQt

QtはC++から利用なGUIフレームワークです。
(これでキュートと読むらしい。今までキューティーと読んでた…)
C++から利用可能なものをPythonで利用するということは、つまりバインディングされているわけで、
よくあるパターンですが、Qtを使うための複数のライブラリが存在しています。

代表的な2つとして挙げられるのが

のようです(要出典)

PyQt

PyQtpipでインストールできません そしてライセンスがGPLです(商用ライセンスもある)。
ちょっと使いづらいですね。

ただ、現状Qt5を利用できるのはPyQtだけのようです(PyQt5)
Qt5をつかうため+後述の理由があったため、今回はPyQt5を入れました。
Qt5使う理由は特になくて新しい物使っとこうかな程度です。

PySide

PySideはpipでインストールできます
そしてライセンスがLGPLです。PyQtよりも使いやすいですね。

今回PyQtを使うに至った大きな理由は、PySideがまだPython3.5で利用できなかったためです。
Python詳しくないですがなんとなく新しい物使いたい病なので苦労しながらPyQt入れました。

導入する

2つのライブラリ(SIP、PyQt5)をダウンロード、コンパイル、インストールします。

SIPPythonから簡単にC++ライブラリを使えるようにするライブラリ(Riverbank | Software | SIP | What is SIP?) で、PyQtが依存しています。
なのでSIPから先にインストールします。

wget http://sourceforge.net/projects/pyqt/files/sip/sip-4.17/sip-4.17.tar.gz
tar zxf sip-4.17.tar.gz
cd sip-4.17
python3 configure.py
make
make install

SIPはすんなり入るはずです。次にPyQtを入れましょう。 事前にpacmanyaourtを使ってqt5-baseパッケージをインストールしておいてください。

wget http://sourceforge.net/projects/pyqt/files/PyQt5/PyQt-5.5.1/PyQt-gpl-5.5.1.tar.gz
tar zxf PyQt-gpl-5.5.1.tar.gz
cd PyQt-gpl-5.5.1
python3 configure.py
make
sudo make install

どうやら共有ライブラリをシステム領域に入れるらしく、sudoがないとインストールできません。 (インストール場所指定しておけばよかったなと後で思いました)

これでライブラリの導入は完了です。

設定ファイル

ライブラリは入ったはずなのに相変わらずmatplotlibでplotができず、しばらくうんうん唸ってました。 どうやら、matplotlib用のconfigファイルがあるらしいです。

import matplotlib
matplotlib.matplotlib_fname()

で現在読み込まれているconfigファイルの場所がわかります。

$HOME/.config/matplotlibに設定ファイルを置くと読んでくれるらしいので、最初に読み込まれていたconfigファイルを複製して$HOME/.config/matplotlib/matplotlibrcとして読み込ませ、その内容を一部書き換えました。

書き換えた場所

--- $HOME/.pyenv/versions/3.5.0/lib/python3.5/site-packages/matplotlib/mpl-data/matplotlibrc 2015-12-13 18:54:09.000000000 +0900
+++ $HOME/.config/matplotlib/matplotlibrc   2015-12-14 07:46:21.760050011 +0900
@@ -35,7 +35,7 @@
 # You can also deploy your own backend outside of matplotlib by
 # referring to the module name (which must be in the PYTHONPATH) as
 # 'module://my_backend'.
-backend      : agg
+backend      : Qt5Agg
 
 # If you are using the Qt4Agg backend, you can choose here
 # to use the PyQt4 bindings or the newer PySide bindings to

これで無事plotできるようになりました。 最後のconfigファイル書き換えるだけで最初からQt以外使って描画できてた気がする。