2010-07-19 93 views
45

我正在努力解決以下問題。我需要生成由一系列圖表組成的報表。所有這些圖表,除了一個,都是使用Matplotlib默認後端(TkAgg)製作的。一張圖需要使用開羅後端製作,原因是我正在繪製一張igraph圖,而且只能使用開羅進行繪製。如何在matplotlib/Python中切換後端

的問題是,我不能改變後端上的蒼蠅,例如以下不工作:
matplotlib.pyplot.switch_backend('cairo.png') (我知道switch_backend功能實驗)

,我自己也嘗試matplotlib.use("cairo.png")但這導致導入問題,因爲在導入matplotlib.pyplot之前matplotlib.use("cairo.png")聲明應該出現。 但在腳本的生命週期中,我需要兩個不同的後端。

所以我的問題是有人有一個代碼片斷,顯示如何切換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後端的人......請發佈你的答案。

+0

有'pyplot.switch_backends()'。它可能不適用於你的情況。 – jfs 2011-01-30 05:59:10

回答

0

所以我不完全確定這是你在找什麼。

您可以通過matplotlibrc文件更改後端,該文件包含matplotlib的某些配置。

在你的腳本,你可以把:

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

或類似的東西到後端之間進行切換。

+2

的確,您可以在rcParams字典中指定後端,但這並不能解決從一個後端切換到另一個後端的問題。 – DrDee 2010-07-20 22:03:37

1

你也可以有一個不同的Python進程製作這個圖,可能在pickle或joblib的幫助下。

32

有一個 「實驗性」 的特點:

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

matplotlib doc拍攝。

將默認後端切換到newbackend。此功能是 實驗,並且只能工作切換到 圖像後端。例如,如果您想從一個交互式ipython會話運行一堆PostScript腳本,您可能希望 在運行它們之前切換到PS後端,以避免彈出一串 GUI窗口。如果您嘗試以交互方式將 從一個GUI後端切換到另一個,則會爆炸。 調用此命令將關閉所有打開的窗口。

+0

無法識別的後端字符串「newbackend」。我該怎麼辦? – TSR 2017-06-05 07:01:12

+1

@TSR用GUI後端替換'newbackend',例如'Qt4Agg' – YashTD 2017-06-14 10:39:20

10

爲什麼不使用reload內置函數(在Python 3中爲importlib.reload)?

import matplotlib 
matplotlib.use('agg') 

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

如果您導入了pyplot,則這不起作用。 – 2016-06-22 19:03:05

+0

由於在你無法重新加載matplotlib和matplotlib.pyplot?或者你只是說我的代碼片斷不完整? – fredbaba 2016-06-29 23:43:28

+0

嗯。實際上可能是IPython的一個怪癖。似乎在常規控制檯中運行良好。 – 2016-06-30 14:45:01

15

六年後,當我試圖決定哪一個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.use('WXAgg',warn=False, force=True) 
from matplotlib import pyplot as plt 
print "Switched to:",matplotlib.get_backend() 

Switched to: WXAgg 

對於那些仍然有問題後matplotlib.pyplot ,此代碼將打印出:Non 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") 
+0

謝謝!這工作很好,幫助我找到適合這個例子的後端:http://stackoverflow.com/questions/11874767/real-time-plotting-in-while-loop-with-matplotlib – 2017-04-26 00:10:48

+0

@JamesNelson很高興聽到一個答案是6年後,使用 – 2017-04-26 08:39:39

+0

Rolf of Saxony,LOL非常有幫助,我仍然在近10年前在Ubuntu和Android的帖子上得到回覆。 – 2017-04-26 13:40:09