1. ホーム
  2. matplotlib

TclError: 表示名がない、$DISPLAY環境変数の解決策もない。

2022-01-23 08:17:32

matplotlibを使用して画像を生成する際、以下のエラーが発生する場合があります。

_tkinter.TclError: no display name and no $DISPLAY environment variable

 matplotlibのバックエンドの設定に問題があることが原因です。

バックエンド

matplotlibは様々な使用例や出力形式を想定しています。python のコマンドラインから対話的に matplotlib を使い、コマンドを入力するとプロットウィンドウがポップアップするものもあります。matplotlib を wxpython や pygtk などのグラフィカルユーザークロスに埋め込んで、リッチなアプリケーションを構築することもできます。数値シミュレーションからポストスクリプトイメージを生成するバッチスクリプトや、画像を動的に生成するウェブアプリケーションサービスでの matplotlib の利用があります。

これらのユースケースをすべてサポートするために、matplotlib は、それぞれバックエンドと呼ばれる異なる出力を指向することができます。バックエンドは、グラフィックスを生成するために舞台裏ですべての作業を行います。バックエンドには、インタラクティブとノンインタラクティブの2種類があります。インタラクティブは、pygtk、wxpython、tkinter、qt4、macosxで使用され、ユーザーインターフェースバックエンドとしても知られています。Non-interactiveはPNG, SVG, PDF, PSなどで使われ、ハードコピーバックエンドとしても知られています。

バックエンドの設定は4つあり、優先順位の高い順に並べられ、4つの設定が衝突した場合は、優先順位の高い設定が優先されます。

1. matplotlibrcファイル内のバックエンド設定、例.

backend : Agg

2. 現在のシェルまたはスクリプトにMPLBACKEND環境変数を設定します。これは、たとえ現在の作業ディレクトリに matplotlibrc ファイルがあったとしても、環境変数によって上書きされます、例えば。

#Current shell
export MPLBACKEND=Agg
#Only for the current script test.py
MPLBACKEND=Agg python test.py

3. 単一のスクリプトのバックエンドを設定することで、スクリプトの実行時に -d コマンドライン引数を使用することもできますが、-d 引数はコマンドライン引数を解析するスクリプトと衝突することがあるので、これはお勧めしません、例えば。

python test.py -dbackend Agg

4. スクリプトが特定のバックエンドに依存している場合、例えば use() 関数を使用することができます。

import matplotlib
matplotlib.use('Agg') 

use() 関数を使用する場合、matplotlib.pyplot をインポートする前に行う必要があり、そうでなければ use 関数は無効となります。use 関数を使用すると、別のバックエンドを使用したい場合、コードの変更が必要になります。したがって、明示的に use() を呼び出すことは、必要なければ避けるべきです。

ソリューション

解決策は、適切な バックエンド で、matplotlibのデフォルト設定を変更したくない場合は、2つ目の方法を使うことができます。

その他

matplotlib は、以下の順序で matplotlibrc ファイルを探します。

1. 現在の作業ディレクトリ。通常、他の場所に適用したくない特別なカスタマイズのために使用します。

2. $MATPLOTLIBRC/matplotlibrc です。

3. ユーザーディレクトリ、LinuxとFreeBSDでは.config/matplotlib/matplotlibrc(または$XDG_CONFIG_HOME/matplotlib/matplotlibrc)にあるかも知れません。他のプラットフォームでは、.matplotlib/matplotlibrcにあるかもしれません。

4. Pythonインストールディレクトリのsite-packages/matplotlib/mpl-data/matplotlibrc。このファイルはmatplotlibをインストールするたびに上書きされるので、カスタマイズを保存したい場合は、このファイルを特定のユーザーディレクトリに移動させる必要があります。