Какой бэкэнд для matplotlib использует MacOS? - PullRequest
3 голосов
/ 22 марта 2019

Вопрос использования matplotlib с MacOS - сложный вопрос, который уже был подробно рассмотрен в ходе ряда обсуждений (см. Ниже). Проблема заключается в следующем:

  • с использованием MacOS Mojave 10.14.3
  • с использованием Python 3.7.2 в среде conda
  • с использованием 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, например)?

Что касается второго, он «работает» до определенной точки: при запуске matplotlib с использованием TkAgg окно графика действительно глючит. Действительно, для того, чтобы они действительно работали, часто требуется несколько нажатий на кнопки «зум», «панорамирование» или «домой». Это действительно большая боль, чтобы использовать это. Я спросил нескольких коллег или друзей, используя matplotlib с TkAgg, и у них у всех одна и та же проблема.

Кто-нибудь знает причину этого факта? Или если есть обходной путь, чтобы избежать этой проблемы (кроме установки pyqt5)?

1 Ответ

0 голосов
/ 14 июня 2019

Я собираюсь сделать некоторые предположения.Если они не правы, я прошу прощения.

  • Вы установили Python с Anaconda.

Лично у меня никогда не было проблем с mac с matplotlib.Моя установка: Mojave, Python3.7.3 в venv с использованием встроенного модуля python (python3 -m venv) и matplotlib 3.0.3.

Я не могу ответить на ваш вопрос поКак исправить вашу проблему, но я пытаюсь ответить на ваш вопрос: есть ли обходной путь?Лично у меня всегда были проблемы с использованием Anaconda / Spyder / Conda для Python.Я всегда чувствовал, что установка его как собственного двоичного файла / приложения в системе приводит к наименьшему количеству ошибок.

Теперь я не говорю, что вам нужно скачивать и устанавливать вручную.Я использую homebrew , и это избавляет меня от головной боли каждый день, который я предполагаю (например, обновление приложений и пакетов).Это «обходной путь», который я бы предложил.Поскольку установка через Anaconda / Spyder уже не является обходным путем для правильной установки Python?Я всегда чувствовал, что выполнение одной работы требует большего количества обходных путей для полной функциональности.Например, необходимость указать бэкэнд matplotlib, когда он должен быть обнаружен по умолчанию.

Очевидно, я немного предвзят в отношении этого инструмента, и это может отразиться в этом ответе, так что возьмите его с крошкой соли,Несмотря на то, что Conda является законным инструментом, который, на мой взгляд, полезен, меня раздражает необходимость использовать как pip, так и conda, когда в conda нет нужных мне пакетов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...