継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

Mac で Matplotlib のグラフが描画できない問題の対処方法

タダです.

現在,ベータ版である Pyhon3 エンジニア検定データ分析試験を受験するために指定書籍で勉強を進めています.自前の Mac で環境構築し勉強中に Matplotlib のグラフが描画できない問題が起こり,その問題に対処したので対応内容をまとめます.

なお,環境は以下になります.Python の実行環境は venv の仮想環境で作っていました.

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.6
BuildVersion:   18G95
$ python -V
Python 3.6.8
$ cat requirements.txt
~中略~
matplotlib==2.2.2

問題の事象

Matplotlib の次のコードを作ったので実行してみたところエラーがでました.

import matplotlib.pyplot as plt

x = [1,2,3]
y = [2,4,9]

plt.plot(x,y)
plt.title('Test-Graph')
plt.show()

エラー文の内容が以下のようなものでした.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 1 import matplotlib.pyplot as plt と記載があるため,Matplotlib の backend に関する指定が怪しそうという推測をしました.

$ python dev-matplotlib.py
Traceback (most recent call last):
  File "dev-matplotlib.py", line 1, in <module>
    import matplotlib.pyplot as plt
  File "/xxxx/xxxx/pydataenv/lib/python3.6/site-packages/matplotlib/pyplot.py", line 115, in <module>
    _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
  File "/xxxx/xxxx/pydataenv/lib/python3.6/site-packages/matplotlib/backends/__init__.py", line 62, in pylab_setup
  1 Provides a MATLAB-like plotting framework.
    [backend_name], 0)
  File "/xxxx/xxxx/pydataenv/lib/python3.6/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   1 import matplotlib.pyplot as plt

変更前の設定の確認

Matplotlib の設定ファイルの場所を確認してみると,最初は仮想環境のsite-packagesディレクトリ配下に指定となっており,確認してみたところbackendの指定はmacosxとなっていました.ググると,site-packagesディレクトリ配下をいじるのはよくない対応という記述を見つけたため ~/.matplotlib/matplotlibrcを変更して対応します.

$ python -c "import matplotlib;print(matplotlib.matplotlib_fname())"
/xxxx/xxxx/pydataenv/lib/python3.6/site-packages/matplotlib/mpl-data/matplotlibrc
$ cat /xxxx/xxxx/pydataenv/lib/python3.6/site-packages/matplotlib/mpl-data/matplotlibrc | grep backend
~中略~
backend      : macosx

設定変更方法について

設定変更は簡単です. 以下のように対応してみて再度グラフを描画することができました.

$ echo "MacOSX" >  ~/.matplotlib/matplotlibrc
$ cat  ~/.matplotlib/matplotlibrc
backend : MacOSX

再描画 f:id:sadayoshi_tada:20190922000907p:plain

Matplotlib のbackend 設定

余談ですが, Matplotlib のbackend設定はいくつかオプションがあります.今回設定した MacOSX グラフを描画できなかったので最初は設定自体が誤りかと思ったのですが,設定ファイルの場所が変えることで動作することを確認できたので設定値として適切です.利用方法に合わせてbackendを設定していきましょう.

Select the backend used for rendering and GUI integration.
Parameters
----------
backend : str
    The backend to switch to.  This can either be one of the standard
    backend names, which are case-insensitive:
    - interactive backends:
      GTK3Agg, GTK3Cairo, MacOSX, nbAgg,
      Qt4Agg, Qt4Cairo, Qt5Agg, Qt5Cairo,
      TkAgg, TkCairo, WebAgg, WX, WXAgg, WXCairo
    - non-interactive backends:
      agg, cairo, pdf, pgf, ps, svg, template
    or a string of the form: ``module://my.module.name.

参考URL

matplotlib.org

[https://github.com/matplotlib/matplotlib/blob/98507c076c29fea1a70711f4dc7df32cdd7ec3c7/lib/matplotlib/init.py#L1207-L1241:embed:cite]

まとめ

Mac の Matplotlib のグラフ描画できない問題への対処方法をまとめました.同じ問題に遭遇した方の何か参考になれば幸いです!