99

我正在努力解决以下问题。我需要生成包含一组图表的报告。所有这些图表,除了一个,都是使用 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 后端的人......请发布您的答案。

4

9 回答 9

70

六年后,当我试图决定哪个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.pyplotbackend

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 重命名为 backend(仅当您通过关键字传递时才相关)。
  • matplotlib.use 的参数 warn 已被删除。如果设置了强制,切换后端失败现在将始终引发 ImportError;如有必要,请捕获该错误。
  • matplotlib.use 除了第一个参数之外的所有参数现在都是关键字。
于 2017-03-25T11:31:49.683 回答
39

有一个“实验性”功能:

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

取自matplotlib 文档

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

于 2011-06-16T12:57:25.930 回答
15

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

import matplotlib
matplotlib.use('agg')

matplotlib = reload(matplotlib)
matplotlib.use('cairo.png')
于 2013-02-07T23:48:06.083 回答
7

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

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

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

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

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

于 2010-07-19T23:28:07.137 回答
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....
于 2019-06-03T07:07:19.220 回答
4

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/Tktkinterpython 包,非常令人惊讶的是,我无法安装它,也找不到任何关于如何将 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 种方式来配置你的后端:

  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
于 2020-12-19T07:23:13.080 回答
3

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

  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
    
于 2019-07-18T09:06:53.790 回答
3

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

%matplotlib qt

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

%matplotlib --list

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

于 2020-10-05T22:51:50.387 回答
1

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

于 2011-06-07T19:24:41.080 回答