我正在努力解决以下问题。我需要生成由一组图表组成的报告。除了一个之外,所有这些图表都是使用Matplotlib默认后端(TkAgg)制作的。需要使用开罗后端制作一张图表,原因是我正在绘制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:我昨天有一些严重的大脑冻结......简单而明显的解决方案是将开罗后端用于所有图表而不是切换后端:)
更新3:实际上,它仍然是一个问题所以任何知道如何动态切换matplotlib后端的人....请发布你的答案。
答案 0 :(得分:41)
六年后,当我尝试确定哪个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
对于仍有问题的人,此代码将打印出:
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")
答案 1 :(得分:34)
有一个“实验性”功能:
import matplotlib.pyplot as plt
plt.switch_backend('newbackend')
将默认后端切换为newbackend。这个功能是 实验,并且只能切换到 图像后端。例如,如果你有一堆PostScript脚本 你想要从交互式ipython会话中运行 在运行之前切换到PS后端以避免使用 一堆GUI窗口弹出窗口。如果您尝试以交互方式切换 从一个GUI后端到另一个GUI后端,你会爆炸。 调用此命令将关闭所有打开的窗口。
答案 2 :(得分:13)
为什么不使用{3}内置函数(Python 3中的reload
)?
import matplotlib
matplotlib.use('agg')
matplotlib = reload(matplotlib)
matplotlib.use('cairo.png')
答案 3 :(得分:3)
所以我不完全确定这是否是您正在寻找的。
您可以通过matplotlibrc文件更改后端,该文件包含matplotlib的某些配置。
在您的脚本中,您可以输入:
matplotlib.rcParams['backend'] = 'TkAgg'
或类似的东西在后端之间切换。
答案 4 :(得分:3)
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,这是微不足道的,因为您只使用操作系统包管理器 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 种方法:
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
答案 5 :(得分:1)
您可能还有一个不同的Python流程制作该剧情,可能借助于pickle或joblib。
答案 6 :(得分:1)
要永久更改后端,可以使用以下命令:
首先找到matplotlibrc
文件:
import matplotlib
matplotlib.matplotlib_fname()
# '/Users/serafeim/.matplotlib/matplotlibrc'
打开终端并执行以下操作:
cd /Users/serafeim/.matplotlib/
ls
编辑文件(如果不存在,请使用以下命令:touch matplotlib
创建文件):
vim matplotlibrc
添加此行并保存:
backend: TkAgg
答案 7 :(得分:0)
在我的情况下(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....
答案 8 :(得分:0)
如果您使用的是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']