matplotlib 示例代码不适用于 python 虚拟环境

matplotlib example code not working on python virtual environment

我正在尝试在 matplotlib 中显示图像的 x y z 坐标。 the example code 在全局 python 安装上运行良好:当我移动光标时,x、y、z 值会立即更新。然而,当我 运行 在 python 虚拟环境中的示例代码时,我会点击图像几次以使坐标首先显示,然后当我点击不同的位置时它会更新对于一些。点击几下后,坐标将不再更新。

我不知道如何调试它。

这可能是 matplotlib 的 macosx 后端的问题。切换到使用 matplotlib 的替代后端(例如,使用 qt4 而不是 'macosx')。有关如何切换后端及其确切含义的详细信息 - 请参阅 the docs here。请注意,您可能必须先安装后端 - 例如pyqt 按照我在这里的建议使用 qt4agg 后端。

总而言之 - 后端处理来自 matplotlib 的输出,而 matplotlib 可以针对不同的输出格式。这些可以是 gui 显示输出格式(例如 wxqt4 等)或文件输出(例如 pdf)。这些分别称为交互式和非交互式后端。

要更改后端,请执行

import matplotlib
matplotlib.use('qt4agg')

在代码中,或者 - 如果您想在每次启动 matplotlib 时进行更改 - edit your matplotlibrc file 设置后端属性,例如

backend: Qt4Agg

N.B。一条评论提醒我,自发布此答案以来,matplotlib 文档现在提到此问题和 suggest a workaround,尽管评论者指出此答案中提供的解决方案(切换到 Qt 后端)在官方文档中对他们有效解决方法对他们来说是不可能的。

最终对我有用的是制作一个包含指令的本地 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']

其他注意事项:

我还使用 Homebrew (brew install pyqt) 安装了 pyqt 并从 /usr/local/lib/python2.7/site-packages/PyQt4

复制(可以移动它)到 $MyVirtEnv/lib/python2.7/site-packages/

但是当我

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

正如 Matplotlib virtualenv FAQ, vext 中所指出的,这里是解决方案。

例如,它允许使用系统范围的 pyqt5。

在 PyQt5 安装程序了解 virtualenvs 之前,这是必需的:

pip3 install vext.pyqt5

只要在最后加上plt.show(),问题就解决了。