Пример кода matplotlib не работает в виртуальной среде Python

Я пытаюсь отобразить координату x y z изображения в matplotlib. пример кода отлично работает при глобальной установке Python: при перемещении курсора значения x,y,z получать обновления мгновенно. Однако, когда я запускаю пример кода в виртуальной среде Python, я несколько раз щелкал изображения, чтобы координата отображалась в первую очередь, а затем, когда я нажимал на разные позиции, она обновлялась для некоторых. После нескольких кликов координаты больше не будут обновляться.

Я не знаю, как это отладить.


person MAS    schedule 13.10.2015    source источник
comment
Если код одинаковый, то должна быть разница в любом пакете или в версии python. Используйте pip freeze как в глобальном, так и в виртуальном окружении и сравните. Также посмотрите, совпадает ли сама версия Python. Также может быть, что matplotlib использует разные бэкенды, поэтому также проверьте matplotlib.get_backend().   -  person swenzel    schedule 13.10.2015
comment
версия питона такая же. matplotlib был другим. Я удалил его из своего virtualenv и установил ту же версию, что и в моем глобальном питоне. Однако проблема остается. @swenzel   -  person MAS    schedule 13.10.2015
comment
Как насчет бэкенда?   -  person swenzel    schedule 13.10.2015
comment
Я получаю MacOSX для обоих @swenzel.   -  person MAS    schedule 14.10.2015
comment
приведенная ниже ссылка, похоже, имеет аналогичную проблему и лучше описывает проблему. Однако на него нет ответа. stackoverflow.com /вопросы/29754360/   -  person MAS    schedule 14.10.2015
comment
можно попробовать использовать альтернативный бэкэнд matplotlib.org/faq /usage_faq.html#what-is-a-backend для matplotlib (например, используйте qt4 вместо 'macosx')   -  person J Richard Snape    schedule 15.10.2015
comment
Большое спасибо. Это решило проблему. @JRichardSnape   -  person MAS    schedule 16.10.2015
comment
@MAS отлично - я добавил это как ответ, чтобы вы могли принять и оставить информацию здесь для любых будущих посетителей.   -  person J Richard Snape    schedule 17.10.2015


Ответы (4)


Вероятно, это проблема с бэкэндом macosx для matplotlib. Переключитесь на использование альтернативного бэкенда для matplotlib (например, используйте qt4 вместо 'macosx'). Подробнее о том, как переключить серверную часть и что именно это означает, см. в здесь. Обратите внимание, что вам, возможно, придется сначала установить серверную часть - например. pyqt использовать qt4agg серверную часть, как я предлагаю здесь.

Таким образом, серверная часть имеет дело с выводом из matplotlib, а matplotlib может ориентироваться на разные форматы вывода. Это могут быть выходные форматы графического интерфейса (например, wx, qt4 и т. д.) или выходные файлы (например, pdf). Они известны как интерактивные и неинтерактивные серверные части соответственно.

Чтобы изменить бэкэнд, выполните

import matplotlib
matplotlib.use('qt4agg')

в коде или, если вы хотите изменять каждый раз при запуске matplotlib, отредактируйте настройки файла matplotlibrc внутренний атрибут, например.

backend: Qt4Agg

Н.Б. Меня предупредил комментарий о том, что после публикации этого ответа документы matplotlib теперь ссылаются на эту проблему и предлагают обходной путь, хотя Комментатор отметил, что решение, предложенное в этом ответе (переключиться на бэкэнд Qt), сработало для них, где обходной путь с официальной документацией был для них невозможен.

person J Richard Snape    schedule 16.10.2015
comment
У меня сработало (после установки pyqt с brew)! Документация matplotlib предлагает гораздо более длинные обходные пути, которые я не смог реализовать на практике. virtualenv_faq.html - person SeF; 06.02.2016

Что, наконец, сработало для меня, так это создать локальный файл matplotlibrc, содержащий директиву: backend: TkAgg.

# Within working directory where running python
vim matplotlibrc
# new file via vim, Nano, whatever
backend: TkAgg

Это было полезно:

import matplotlib
print matplotlib.rcParams['backend']

Другие примечания:

Я также установил pyqt с помощью Homebrew (brew install pyqt) и скопировал (мог просто переместить) в $MyVirtEnv/lib/python2.7/site-packages/ из /usr/local/lib/python2.7/site-packages/PyQt4

Но когда я

import matplotlib
matplotlib.use('qt4Agg')
import librosa
 "Matplotlib qt-based backends require an external PyQt4, PyQt5,\n"
ImportError: Matplotlib qt-based backends require an external PyQt4,   PyQt5,
or PySide package to be installed, but it was not found.

Тоже пробовал

pip install pyside
Successfully installed pyside-1.2.4

Та же ошибка

>>> import pyside
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named pyside

Также в какой-то момент возникла следующая ошибка при попытке повторно импортировать matplotlib (я думаю).

from . import cache
ImportError: cannot import name cache
person MikeiLL    schedule 15.10.2016

Как указано в Часто задаваемые вопросы о Matplotlib virtualenv, vext — вот решение.

Например, это позволяет использовать общесистемный pyqt5.

Это необходимо до тех пор, пока программа установки PyQt5 не узнает о virtualenvs:

pip3 install vext.pyqt5
person ederag    schedule 09.08.2019

Просто добавьте plt.show() в конце, и проблема для меня была решена.

person Man    schedule 20.08.2019
comment
Это практически ответ только для кода. Хотите помочь в борьбе с заблуждением, что StackOverflow — это бесплатный сервис для написания кода, добавив пояснение? - person Yunnosch; 20.08.2019