韜晦日記

韜晦日記

Rietveldよりもプログラミングメインになりつつある

Rietveld解析初心者による備忘録とつぶやき

Python3でmatplotlibを使おうとしたらハマったので解決法の備忘録

MacbookProを買い、もう2ヶ月ほどが経とうとしています。 あっという間にMacに慣れ、その辺のMACerよりは使いこなせるようになって来たんじゃないかと思います。でもやっぱり10年近くWindowsを使っていたのでWindowsが体に馴染みますな。。

MacにはWindowsにはない良いところが沢山あるし、クソな所もまあある。それはWindowsも同じで、結局使う人次第なんだなとつくづく思います。 OS批判をしている人は基本的には単に使いこなせていないか、使いこなすのが面倒だという人でしょう。

本題に入ろうか。

実験データをプロットするためにMac版のOffice Excelを使ってたのだがこれがマジでクソすぎる。てかMac版Officeが全体的にクソすぎで笑うしかない。Mac民がMicrosoftを蔑むのもこれを見たら仕方ない気もする。そんなレベル。
と、見事に序盤の発言が転覆している訳で。 そんな訳で、Excelには見切りをつけてPythonからGnuplotなりMatplotlibを使ってデータをプロットすることにした。
MacにはデフォルトでPython2.7がインストールされているが、やはり最新のPython3を使いたいのでインストールする。

本当の本題

環境は以下の通り。

MacOS 10.13 High Sierra
Python3(3.7.0)

Pythonのインストール手順

なんでエラーが起きたのか今後の為に一応インストール手順を記します。

  1. homebrewのインストール

  2. homebrewでpython3をインストール

  3. homebrewでpyenvをインストール

  4. pyenvのコマンドを使えるようにパスを通す

  5. python3系のバージョンを選択してインストール

  6. インストールしたpythonのバージョンに切り替え

  7. pip3を使って諸々のライブラリ(numpy, matplotlibなど)をインストール

てな感じです。この辺を参考にしました。 hajipro.com いやあ、Unix系の環境構築の楽さが沁みる。Windowsだったら倍の時間かかってただろう。 この辺はやっぱりMacが強い。

謎のエラー

と言うことで、早速グラフをプロットしてみようと以下のコードを実行してみた。

import matplotlib.pyplot as plt
import numpy as np

# データ生成
x = np.linspace(0, 10, 100)
y = x + np.random.randn(100)

# プロット
plt.plot(x, y, label="test")

# 凡例の表示
plt.legend()

# プロット表示(設定の反映)
plt.show()

すると以下のエラーを吐き出した。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/UserName/.pyenv/versions/3.7.0/lib/python3.7/site-packages/matplotlib/pyplot.py", line 115, in <module>
    _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
  File "/Users/UserName/.pyenv/versions/3.7.0/lib/python3.7/site-packages/matplotlib/backends/__init__.py", line 62, in pylab_setup
    [backend_name], 0)
  File "/Users/UserName/.pyenv/versions/3.7.0/lib/python3.7/site-packages/matplotlib/backends/backend_macosx.py", line 17, in <module>
    from matplotlib.backends import _macosx
RuntimeError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. If you are using (Ana)Conda please install python.app and replace the use of 'python' with 'pythonw'. See 'Working with Matplotlib on OSX' in the Matplotlib FAQ for more information.

いやあ、これが原因が全然わからない。 しかし、TracebackとかRuntimeErrorで調べるとバックエンドの問題が発生しているそうな。僕には分からないけど。

解決法

$ python -c "import matplotlib;print(matplotlib.matplotlib_fname())"

とターミナルに打ち込んで、matplotlibrcという名のファイルを探す。 このファイルをエディタで開き、35~40行目あたりにある

backend : macosx

backend : TkAgg

に変更すると良いそうだ。 実際にやってみたら治った。 めでたしめでたいし。

参考文献

Pythonでmatplotlibをimportするとエラーが出る場合の対処策(Mac) - Qiita

pyenvとvirtualenvで環境構築した時にmatplotlib.pyplotが使えなかった時の対処法 - Qiita

Python 3.3でmatplitlibとpylabを使おうとしたら RuntimeError: Python is not installed as a frameworkというエラーが発生したときの解決方法 - Qiita

matplotlibを使ってみる - abcdefg.....

f:id:tanisuke_str:20180704205505p:plain
実際にプロットできた様子。