在 matplotlib 内联和 QT 后端之间切换 Python 脚本

Posted

技术标签:

【中文标题】在 matplotlib 内联和 QT 后端之间切换 Python 脚本【英文标题】:Python script switching between matplotlib inline and QT backend 【发布时间】:2015-10-10 12:30:01 【问题描述】:

我希望能够基于名为 inlinemode 的变量(例如下面的代码片段)在内联显示 matplotlib 图形或在脚本文件中使用 QT 后端之间切换

import matplotlib.pylab as plt
inlinemode = False
if inlinemode:   
    print "plot will be inline..."
else:
    print "plot will be qt..."
    plt.switch_backend('qt4agg')
plt.figure()
plt.plot(range(10))

我的 IPython 控制台默认以内联模式启动,执行上面的代码片段仍然会生成内联图而不是 qt 窗口。如果可以在 if 块中发送 IPython 魔术 %matplotlib inline -或- %matplotlib qt,这将完成此任务。但是,据我所知,无法从脚本文件中发送这些魔法。

任何建议将不胜感激!

(仅供参考:我在 Windows 10 上的 Anaconda Python 2.7 中从 Spyder 运行)

【问题讨论】:

使用%matplotlib qt 魔法 如果我使用 %run foo.py 从 IPython 控制台执行脚本,魔法就会起作用。但是,如果我使用 Spyder 的运行按钮,它会将 runfile('foo.py') 发送到 IPython 控制台。在这种情况下,它会在 %matplotlib qt 语句中出现语法错误。 【参考方案1】:

这可以使用以下块来实现,这将允许脚本在 IPython 中使用 %run 或直接通过标准 python 运行。

try:
    import IPython
    shell = IPython.get_ipython()
    shell.enable_matplotlib(gui='inline')
except:
    pass   

这就是%matplotlib inline 的魔力实际上在做的事情。您可以将关键字参数更改为 gui='qt' 以选择不同的后端。

【讨论】:

以上是关于在 matplotlib 内联和 QT 后端之间切换 Python 脚本的主要内容,如果未能解决你的问题,请参考以下文章

Jupyter 中的内联动画

在同一进程中将 matplotlib 与 Qt5 后端一起使用并运行现有 QApplication

在 Matplotlib 3.1.2 中使用 qt5agg 后端,get_backend() 会改变行为

未找到 Matplotlib Qt5Agg 后端

如何防止PyCharm覆盖matplotlib中设置的默认后端?

如何在 Windows 上使用 conda 安装 matplotlib 而不安装 Qt?