web-dev-qa-db-ja.com

matplotlibでバックエンドを切り替える方法/ Python

私は次の問題に苦労しています。チャートのコレクションで構成されるレポートを生成する必要があります。 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:昨日、深刻な脳の凍結がありました...シンプルで最も明白な解決策は、すべてのチャートにカイロバックエンドを使用し、バックエンドをまったく切り替えないことです:)

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

65
DrDee

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の交換は、新しいbackendを強制した後にmatplotlib.pyplotを再インポートするのと同じくらい簡単です。

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")
43
Rolf of Saxony

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

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

matplotlib doc から取得。

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

34
oyo

reload 組み込み関数( importlib.reload in Python 3)?

import matplotlib
matplotlib.use('agg')

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

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

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

スクリプトに以下を配置できます。

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

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

3
helperfunction

別のPythonプロセスでそのプロットを作成することもできます。おそらくpickleまたは joblib を使用します。

1
Ken Arnold

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

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

    import matplotlib
    
    matplotlib.matplotlib_fname()
    # '/Users/serafeim/.matplotlib/matplotlibrc'
    
  2. terminalを開いて、次を実行します。

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

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

    backend: TkAgg
    
1
serafeim

私の場合(Windows 10 + python 3.7)、Saxonyの@Rolfによる最初の答えはあまりうまくいきませんでした。 、つまり直後

    import matplotlib

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

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

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

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