2010-07-19 87 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