DrD*_*Dee 68 python backend matplotlib cairo
我正在努力解决以下问题.我需要生成由一组图表组成的报告.除了一个之外,所有这些图表都是使用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()
Run Code Online (Sandbox Code Playgroud)
但这真的是这样做的吗?
更新2:我昨天有一些严重的大脑冻结......简单而明显的解决方案是将开罗后端用于所有图表而不是切换后端:)
更新3:实际上,它仍然是一个问题所以谁知道如何动态切换matplotlib后端....请发布你的答案.
Rol*_*ony 44
六年后,当我试图决定哪些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
Run Code Online (Sandbox Code Playgroud)
正如你可以推断的那样,交换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
Run Code Online (Sandbox Code Playgroud)
对于仍有问题的人,此代码将打印出:
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")
Run Code Online (Sandbox Code Playgroud)
oyo*_*oyo 35
有一个"实验性"功能:
import matplotlib.pyplot as plt
plt.switch_backend('newbackend')
Run Code Online (Sandbox Code Playgroud)
将默认后端切换到newbackend.此功能是 实验性的,只能用于切换到图像后端.例如,如果您想要从交互式ipython会话中运行一堆PostScript脚本,则可能需要在运行它们之前切换到PS后端,以避免弹出一堆GUI窗口.如果您尝试以交互方式从一个GUI后端切换到另一个GUI后端,则会爆炸.调用此命令将关闭所有打开的窗口.
fre*_*aba 13
为什么不使用reload
内置函数(importlib.reload
在Python 3中)?
import matplotlib
matplotlib.use('agg')
matplotlib = reload(matplotlib)
matplotlib.use('cairo.png')
Run Code Online (Sandbox Code Playgroud)
小智 7
所以我不完全确定这是否是你正在寻找的。
您可以通过 matplotlibrc 文件更改后端,该文件包含 matplotlib 的某些配置。
在您的脚本中,您可以输入:
matplotlib.rcParams['backend'] = 'TkAgg'
Run Code Online (Sandbox Code Playgroud)
或类似的东西在后端之间切换。
如果您使用 IPython 控制台(包括在 Spyder 中),您可以使用内置的魔法命令快速切换后端,例如:
%matplotlib qt
Run Code Online (Sandbox Code Playgroud)
获取可与命令一起使用的可用后端列表:
%matplotlib --list
Run Code Online (Sandbox Code Playgroud)
可用的 matplotlib 后端: ['tk', 'gtk', 'gtk3', 'wx', 'qt4', 'qt5', 'qt', 'osx', 'nbagg', 'notebook', 'agg', ' svg'、'pdf'、'ps'、'内联'、'ipympl'、'小部件']
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]
Run Code Online (Sandbox Code Playgroud)
以下是所有 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
Run Code Online (Sandbox Code Playgroud)
然而,令人惊讶的是,考虑到有大量的使用文档Tcl/Tk
和tkinter
python 包,我无法安装它,也找不到任何关于如何将 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 #
Run Code Online (Sandbox Code Playgroud)
也许有人可以启发我如何将这些导入到 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
要永久更改后端,您可以使用以下命令:
首先找到该matplotlibrc
文件:
import matplotlib
matplotlib.matplotlib_fname()
# '/Users/serafeim/.matplotlib/matplotlibrc'
Run Code Online (Sandbox Code Playgroud)打开终端并执行以下操作:
cd /Users/serafeim/.matplotlib/
ls
Run Code Online (Sandbox Code Playgroud)编辑文件(如果不存在,请使用此命令:touch matplotlib
创建它):
vim matplotlibrc
Run Code Online (Sandbox Code Playgroud)添加此行并保存:
backend: TkAgg
Run Code Online (Sandbox Code Playgroud)就我而言(Windows 10 + python 3.7),萨克森州@Rolf 的第一个答案效果不佳。而不是一开始就尝试所有可用的环境并配置其中一个,即,就在之后
import matplotlib
Run Code Online (Sandbox Code Playgroud)
我不得不使用以下命令将环境从“Agg”更改为“TkAgg”
matplotlib.use('TKAgg',warn=False, force=True)
Run Code Online (Sandbox Code Playgroud)
就在我实际绘制的代码之前,即
import matplotlib.pyplot as plt
fig = plt.figure()
# AND SO ON....
Run Code Online (Sandbox Code Playgroud)