matplotlib / Pythonでバックエンドを変更する方法


90

私は次の問題に苦しんでいます。チャートのコレクションで構成されるレポートを生成する必要があります。これらのチャートはすべて、1つを除いて、Matplotlibのデフォルトバックエンド(TkAgg)を使用して作成されています。Cairoバックエンドを使用して1つのグラフを作成する必要があります。その理由は、igraphグラフをプロットしており、Cairoを使用してのみプロットできるためです。

問題は、バックエンドをその場で変更できないことです。たとえば、次の
matplotlib.pyplot.switch_backend('cairo.png') 機能は機能しません。(switch_backend機能は実験的なものであることがわかっています)

私も試しましたmatplotlib.use("cairo.png")が、インポートするmatplotlib.use("cairo.png")前にステートメントを入力する必要があるため、インポートの問題が発生しmatplotlib.pyplotます。しかし、スクリプトの存続期間中に2つの異なるバックエンドが必要です。

だから私の質問は、誰かがMatplotlibでバックエンドを切り替える方法を示すコードスニペットを持っていますか?

本当にありがとう!

更新:matplotlibをロードし、デフォルトのバックエンドを表示し、matplotlibをアンロードし、リロードしてバックエンドを変更するスニペットを作成しました。

import matplotlib
import matplotlib.pyplot as plt
import sys
print matplotlib.pyplot.get_backend()

modules = []
for module in sys.modules:
    if module.startswith('matplotlib'):
        modules.append(module)

for module in modules:
    sys.modules.pop(module)

import matplotlib
matplotlib.use("cairo.png")
import matplotlib.pyplot as plt

print matplotlib.pyplot.get_backend()

しかし、これは本当にそれを行う方法ですか?

更新2:昨日深刻な脳の凍結がありました...シンプルで最も明白な解決策は、すべてのグラフにCairoバックエンドを使用し、バックエンドをまったく切り替えないことです:)

更新3:実際には、それはまだ問題なので、matplotlibバックエンドを動的に切り替える方法を知っている人は誰でも....あなたの答えを投稿してください。


ありますpyplot.switch_backends()。あなたの場合はうまくいかないかもしれません。
jfs 2011年

回答:


60

6年後、どちらbackendを使用できるかを判断しようとしたときに、同様の問題が発生しました。以下の警告を
参照してください。

このコードスニペットは私にとってうまく機能します:

import matplotlib
gui_env = ['TKAgg','GTKAgg','Qt4Agg','WXAgg']
for gui in gui_env:
    try:
        print "testing", gui
        matplotlib.use(gui,warn=False, force=True)
        from matplotlib import pyplot as plt
        break
    except:
        continue
print "Using:",matplotlib.get_backend()

Using: GTKAgg

あなたが推測できるように、交換は新しいものを強制backendしたmatplotlib.pyplot後に再インポートするのと同じくらい簡単ですbackend

matplotlib.use('WXAgg',warn=False, force=True)
from matplotlib import pyplot as plt
print "Switched to:",matplotlib.get_backend()

Switched to: WXAgg

それでも問題が発生する場合は、このコードで次のように出力され
ます。非GUIバックエンドのリスト。
GUIバックエンドのリスト。
次に、各Guiバックエンドを使用して、それが存在し、機能しているかどうかを確認します。

import matplotlib
gui_env = [i for i in matplotlib.rcsetup.interactive_bk]
non_gui_backends = matplotlib.rcsetup.non_interactive_bk
print ("Non Gui backends are:", non_gui_backends)
print ("Gui backends I will test for", gui_env)
for gui in gui_env:
    print ("testing", gui)
    try:
        matplotlib.use(gui,warn=False, force=True)
        from matplotlib import pyplot as plt
        print ("    ",gui, "Is Available")
        plt.plot([1.5,2.0,2.5])
        fig = plt.gcf()
        fig.suptitle(gui)
        plt.show()
        print ("Using ..... ",matplotlib.get_backend())
    except:
        print ("    ",gui, "Not found")

警告:バージョン3.3.0以降のmatplotlibの変更

  • matplotlib.useの最初のパラメーターの名前がargからbackendに変更されました(キーワードを渡す場合にのみ関連します)。
  • matplotlib.useのパラメータwarnは削除されました。強制が設定されている場合、バックエンドの切り替えに失敗すると、常にImportErrorが発生するようになりました。必要に応じてそのエラーをキャッチします。
  • 最初のパラメーターを除くmatplotlib.useのすべてのパラメーターは、キーワードのみになりました。

ありがとう!これは、この例に適したバックエンドを見つけるのに非常に役立ちました:stackoverflow.com/questions/11874767/…–
James Nelson

