如何在matplotlib / Python中更改后端


87

我正在努力解决以下问题。我需要生成包含图表集合的报告。除一个图表外,所有这些图表都是使用Matplotlib默认后端(TkAgg)制作的。需要使用Cairo后端制作一张图表,原因是我正在绘制igraph图形,并且只能使用Cairo绘制。

问题是我无法即时更改后端,例如以下操作不起作用:(
matplotlib.pyplot.switch_backend('cairo.png') 我知道switch_backend功能是实验性的)

而且我也尝试过,matplotlib.use("cairo.png")但这会导致导入问题,因为该matplotlib.use("cairo.png")声明应在导入之前出现matplotlib.pyplot。但是在脚本的整个生命周期中,我需要两个不同的后端。

因此,我的问题是有人是否有代码片段显示了如何在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后端的人..请发表您的答案。


pyplot.switch_backends()。这可能不适用于您的情况。
jfs

Answers:


59

六年后,当我尝试确定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

对于仍然遇到问题的人,此代码将打印出:
Non 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")

谢谢!这个工作很大帮助我找到这个例子中,相应的后端:stackoverflow.com/questions/11874767/...
詹姆斯尼尔森

萨克森州的罗尔夫(Rolf of Saxony),大声笑非常有帮助,我仍然在近十年前的Ubuntu和Android帖子上得到了回应。
詹姆斯·尼尔森

37

有一个“实验”功能:

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

取自matplotlib doc

将默认后端切换到newbackend。此功能是 实验性的,仅预期可用于切换到图像后端。例如,如果您要从交互式ipython会话中运行一堆PostScript脚本,则可能需要在运行PS后端之前切换到PS后端,以避免弹出一堆GUI窗口。如果尝试以交互方式从一个GUI后端切换到另一个GUI后端,则会爆炸。调用此命令将关闭所有打开的窗口。


无法识别的后端字符串“ newbackend”。我该怎么办?
TSR

4
@TSR用GUI后端(例如“ Qt4Agg”
替换

14

为什么不只使用reload内置函数(importlib.reload在Python 3中)?

import matplotlib
matplotlib.use('agg')

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

如您无法重新加载matplotlib和matplotlib.pyplot?还是您只是说我的代码被截断了?
fredbaba

嗯 实际上可能是IPython的一个怪癖。似乎在常规控制台中运行良好。
疯狂物理学家,2016年

1
我认为这是一个例子,表明它不起作用:python -c "import matplotlib.pyplot as plt; import matplotlib; from importlib import reload; matplotlib = reload(matplotlib); matplotlib.use('Agg')"是吗?
卢卡斯

6

所以我不能完全确定这是否是您想要的。

您可以通过matplotlibrc文件更改后端,该文件包含matplotlib的某些配置。

您可以在脚本中输入:

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

或类似的东西在后端之间切换。


2
确实,您可以在rcParams字典中指定后端,但这不能解决从一个后端切换到另一个后端的问题。
DrDee

您还可以在配置文件中设置默认后端,该默认后端由matplotlib拾取:~/.config/matplotlib/matplotlibrc
scrutari

4

就我而言(Windows 10 + python 3.7),萨克森州@Rolf的第一个答案不能很好地工作。而不是尝试所有可用环境并在开始时即在之后配置其中一个环境

    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中的控制台),则可以使用内置的magic命令快速切换后端,例如:

%matplotlib qt

获取与该命令一起使用的可用后端的列表:

%matplotlib --list

可用的matplotlib后端:['tk','gtk','gtk3','wx','qt4','qt5','qt','osx','nbagg','notebook','agg',' svg”,“ pdf”,“ ps”,“ inline”,“ ipympl”,“ widget”]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.