2015-10-13 113 views
3

我想在matplotlib中显示图像的x y坐标。 the example code在全局python安装中工作得非常好:当我移动光标时,x,y,z值立即得到更新。但是,当我在python虚拟环境中运行示例代码时,我会多次点击图像以便首先显示坐标,然后当我点击不同的位置时,它会更新一些。点击几下后,坐标将不再更新。matplotlib示例代码不能在python虚拟环境中工作

我不知道如何调试。

+4

如果代码是相同的,那么在任何包或python版本中应该有所不同。在全局和虚拟环境中使用'pip freeze'并进行比较。另请参阅python版本本身是否相同。也可能是matplotlib使用不同的后端,所以也请检查'matplotlib.get_backend()'。 – swenzel

+0

的python版本是一样的。 matplotlib是不同的。我从我的virtualenv中卸载它,并安装了在我的全局python中找到的相同版本。但是,问题依然存在。 @swenzel – MAS

+1

后台怎么样? – swenzel

回答

17

这可能是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 

注:我发布了一条评论,自从发布这个答案以来,matplotlib文档现在引用了这个问题,并且suggest a workaround,尽管评论者注意到在这个答案中提供的解决方案(切换到Qt后端)适用于那些官方文档无法实现的解决方法为他们。

+0

为我工作过(在使用brew安装pyqt之后)! matplotlib文档提出了更长的解决方法,我实际上无法做到这一点.. http://matplotlib.org/faq/virtualenv_faq.html – SeF

0

终于为我工作的是使本地matplotlibrc文件包含指令:backend: TkAgg

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

This是有益的:

import matplotlib 
print matplotlib.rcParams['backend'] 

其他注意事项:

我一直在使用自制(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