Вопрос использования 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)?