私は次の問題に苦労しています。チャートのコレクションで構成されるレポートを生成する必要があります。 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バックエンドを動的に切り替える方法を知っている人は誰でも...答えを投稿してください。
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")
「実験的」機能があります。
import matplotlib.pyplot as plt
plt.switch_backend('newbackend')
matplotlib doc から取得。
デフォルトのバックエンドをnewbackendに切り替えます。この機能はexperimentalであり、イメージバックエンドへの切り替えでのみ機能すると予想されます。たとえば、インタラクティブなipythonセッションから実行したいPostScriptスクリプトがたくさんある場合、GUIウィンドウのポップアップが表示されないように、実行する前にPSバックエンドに切り替えるとよいでしょう。あるGUIバックエンドから別のGUIバックエンドにインタラクティブに切り替えようとすると、爆発します。このコマンドを呼び出すと、開いているすべてのウィンドウが閉じます。
reload
組み込み関数( importlib.reload
in Python 3)?
import matplotlib
matplotlib.use('agg')
matplotlib = reload(matplotlib)
matplotlib.use('cairo.png')
したがって、これがあなたが探しているものかどうかは完全にはわかりません。
Matplotlibの特定の構成を含むmatplotlibrcファイルを使用して、バックエンドを変更できます。
スクリプトに以下を配置できます。
matplotlib.rcParams['backend'] = 'TkAgg'
またはバックエンドを切り替えるためのそのような何か。
別のPythonプロセスでそのプロットを作成することもできます。おそらくpickleまたは joblib を使用します。
バックエンドを永続的に変更するには、これを使用できます
最初にmatplotlibrc
ファイルを見つけます:
import matplotlib
matplotlib.matplotlib_fname()
# '/Users/serafeim/.matplotlib/matplotlibrc'
terminalを開いて、次を実行します。
cd /Users/serafeim/.matplotlib/
ls
ファイルを編集します(存在しない場合は、次のコマンドを使用します:touch matplotlib
作成します):
vim matplotlibrc
この行を追加して保存します。
backend: TkAgg
私の場合(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....