使用MacOS的matplotlib的哪个后端?

时间:2019-03-22 12:51:59

标签: python macos matplotlib

在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)

该问题已记录在here中。一种解决方案是将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.

herethereplenty of other threads中记录了该问题。

有两个解决方案:

  • 安装python.appconda install python.app)并使用pythonw而不是python来启动脚本
  • 使用TKAgg后端

使用第一个效果很好,但我想知道:

  • 我们为什么需要呼叫pythonw而不是python
  • python.app软件包到底是什么?
  • 我们如何使用IDE(例如说PyCharm)使该解决方案有效?

对于第二个,它在一定程度上可以“工作”:使用matplotlib运行TkAgg时,绘图窗口确实有问题。实际上,通常需要多次单击“缩放”,“平移”或“主页”按钮才能使它们真正起作用。使用它真的很痛苦。我问了几个使用matplotlibTkAgg的同事或朋友,他们都有相同的问题。

有人知道这种事实的原因吗?或者是否有任何解决方法来避免此问题(除了安装pyqt5)?

3 个答案:

答案 0 :(得分:0)

我要作一些假设。如果他们错了,我深表歉意。

  • 您在Anaconda中安装了Python。

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

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

现在,我并不是说您必须手动下载和安装。我使用homebrew,这使我每天都免于头痛(例如升级应用程序和软件包)。这就是我建议的“解决方法”。因为不是通过Anaconda / Spyder安装已经不是正确安装Python的解决方法?我一直觉得执行一项变通办法需要更多变通办法才能充分发挥功能。例如必须在默认情况下应在需要检测时指定matplotlib后端。

很显然,我对该工具有些偏见,并且可能会在此答案中得到反映,因此请带一点盐。即使Conda是我认为有用的合法工具,但当conda不包含我想要的软件包时,我却不得不同时使用pip和conda,这很烦人。

答案 1 :(得分:0)

使用第一个选项是最好的选择,因为您已经在使用虚拟环境。 根据matplotlib,python有两种变体:

  • 框架构建-对于MacOX中的GUI内容非常重要
  • 常规构建。

在这种情况下,Matplotlib希望与OSX本机交互,因此,它需要Framework构建,这就是安装python.app类型的python很重要的原因。 可以从Matplotlib FAQ获得更多信息。

请选中此link,以获取有关构建框架python的更多信息。

答案 2 :(得分:0)

您可以尝试两件事。

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

    <块引用>

    (Ana)conda 中提供的默认 python 不是框架构建。但是,可以轻松地在主环境和 conda 环境中安装框架构建:安装 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) 工作得很好。