ザクセンのロルフ、LOLはとても役に立ちました、私はまだ10年近く前からUbuntuとAndroidの投稿で応答を受け取ります。
ジェームズネルソン

warn=False引数は使用できなくなりました。
not2qubit

@ not2qubit注記-ありがとう。警告が追加されました。
ザクセンのロルフ

37

「実験的」機能があります:

import matplotlib.pyplot as plt
plt.switch_backend('newbackend')

matplotlibdocから取得。

デフォルトのバックエンドをnewbackendに切り替えます。この機能は実験的なものであり、イメージバックエンドへの切り替えでのみ機能することが 期待されています。たとえば、インタラクティブなipythonセッションから実行するPostScriptスクリプトが多数ある場合は、実行する前にPSバックエンドに切り替えて、多数のGUIウィンドウがポップアップしないようにすることができます。あるGUIバックエンドから別のGUIバックエンドにインタラクティブに切り替えようとすると、爆発します。このコマンドを呼び出すと、開いているすべてのウィンドウが閉じます。


認識されないバックエンド文字列 "newbackend"。私は何をすべきか?
TSR 2017年

5
@TSR「newbackend」を「Qt4Agg」などのGUIバックエンドに置き換えます
YashTD 2017年

14

reload組み込み関数(importlib.reloadPython 3)を使用しないのはなぜですか?

import matplotlib
matplotlib.use('agg')

matplotlib = reload(matplotlib)
matplotlib.use('cairo.png')

のように、matplotlibとmatplotlib.pyplotをリロードすることはできませんか?それとも、切り取ったコードが不完全だと言っているだけですか?
fredbaba 2016年

うーん。実際にはIPythonの癖だったかもしれません。通常のコンソールでうまく機能するようです。
狂牛病の物理学者2016年

1
これは、それが機能しないことを示す例だと思います。そうpython -c "import matplotlib.pyplot as plt; import matplotlib; from importlib import reload; matplotlib = reload(matplotlib); matplotlib.use('Agg')"ですか?
ルーカス2017年

6

ですから、これがあなたが探しているものであるかどうかは完全にはわかりません。

matplotlibの特定の構成を含むmatplotlibrcファイルを使用してバックエンドを変更できます。

スクリプトに次のように記述できます。

matplotlib.rcParams['backend'] = 'TkAgg' 

または、バックエンドを切り替えるためのそのようなもの。


2
実際、rcParamsディクショナリでバックエンドを指定することはできますが、それでは、あるバックエンドから別のバックエンドに切り替える問題は解決されません。
DrDee 2010

matplotlibによって取得される構成ファイルでデフォルトのバックエンドを設定することもできます。~/.config/matplotlib/matplotlibrc
scrutari18年

4

私の場合(Windows 10 + python 3.7)、ザクセン州の@Rolfによる最初の回答はうまく機能しませんでした。利用可能なすべての環境を試し、それらの1つを最初に、つまり直後に構成する代わりに

    import matplotlib

を使用して環境を「Agg」から「TkAgg」に変更する必要がありました

    matplotlib.use('TKAgg',warn=False, force=True)

私が実際にプロットしたコードの直前、つまり

    import matplotlib.pyplot as plt
    fig = plt.figure()
    # AND SO ON....

2

バックエンドを永続的に変更するには、次を使用できます。

  1. 最初にmatplotlibrcファイルを見つけます。

    import matplotlib
    
    matplotlib.matplotlib_fname()
    # '/Users/serafeim/.matplotlib/matplotlibrc'
    
  2. ターミナルを開き、次の手順を実行します。

    cd /Users/serafeim/.matplotlib/
    ls
    
  3. ファイルを編集します(ファイルが存在しない場合は、次のコマンドを使用touch matplotlibして作成します:作成します)。

    vim matplotlibrc
    
  4. この行を追加して保存します。

    backend: TkAgg
    


0

IPythonコンソール(Spyder内を含む)を使用している場合は、組み込みのマジックコマンドを使用して、バックエンドをすばやく切り替えることができます。例:

%matplotlib qt

コマンドで使用できるバックエンドのリストを取得します。

%matplotlib --list

利用可能なmatplotlibバックエンド:['tk'、 'gtk'、 'gtk3'、 'wx'、 'qt4'、 'qt5'、 'qt'、 'osx'、 'nbagg'、 'notebook'、 'agg'、 ' svg '、' pdf '、' ps '、'インライン '、' ipympl '、'ウィジェット ']


0

Extra Info

誰もが自分のお気に入りのバックエンドを示していますが、インストールする必要があるものと要件を理解するのは非常に面倒です。少なくとも、一般的に紛らわしくてテクノクラート的なドキュメントを理解しようとするとき。今日、私はいくつかの実験を行い、Windowsでmatplotlibを使用し、Py3.8.5(Qtを組み込まない)を使用してプロットできる、各バックエンドの最も簡単なソリューションを見つけたと思います。これが私の発見です:

