如何在 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 种方式来配置您的后端:
-
在 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
【讨论】:
这个答案对于那些使用 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 中更改后端的主要内容,如果未能解决你的问题,请参考以下文章