如何在matplotlib/Python中更改后端

如何在matplotlib/Python中更改后端,python,matplotlib,backend,cairo,Python,Matplotlib,Backend,Cairo,我正在努力解决以下问题。我需要生成由一组图表组成的报告。除一个图表外,所有这些图表都是使用Matplotlib默认后端(TkAgg)生成的。需要使用Cairo后端制作一个图表,原因是我正在绘制一个igraph图形,并且只能使用Cairo绘制 问题是我不能动态地更改后端,例如,以下操作不起作用: matplotlib.pyplot.switch_后端('cairo.png') (我知道switch_后端功能是实验性的) 我也尝试过matplotlib.use(“cairo.png”),但这会导致导

我正在努力解决以下问题。我需要生成由一组图表组成的报告。除一个图表外,所有这些图表都是使用Matplotlib默认后端(TkAgg)生成的。需要使用Cairo后端制作一个图表,原因是我正在绘制一个igraph图形,并且只能使用Cairo绘制

问题是我不能动态地更改后端,例如,以下操作不起作用:
matplotlib.pyplot.switch_后端('cairo.png')
(我知道switch_后端功能是实验性的)

我也尝试过
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后端的人……请发布您的答案

所以我不能完全确定这是否是您想要的

您可以通过matplotlibrc文件更改后端,该文件包含matplotlib的某些配置

在脚本中,您可以放置:

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

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

您也可以使用不同的Python进程来绘制该图,可能是借助pickle或。有一个“实验性”功能:

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

将默认后端切换到newbackend。此功能是 实验性的,并且只希望切换到 图像后端。例如,如果你有一堆附言脚本 如果要从交互式ipython会话运行,可能需要 在运行PS后端之前切换到PS后端以避免 一堆GUI窗口弹出窗口。如果您尝试以交互方式切换 从一个GUI后端到另一个GUI后端,您将爆发。 调用此命令将关闭所有打开的窗口

为什么不直接使用内置函数(在Python3中)


六年后,当我试图决定使用哪个
后端时,遇到了类似的问题。
注:请参见下面的注意事项

这段代码对我来说很有用:

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
可以推断,交换
后端
非常简单,只要在强制执行新的
后端
后重新导入
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后端列表
然后尝试使用每个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的所有参数(第一个参数除外)现在仅为关键字
在我的例子(Windows 10+python 3.7)中,萨克森@Rolf的第一个答案不太有效。而不是一开始就尝试所有可用环境并配置其中一个, i、 哦,就在那之后

    import matplotlib
我不得不使用“Agg”将环境更改为“TkAgg”

    matplotlib.use('TKAgg',warn=False, force=True)
就在我实际绘制的代码之前

    import matplotlib.pyplot as plt
    fig = plt.figure()
    # AND SO ON....

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

  • 首先找到
    matplotlibrc
    文件:

    import matplotlib
    
    matplotlib.matplotlib_fname()
    # '/Users/serafeim/.matplotlib/matplotlibrc'
    
  • 打开终端并执行以下操作:

    cd /Users/serafeim/.matplotlib/
    ls
    
  • 编辑文件(如果文件不存在,请使用以下命令:
    触摸matplotlib
    以创建文件):

  • 添加此行并保存:

    backend: TkAgg
    

  • 如果您使用的是IPython控制台(包括Spyder),则可以使用快速切换后端,例如:

    %matplotlib qt
    
    获取要与命令一起使用的可用后端的列表:

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

    额外信息
    尽管每个人都展示了自己最喜欢的后端,但要想弄清楚需要安装什么以及需要满足什么要求是相当麻烦的。至少当你试图理解通常令人困惑的技术官僚文档时。今天,我做了几个实验,我认为我已经找到了每个后端最简单的解决方案,能够在Windows中使用matplotlib并使用Py3.8.5(无内置Qt)进行绘图。以下是我的发现:

    #--------------------------------------
    #安装matplotlib后端
    #--------------------------------------
    # https://matplotlib.org/users/installing.html
    pip安装pycairo#[1]Cairo:GTK3后端(替换:cairocffi)[1.2MB]
    #pip安装MPLCaor#[1]Cairo:matplotlib[1.7 Mb]的简单和特定功能
    #pip安装PyQt5#[2]Qt5:Require:Qt的qmake工具[]
    pip安装PySide2#[3]Qt5:Require:shiboken2和clanglib绑定[136 Mb]
    pip安装wxPython#[4]WxAgg:??[18.1 Mb]
    安装龙卷风
    
    %matplotlib qt
    
    %matplotlib --list