如何在 matplotlib / Python 中更改后端

Posted

技术标签:

【中文标题】如何在 matplotlib / Python 中更改后端【英文标题】:How to change backends in matplotlib / Python 【发布时间】:2011-03-18 03:28:12 【问题描述】:

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

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

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

所以我的问题是有人有代码 sn-p 显示如何在 Matplotlib 中切换后端?

非常感谢!

更新: 我写了一个 sn-p 加载 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:我昨天有严重的大脑冻结...简单且最明显的解决方案是对所有图表使用 Cairo 后端,并且根本不切换后端 :)

更新 3:实际上,这仍然是一个问题,所以任何知道如何动态切换 matplotlib 后端的人......请发布您的答案。

【问题讨论】:

pyplot.switch_backends()。它可能不适用于您的情况。 【参考方案1】:

六年后,我在尝试确定可以使用哪个 backend 时遇到了类似的问题。 注意见注意事项 - 下面

这段代码 sn-p 很适合我:

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

对于那些仍有问题的人,此代码将打印出: 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")

注意事项:matplotlib 自 3.3.0 版以来的变化

matplotlib.use 的第一个参数已从 arg 重命名为 后端(仅当您通过关键字传递时才相关)。 matplotlib.use 的参数 warn 已被移除。切换失败 如果设置了 force,后端现在将始终引发 ImportError;抓住 如有必要,该错误。 matplotlib.use 的所有参数,除了第一个参数现在都是关键字。

【讨论】:

谢谢!这非常有用,可以帮助我找到适合此示例的后端:***.com/questions/11874767/… Rolf of Saxony,LOL 非常有帮助,我仍然在近十年前的 Ubuntu 和 android 帖子上收到回复。 warn=False 参数不再可用。 不得不说谢谢。您为我节省了大量工作! @bob.sacamento 好消息,那么我的工作就完成了;)【参考方案2】:

有一个“实验性”功能:

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

取自matplotlib doc。

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

【讨论】:

无法识别的后端字符串“newbackend”。我该怎么办? @TSR 将“newbackend”替换为 GUI 后端,例如“Qt4Agg”【参考方案3】:

为什么不直接使用reload 内置函数(Python 3 中的importlib.reload)?

import matplotlib
matplotlib.use('agg')

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

【讨论】:

因为你不能重新加载 matplotlib 和 matplotlib.pyplot?还是你只是说我截取的代码不完整? 嗯。可能实际上是 IPython 的一个怪癖。似乎在常规控制台中运行良好。 我认为这是一个例子,它表明它不起作用:python -c "import matplotlib.pyplot as plt; import matplotlib; from importlib import reload; matplotlib = reload(matplotlib); matplotlib.use('Agg')" 是吗?【参考方案4】:

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

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

在你的脚本中你可以写:

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

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

【讨论】:

确实,您可以在 rcParams 字典中指定后端,但这并不能解决从一个后端切换到另一个后端的问题。 你也可以在matplotlib获取的配置文件中设置默认后端:~/.config/matplotlib/matplotlibrc【参考方案5】:

就我而言(Windows 10 + python 3.7),@Rolf of Saxony 的第一个答案效果不佳。而不是一开始就尝试所有可用的环境并配置其中一个, 即,就在

之后
    import matplotlib

我必须使用将环境从“Agg”更改为“TkAgg”

    matplotlib.use('TKAgg',warn=False, force=True)

就在我实际绘制的代码之前,即

    import matplotlib.pyplot as plt
    fig = plt.figure()
    # AND SO ON....

【讨论】:

【参考方案6】:

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,这很简单,因为您只需使用 OS 包管理器 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 种方式来配置您的后端:

    ma​​tplotlibrc 文件中设置 rcParams["backend"](默认值:'agg')参数 设置MPLBACKEND 环境(shell)变量 使用函数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

【讨论】:

这个答案对于那些使用 Windows 操作系统的人来说是一个非常有用的资源。【参考方案7】:

要永久更改后端,您可以使用:

    首先找到matplotlibrc文件:

    import matplotlib
    
    matplotlib.matplotlib_fname()
    # '/Users/serafeim/.matplotlib/matplotlibrc'
    

    打开终端并执行:

    cd /Users/serafeim/.matplotlib/
    ls
    

    编辑文件(如果它不存在使用这个命令:touch matplotlib 创建它):

    vim matplotlibrc
    

    添加这一行并保存:

    backend: TkAgg
    

【讨论】:

当我将 TkAgg 放入我的程序时,它可以工作。但是当我在 matplotlibrc 中添加最后一行并且没有在我的程序中指定后端时,它给了我 TypeError。【参考方案8】:

如果您使用的是 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']

【讨论】:

【参考方案9】:

您也可以使用不同的 Python 进程来绘制该图,可能在 pickle 或 joblib 的帮助下。

【讨论】:

以上是关于如何在 matplotlib / Python 中更改后端的主要内容,如果未能解决你的问题,请参考以下文章

如何在 matplotlib / Python 中更改后端

如何更改 matplotlib(python)中的字体?

Python中使用matplotlib 如何绘制折线图?

如何使用matplotlib在python中绘制向量

如何使用 matplotlib 在 python 中绘制 3D 密度图

我如何(在 Python 中)通过使用 blitting 从绘图中删除 matplotlib 艺术家?