#--------------------------------------
# Installing the matplotlib backends
#--------------------------------------
# https://matplotlib.org/users/installing.html

pip install pycairo                     # [1] Cairo :   GTK3 based backend (replaces: cairocffi)    [1.2 Mb]
#pip install mplcairo                   # [1] Cairo :   Easy & Specific for matplotlib              [1.7 Mb]
#pip install PyQt5                      # [2] Qt5   :   Require: Qt's qmake tool                    []
pip install PySide2                     # [3] Qt5   :   Require: shiboken2 & Clang lib bindings     [136 Mb]
pip install wxPython                    # [4] WxAgg :   ??                                          [18.1 Mb]
pip install tornado                     # [5] WebAgg:   Require: pycurl,twisted,pycares ??          [422 kb]

これらすべてのPyPiまたはリポジトリへのリンクは次のとおりです。

[1] https://pypi.org/project/pycairo/       # Requires GTK3+: https://www.gtk.org/
[1] https://pypi.org/project/mplcairo/      # https://github.com/matplotlib/mplcairo
[2] https://pypi.org/project/PyQt5/         # 
[3] https://pypi.org/project/PySide2/       # 
[4] https://pypi.org/project/wxPython/      # https://github.com/wxWidgets/Phoenix/
[4] https://github.com/wxWidgets/wxWidgets/releases
[5] https://pypi.org/project/tornado/       # https://github.com/tornadoweb/tornado

ただし、Pythonの使用に関するドキュメントTcl/Tktkinterパッケージが大量にあることを考えると、非常に驚​​くべきことに、それをインストールすることも、DLLをPythonにインポートする方法についての役立つ手順を見つけることもできませんでした。(Linuxの場合、OSパッケージマネージャーを使用するだけなので、これは簡単ですapt-get install <tk-what-not>が、このオプションはWindowsでは使用できず、単純な類似物もありません。取得できるさまざまなバイナリのリストを次に示します。

[6] http://www.bawt.tcl3d.org/download.html                 # Use Tcl-Pure (no additional packages)
[6] https://www.magicsplat.com/tcl-installer/index.html     # 
[6] https://www.irontcl.com/                                # 
[6] https://www.activestate.com/products/tcl/downloads/     # 
[6] http://tclkits.rkeene.org/fossil/wiki/Downloads         # 
[6] http://kitcreator.rkeene.org/kitcreator                 # 

おそらく誰かがこれらのいずれかをPythonにインポートする方法として私に教えてくれるでしょうか?


What backends are available and where?

次のワンライナーで自分自身を啓発しましょう:

python.exe -c "import matplotlib as m; help(m);"
python.exe -c "import matplotlib as m; print('I: {}\nN: {}'.format(m.rcsetup.interactive_bk,m.rcsetup.non_interactive_bk));"

# I: ['GTK3Agg', 'GTK3Cairo', 'MacOSX', 'nbAgg', 'Qt4Agg', 'Qt4Cairo', 'Qt5Agg', 'Qt5Cairo', 'TkAgg', 'TkCairo', 'WebAgg', 'WX', 'WXAgg', 'WXCairo']
# N: ['agg', 'cairo', 'pdf', 'pgf', 'ps', 'svg', 'template']

python.exe -c "import matplotlib as m; p=m.get_backend();print('current backend is:',p);"
# agg

python.exe -c "import matplotlib as m; p=m.matplotlib_fname(); print('The matplotlibrc is located at:\n',p);"
# C:\Python38\lib\site-packages\matplotlib\mpl-data\matplotlibrc

Setting the back-end

ドキュメントに記載されているように、バックエンドを構成するには3つの方法があります。

  1. 設定rcParams["backend"]あなたのパラメータ:( 'AGGのデフォルト)をmatplotlibrcファイルを
  2. の設定 MPLBACKEND環境(シェル)変数の
  3. 関数の使用 matplotlib.use()

Using the backend

最後に、利用可能なバックエンドを使用するには、これを行うだけです。

import matplotlib 
#matplotlib.use('tkagg', force=True)        # Agg rendering to a Tk canvas
#matplotlib.use('wxcairo', force=True)      # Cairo rendering to a wxWidgets canvas
#matplotlib.use('wxagg', force=True)        # Agg rendering to a wxWidgets canvas
matplotlib.use('webagg', force=True)        # On show() will start a tornado server with an interactive figure.

#matplotlib.use('qt5cairo', force=True)     # Cairo rendering to a Qt5 canvas
#matplotlib.use('qt5agg', force=True)       # Agg rendering to a Qt5 canvas

import matplotlib.pyplot as plt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.