如何更改 matplotlib 后端
- 2025-02-11 09:50:00
- admin 原创
- 60
问题描述:
我正在努力解决以下问题。我需要生成包含一组图表的报告。除一张外,所有这些图表都是使用 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
正如文档所述:有三种方法可以配置后端:
在matplotlibrc文件中设置
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
解决方案 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:
要永久更改后端,您可以使用以下命令:
首先找到
matplotlibrc
文件:
import matplotlib
matplotlib.matplotlib_fname()
# '/Users/serafeim/.matplotlib/matplotlibrc'
打开终端并执行:
cd /Users/serafeim/.matplotlib/
ls
编辑文件(如果不存在请使用此命令:
touch matplotlib
创建它):
vim matplotlibrc
添加此行并保存:
backend: TkAgg
解决方案 9:
您还可以使用不同的 Python 进程来绘制该图,可能借助 pickle 或joblib。