如何更改 matplotlib 后端

2025-02-11 09:50:00
admin
原创
60
摘要:问题描述:我正在努力解决以下问题。我需要生成包含一组图表的报告。除一张外,所有这些图表都是使用 Matplotlib 默认后端 (TkAgg) 制作的。一张图表需要使用 Cairo 后端制作,原因是我正在绘制 igraph 图,而这只能使用 Cairo 绘制。问题是我无法动态更改后端,例如以下操作不起作用:(...

问题描述:

我正在努力解决以下问题。我需要生成包含一组图表的报告。除一张外,所有这些图表都是使用 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:昨天我脑子有些发愣...最简单、最明显的解决方案就是对所有图表使用 Cairo 后端,而根本不要切换后端 :)

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


解决方案 1:

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

对于那些仍然遇到问题的人,此代码将打印出:

非 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")

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

  • matplotlib.use 的第一个参数已从 arg 重命名为 backend(仅当您通过关键字传递时才相关)。

  • matplotlib.use 的参数 warn 已被删除。如果设置了 force,则切换后端失败现在将始终引发 ImportError;如有必要,请捕获该错误。

  • matplotlib.use 除第一个参数之外的所有参数现在都是仅限关键字的。

解决方案 2:

有一个“实验性”功能:

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

摘自matplotlib 文档。

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

解决方案 3:

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

import matplotlib
matplotlib.use('agg')

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

解决方案 4:

所以我不完全确定这是否就是你要找的。

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

您可以在脚本中输入:

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

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

解决方案 5:

如果您使用 IPython 控制台(包括在 Spyder 内),您可以使用内置的魔术命令快速切换后端,例如:

%matplotlib qt

使用以下命令获取可用的后端列表:

%matplotlib --list

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

解决方案 6:

Extra Info

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

#--------------------------------------
# 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: {}
N: {}'.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:
',p);"
# C:Python38libsite-packagesmatplotlibmpl-datamatplotlibrc

Setting the back-end

正如文档所述:有三种方法可以配置后端:

  1. 在matplotlibrc文件中设置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

解决方案 7:

就我的情况而言(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....

解决方案 8:

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

  1. 首先找到matplotlibrc文件:

import matplotlib

matplotlib.matplotlib_fname()
# '/Users/serafeim/.matplotlib/matplotlibrc'
  1. 打开终端并执行:

cd /Users/serafeim/.matplotlib/
ls
  1. 编辑文件(如果不存在请使用此命令:touch matplotlib创建它):

vim matplotlibrc
  1. 添加此行并保存:

backend: TkAgg

解决方案 9:

您还可以使用不同的 Python 进程来绘制该图,可能借助 pickle 或joblib。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用