如何更改matplotlib后端

svdrlsy4  于 2023-06-23  发布在  其他
关注(0)|答案(9)|浏览(144)

我正在努力解决以下问题。我需要生成由一组图表组成的报告。所有这些图表,除了一个,都是使用Matplotlib默认后端(TkAgg)制作的。一个图表需要使用开罗后端,原因是我绘制的是一个igraph图,只能使用开罗绘制。
问题是我不能在运行中更改后端,例如以下内容不起作用:
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后端的人......请发表您的答案。

mtb9vblg

mtb9vblg1#

六年后,我遇到了一个类似的问题,当试图决定哪一个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就像在强制新的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

对于那些仍然有问题的人,这段代码将打印出:
非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版本以来的更改

  • use的第一个参数已经从arg重命名为backend(只有在传递关键字时才相关)。
  • matplotlib.use的参数warn已被删除。如果设置了force,切换后端失败将始终引发ImportError;如果有必要的话,可以捕获该错误。
  • matplotlib.use的所有参数(除了第一个)现在都是keyword-only。
egdjgwm8

egdjgwm82#

有一个“实验性”的功能:

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

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

gajydyqb

gajydyqb3#

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

import matplotlib
matplotlib.use('agg')

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

9o685dep4#

所以我不完全确定这是否是你要找的。
您可以通过matplotlibrc文件更改后端,该文件包含matplotlib的某些配置。
在你的脚本中,你可以写:

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

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

ldfqzlk8

ldfqzlk85#

在我的例子中(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....
8ehkhllq

8ehkhllq6#

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种方式可以配置您的后端:*
1.设置rcParams["backend"](默认值:'agg')参数在您的matplotlibrc文件中
1.设置MPLBACKEND环境(shell)变量
1.使用函数 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
6ljaweal

6ljaweal7#

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

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
eit6fx6z

eit6fx6z8#

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

%matplotlib qt

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

%matplotlib --list

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

ubbxdtey

ubbxdtey9#

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

相关问题