如何在matplotlib / Python中切换后端

时间:2010-07-19 21:21:00

标签: python matplotlib backend cairo

我正在努力解决以下问题。我需要生成由一组图表组成的报告。除了一个之外,所有这些图表都是使用Matplotlib默认后端(TkAgg)制作的。需要使用开罗后端制作一张图表,原因是我正在绘制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后端的人....请发布你的答案。

9 个答案:

答案 0 :(得分:41)

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

答案 1 :(得分:34)

有一个“实验性”功能:

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

取自matplotlib doc

  

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

答案 2 :(得分:13)

为什么不使用{3}内置函数(Python 3中的reload)?

import matplotlib
matplotlib.use('agg')

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

答案 3 :(得分:3)

所以我不完全确定这是否是您正在寻找的。

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

在您的脚本中,您可以输入:

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

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

答案 4 :(得分:3)

Extra Info

尽管每个人都展示了自己最喜欢的后端,但弄清楚需要安装什么以及要求是什么还是很麻烦的。至少当您尝试理解通常令人困惑和技术官僚的文档时。今天我做了几个实验,并认为我已经为每个后端找到了最简单的解决方案,能够在 Windows 中使用 matplotlib 和使用 Py3.8.5(没有内置 Qt)进行绘图。以下是我的发现:

#--------------------------------------
# Installing the matplotlib backends
#--------------------------------------
# https://matplotlib.org/users/installing.html

pip install pycairo                     # [1] Cairo :   GTK3 based backend (replaces: cairocffi)    [1.2 Mb]
#pip install mplcairo                   # [1] Cairo :   Easy & Specific for matplotlib              [1.7 Mb]
#pip install PyQt5                      # [2] Qt5   :   Require: Qt's qmake tool                    []
pip install PySide2                     # [3] Qt5   :   Require: shiboken2 & Clang lib bindings     [136 Mb]
pip install wxPython                    # [4] WxAgg :   ??                                          [18.1 Mb]
pip install tornado                     # [5] WebAgg:   Require: pycurl,twisted,pycares ??          [422 kb]

以下是所有这些 PyPi 或 Repos 的链接:

[1] https://pypi.org/project/pycairo/       # Requires GTK3+: https://www.gtk.org/
[1] https://pypi.org/project/mplcairo/      # https://github.com/matplotlib/mplcairo
[2] https://pypi.org/project/PyQt5/         # 
[3] https://pypi.org/project/PySide2/       # 
[4] https://pypi.org/project/wxPython/      # https://github.com/wxWidgets/Phoenix/
[4] https://github.com/wxWidgets/wxWidgets/releases
[5] https://pypi.org/project/tornado/       # https://github.com/tornadoweb/tornado

然而,鉴于使用 Tcl/Tk 和 Python 的 tkinter 包的大量文档,非常令人惊讶的是,我无法安装它,也找不到任何有关如何将 DLL 导入 python 的有用说明。 (对于 linux,这是微不足道的,因为您只使用操作系统包管理器 apt-get install <tk-what-not>,但此选项不适用于 Windows,也没有任何简单的类似物。这里是您可以获得的众多不同二进制文件的列表.

[6] http://www.bawt.tcl3d.org/download.html                 # Use Tcl-Pure (no additional packages)
[6] https://www.magicsplat.com/tcl-installer/index.html     # 
[6] https://www.irontcl.com/                                # 
[6] https://www.activestate.com/products/tcl/downloads/     # 
[6] http://tclkits.rkeene.org/fossil/wiki/Downloads         # 
[6] http://kitcreator.rkeene.org/kitcreator                 # 

也许有人可以启发我如何将这些导入到 python 中?


What backends are available and where?

让我们用以下单行代码来启发自己:

python.exe -c "import matplotlib as m; help(m);"
python.exe -c "import matplotlib as m; print('I: {}\nN: {}'.format(m.rcsetup.interactive_bk,m.rcsetup.non_interactive_bk));"

# I: ['GTK3Agg', 'GTK3Cairo', 'MacOSX', 'nbAgg', 'Qt4Agg', 'Qt4Cairo', 'Qt5Agg', 'Qt5Cairo', 'TkAgg', 'TkCairo', 'WebAgg', 'WX', 'WXAgg', 'WXCairo']
# N: ['agg', 'cairo', 'pdf', 'pgf', 'ps', 'svg', 'template']

python.exe -c "import matplotlib as m; p=m.get_backend();print('current backend is:',p);"
# agg

python.exe -c "import matplotlib as m; p=m.matplotlib_fname(); print('The matplotlibrc is located at:\n',p);"
# C:\Python38\lib\site-packages\matplotlib\mpl-data\matplotlibrc

Setting the back-end

正如文档所说:配置后端有 3 种方法:

  1. 在您的 ma​​tplotlibrc 文件中设置 rcParams["backend"](默认值:'agg')参数
  2. 设置 MPLBACKEND 环境(shell)变量
  3. 使用函数matplotlib.use()

Using the backend

最后,使用您的可用后端只需执行以下操作:

import matplotlib 
#matplotlib.use('tkagg', force=True)        # Agg rendering to a Tk canvas
#matplotlib.use('wxcairo', force=True)      # Cairo rendering to a wxWidgets canvas
#matplotlib.use('wxagg', force=True)        # Agg rendering to a wxWidgets canvas
matplotlib.use('webagg', force=True)        # On show() will start a tornado server with an interactive figure.

#matplotlib.use('qt5cairo', force=True)     # Cairo rendering to a Qt5 canvas
#matplotlib.use('qt5agg', force=True)       # Agg rendering to a Qt5 canvas

import matplotlib.pyplot as plt

答案 5 :(得分:1)

您可能还有一个不同的Python流程制作该剧情,可能借助于pickle或joblib

答案 6 :(得分:1)

要永久更改后端,可以使用以下命令:

  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
    

答案 7 :(得分:0)

在我的情况下(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....

答案 8 :(得分:0)

如果您使用的是IPython控制台(包括Spyder中的控制台),则可以使用built-in magic commands快速切换后端,例如:

%matplotlib qt

获取与该命令配合使用的可用后端列表:

%matplotlib --list

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