使用 MacOS,Matplotlib 的后端应该选择哪一个?

12

在MacOS上使用matplotlib是一个棘手的问题,已经有许多讨论对此进行了全面审查(请参见以下内容)。 问题如下:

  • 使用MacOS Mojave 10.14.3
  • 在conda环境中使用python 3.7.2
  • 使用matplotlib 3.0.3

下面是我编写的最简代码片段,可用于重现该问题:

from matplotlib import pyplot as plt

x = [1, 2, 3]
y = [1, 2, 3]

plt.plot(x, y)
plt.show()

这会抛出以下错误:

2019-03-22 12:25:43.429 python3.7[22209:554135] -[NSApplication _setup:]: unrecognized selector sent to instance 0x7f85866b9de0  
2019-03-22 12:25:43.431 python3.7[22209:554135] \*** Terminating app  due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSApplication _setup:]: unrecognized selector sent to instance 0x7f85866b9de0'  
*** First throw call stack:([...])
libc++abi.dylib: terminating with uncaught exception of type NSException

Process finished with exit code 134 (interrupted by signal 6: SIGABRT)

这个问题在这里有记录。一个解决方案是将PyQt5包安装到你的Python安装中,并在你的脚本开头添加以下几行代码:

import matplotlib
matplotlib.use("Qt5Agg")

虽然这样可以完美地工作,但我想知道为什么其他后端不能提供类似的行为。


事实上,我尝试使用了 MacOSX 后端:

import matplotlib
matplotlib.use('MACOSX')

导致错误的原因是:

from matplotlib.backends import _macosx  
ImportError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework or try one of the other backends. If you are using (Ana)Conda please install python.app and replace the use of 'python' with 'pythonw'. See 'Working with Matplotlib on OSX' in the Matplotlib FAQ for more information.
问题已在这里那里许多其他帖子中有记录。
出现了两个解决方案:
  • 安装python.app(conda install python.app)并使用pythonw而不是python来启动脚本
  • 使用TKAgg后端
第一种方法使用良好,但我想知道:
  • 为什么我们需要调用pythonw而不是python?
  • python.app包到底是什么?
  • 我们如何在IDE(例如PyCharm)中使用这个解决方案?
至于第二种方法,它“可以”工作到一定程度:当使用TkAgg运行matplotlib时,绘图窗口会出现很多问题。实际上,通常需要多次点击“缩放”,“平移”或“主页”按钮才能使它们确实起作用。真的很难使用它。我问了几个用matplotlibTkAgg的同事或朋友,他们都有同样的问题。
有人知道这种情况的原因吗?或者是否有任何解决此问题的方法(除了安装pyqt5)?
3个回答

3

如果您已经在使用虚拟环境,则使用第一种选项是最佳选择。根据Matplotlib的说法,Python有两个变体:

  • Framework build - 在MacOS中进行GUI操作非常重要
  • 正常版本。

在这种情况下,Matplotlib希望与OSX进行本地交互,为此,它需要Framework build,这就是为什么安装python.app类型的Python很重要的原因。 更多信息可以从Matplotlib FAQ获取。

有关需要Framework build Python的更多信息,请查看此链接


2
我会做一些假设。如果假设不正确,我道歉。
  • 您使用Anaconda安装了Python。

就我个人而言,在Mac上使用matplotlib从未出现过任何问题。我的设置是:Mojave,使用python内置模块(python3 -m venv)的Python3.7.3中的venv,以及matplotlib 3.0.3。

我无法回答如何解决您的问题,但我正在尝试回答您的“是否有任何解决方法”的问题。就我个人而言,我始终在使用Python时遇到Anaconda / Spyder / Conda的问题。我始终认为将其作为自己的二进制/应用程序安装到系统上会导致最少的错误。

现在,我并不是说您必须手动下载和安装。我使用homebrew,每天都能避免麻烦(例如升级应用程序和软件包)。这是我建议的“解决方法”。因为通过Anaconda / Spyder / Conda安装不是已经解决了安装Python的问题吗?我始终认为执行一个解决方法需要更多解决方法才能实现完全功能。例如,当默认情况下应该检测到matplotlib后端时,必须指定matplotlib后端。

显然,我对该工具有些偏见,这可能反映在此答案中,因此请谨慎对待。即使Conda是我认为很有用的合法工具,但当conda不包含我想要的软件包时,我发现使用pip和conda都很烦人。


0

你可以尝试两件事情。

  • 您可以在Matplotlib信息页面上阅读https://matplotlib.org/3.1.0/faq/osx_framework.html

    (Ana)conda提供的默认Python不是框架构建。但是,框架构建可以轻松安装,无论是在主环境还是在conda envs中:安装python.app(conda install python.app)并使用pythonw而不是python。

    然后按照说明操作即可。

  • 或者只需按照尝试%matplotlib inline时收到的错误消息进行操作,

    (...)
    UnknownBackend: No event loop integration for 'inline'. Supported event loops are: qt, qt4, qt5, gtk, gtk2, gtk3, tk, wx, pyglet, glut, osx
    

    我执行了%matplotlib osx,之后plt.imshow(myimg)正常工作。


1
"%matplotlib inline" 是什么意思?你是在说 Jupyter 笔记本吗?这很令人困惑。 - David Epstein
@DavidEpstein https://ipython.readthedocs.io/en/stable/interactive/magics.html#magic-matplotlib - Brandt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接