在MacOS上使用matplotlib的问题是一个棘手的问题,许多讨论已经对此进行了彻底的审查(请参见下文)。问题如下:
这是我想出的最简单的代码,可以重现该问题:
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.
here,there和plenty of other threads中记录了该问题。
有两个解决方案:
python.app
(conda install python.app
)并使用pythonw
而不是python
来启动脚本TKAgg
后端使用第一个效果很好,但我想知道:
pythonw
而不是python
?python.app
软件包到底是什么?对于第二个,它在一定程度上可以“工作”:使用matplotlib
运行TkAgg
时,绘图窗口确实有问题。实际上,通常需要多次单击“缩放”,“平移”或“主页”按钮才能使它们真正起作用。使用它真的很痛苦。我问了几个使用matplotlib
和TkAgg
的同事或朋友,他们都有相同的问题。
有人知道这种事实的原因吗?或者是否有任何解决方法来避免此问题(除了安装pyqt5)?
答案 0 :(得分:0)
我要作一些假设。如果他们错了,我深表歉意。
就个人而言,我在使用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有两种变体:
在这种情况下,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)
工作得很好。