【问题标题】:Which backend for matplotlib using MacOS?使用 MacOS 的 matplotlib 的哪个后端?
【发布时间】:2019-08-13 11:10:02
【问题描述】:

在 MacOS 上使用matplotlib 的问题是一个棘手的问题,许多讨论已经对它进行了彻底的审查(见下文)。问题如下:

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

这是我想出的最简单的代码 sn-p,它允许重现问题:

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.app(conda install python.app) 并使用pythonw 而不是python 启动您的脚本
  • 使用TKAggbackend

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

  • 为什么我们需要调用pythonw 而不是python
  • python.app 包到底是什么?
  • 我们如何使用 IDE(例如 PyCharm)使这个解决方案工作?

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

有人知道这种情况的原因吗?或者是否有任何解决方法可以避免这个问题(除了安装 pyqt5)?

【问题讨论】:

    标签: python macos matplotlib


    【解决方案1】:

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

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

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

    查看link 了解更多关于框架构建 python 的需求。

    【讨论】:

      【解决方案2】:

      我将做一些假设。如果他们错了,我道歉。

      • 您使用 Anaconda 安装了 Python。

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

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

      现在,我并不是说您必须手动下载和安装。我使用homebrew,我认为它每天都让我头疼(例如升级应用程序和软件包)。这就是我建议的“解决方法”。因为不是通过 Anaconda/Spyder 安装已经是正确安装 Python 的解决方法吗?我一直觉得执行一项工作需要更多的解决方法才能获得完整的功能。比如必须指定matplotlib后端什么时候应该默认检测到。

      显然,我对该工具有点偏见,这可能会反映在这个答案中,所以请谨慎对待。尽管 Conda 是一个我认为有用的合法工具,但当 conda 不包含我想要的包时,我发现必须同时使用 pip 和 conda 很烦人。

      【讨论】:

        【解决方案3】:

        您可以尝试两件事。

        • 你可以阅读 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) 工作得很好。

        【讨论】:

          猜你喜欢
          • 2011-04-04
          • 1970-01-01
          • 1970-01-01
          • 2020-01-16
          • 1970-01-01
          • 2014-09-24
          • 2016-08-30
          • 2017-11-14
          • 1970-01-01
          相关资源
          最近更新 更多