如何让 matplotlib.pyplot 在 OSX 的虚拟环境中工作?
Posted
技术标签:
【中文标题】如何让 matplotlib.pyplot 在 OSX 的虚拟环境中工作?【英文标题】:How to get matplotlib.pyplot working in virtual environment on OSX? 【发布时间】:2016-05-30 02:25:42 【问题描述】:我第一次遇到this question 的答案,在那里我发现我需要安装自己的后端框架。由于答案提到了 PyQt4,我选择了它。按照文档中的链接,我最终从here 下载了 SIP(PyQt4 的先决条件)和 PyQt4。最后,在我的代码中,我有:
import matplotlib
matplotlib.use('Qt4agg') # need to call use() before importing plt
import matplotlib.pyplot as plt
但是我仍然收到此错误:
Traceback(最近一次调用最后一次): 文件“.../venv/lib/python3.5/site-packages/matplotlib/backends/qt_compat.py”,第 159 行,在 从 PySide 导入 QtCore、QtGui、version、version_info ImportError:没有名为“PySide”的模块
在处理上述异常的过程中,又发生了一个异常:
Traceback(最近一次调用最后一次):
文件“.../program.py”,第 7 行,在 将 matplotlib.pyplot 导入为 plt 文件“.../venv/lib/python3.5/site-packages/matplotlib/pyplot.py”,第 114 行, 在 _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
文件 ".../venv/lib/python3.5/site-packages/matplotlib/backends/init.py", 第 32 行,在 pylab_setup 中 globals(),locals(),[backend_name],0)
文件 “.../venv/lib/python3.5/site-packages/matplotlib/backends/backend_qt4agg.py”, 第 18 行,在 从 .backend_qt5agg 导入 FigureCanvasQTAggBase 作为 _FigureCanvasQTAggBase
文件 “.../venv/lib/python3.5/site-packages/matplotlib/backends/backend_qt5agg.py”, 第 15 行,在 从 .backend_qt5 导入 QtCore
文件 “.../venv/lib/python3.5/site-packages/matplotlib/backends/backend_qt5.py”, 第 31 行,在 from .qt_compat import QtCore, QtGui, QtWidgets, _getSaveFileName, version
文件 “.../venv/lib/python3.5/site-packages/matplotlib/backends/qt_compat.py”, 第 162 行,在 “基于 Matplotlib qt 的后端需要外部 PyQt4、PyQt5、\n” ImportError:基于 Matplotlib qt 的后端需要外部 PyQt4, PyQt5,或者PySide包要安装,但是没有找到。
以前有人经历过吗?关于从这里去哪里的任何调试建议或帮助?
编辑:我会补充一点,尝试从我的虚拟环境中尝试 import PyQt4
是可行的,所以我不确定为什么 matplotlib 找不到它...
EDIT2:不确定是否重要,但我正在使用 PyCharm
【问题讨论】:
“基于 Matplotlib qt 的后端需要安装外部 PyQt4、PyQt5 或 PySide 包,但未找到。”您需要安装 Qt 框架,或者使用不同的后端(TkAgg
通常可以使用)。
@Evert 我已经安装了 PyQt4 (Qt4Agg) 但似乎找不到它。我可以在 python 解释器中很好地导入它,所以你能想到我忘记做的额外事情吗?
我误解了(或误读了,可能)。你的 matplotlib 安装的是什么版本?可以试试升级吗?
微妙,但尝试在后端名称中使用额外的大写:matplotlib.use('Qt4Agg')
(大写 A),而不是使用 Qt4agg
。
@Evert 我有 matplotlib 1.5.1,Qt4Agg 也不起作用
【参考方案1】:
您是否考虑过使用conda
而不是virtualenv
?
conda create -n matplotenv matplotlib
source activate matplotenv
python -c "import matplotlib.pyplot as plt
p = plt.plot([1,2,3])
plt.show()"
source deactivate
【讨论】:
我其实不知道没有virtualenv
也能创建虚拟环境!如果所有其他方法都失败了,我肯定会试一试,因为我已经设置了我的环境......你认为 conda 更受欢迎/更好吗?
自从大约 2 年前我从 python/virtualenv 切换到 Anaconda 后,我已经快乐多了……它在科学/数据分析社区中非常流行,并且有 conda 包用于很多东西,你可以pip install
任何你需要的东西。最好的事情是支持非 python 依赖项(如 qt4)。从他们的网站引述“Pip 是一个包管理器,而 Virtualenv 是一个环境管理器。Conda 两者兼而有之。”所以这意味着 conda 可以处理诸如 qt4 之类的东西,它们不是 Python 的一部分,但仍然是您要运行的包的依赖项。
如果你走这条路,你会想要卸载你当前的 python 发行版,并从 anaconda 网站下载一个安装二进制文件,我怀疑你会发现重新创建你的环境比你可能会担心~
好吧,我想我现在已经准备好走这条路了,因为我无法弄清楚这个错误。作为一个新的 Mac OSX 用户,你能告诉我如何卸载 Python 吗?我认为它安装了 2.7,我使用 www.python.org/downloads 上的安装程序在其上安装了 3.5,然后 pip 在全局和我的用户上安装了一堆东西
看看 ***.com/questions/3819449/… ... 以供将来参考,不要安装类似的东西,而是使用像 homebrew
这样的包管理器,这使得卸载/升级更加干净。跨度>
【参考方案2】:
我为此苦苦挣扎了好几天,在查看了大量不同的堆栈溢出帖子后,终于找到了一个非常简单的解决方案。
这是我的 MacOSX 和 Python3.X 解决方案,适用于已经通过自制软件安装了 python3(即brew install python3
)并安装了 virtualenv 并且已经使用 python3 创建了虚拟环境(例如通过 virtualenvwrapper,mkvirtualenv myvenv -p python3
)的人:
(1) 使用 brew 安装 pyqt 和 sip:
$ brew install sip --with-python3
$ brew install pyqt --with-python3
(2) 将安装在/usr/local/Cellar/
(自制软件安装的默认位置)中的 pyqt 和 sip 文件链接到您的 virtualenv 中的 site-packages 目录:
$ ln -s /usr/local/Cellar/sip/SIPVERSION/lib/python3.X/site-packages/*.* ~/VIRTUALENVHOME/VIRTUALENVNAME/lib/python3.X/site-packages/
$ ln -s /usr/local/Cellar/pyqt/PYQTVERSION/lib/python3.X/site-packages/PyQt4/*.* ~/VIRTUALENVHOME/VIRTUALENVNAME/lib/python3.X/site-packages/PyQt4
确保根据系统需要修改大括号 中的文本,其中 VIRTUALENVHOME 是虚拟环境的路径,VIRTUALENVNAME 是它的名称,SIPVERSION 和 PYQTVERSION 是你的 sip 和 pyqt 版本下载。只需查看它们对应的目录/usr/local/Cellar/sip
和/usr/local/Cellar/pyqt
就可以找到它们(这些内容应该是带有版本号的单个目录)。另外不要忘记插入您正在使用的python3版本! (到所有说 python3.X 的地方)
(3) 在你的 virtualenv 中 pip install matplotlib(如果你还没有)并修改 matplotlibrc 以便 matplotlib 使用 PyQt4 后端而不是默认的 macosx 后端:
# activate your virtual environment
$ workon VIRTUALENVNAME # if you are using virtualenvwrapper
$ #source ~/VIRTUALENVHOME/VIRTUALENVNAME/bin/activate # if you are not using virtualenvwrapper
# if you haven't already, install matplotlib
$ pip install matplotlib
# modify the matplotlibrc file to change the backend it is using
$ nano ~/VIRTUALENVHOME/VIRTUALENVNAME/lib/python3.5/site-packages/matplotlib/mpl-data/matplotlibrc
这将在默认终端文本编辑器中打开 matplotlibrc
(或者您可以使用 open -e
而不是 nano
在 TextEdit 中打开它)。转到#### CONFIGURATION BEGINS HERE
之后的第一部分并将backend : macosx
行更改为backend : Qt4Agg
。在下一部分中,取消注释 backend.qt4 : PyQt4
行。
完成此操作后,您应该可以正常运行了。您可以测试这是否适用于以下简单的代码行(假设您在虚拟环境中安装了 ipython):
$ ipython -pylab
>>> import numpy as np
>>> plot(np.arange(10))
绘图应该显示为一条直线。如果这不起作用,请尝试在您的虚拟环境中重新安装 matplotlib(即 pip uninstall matplotlib
和 pip install matplotlib
)。
【讨论】:
【参考方案3】:我遇到了同样的问题,我所做的实际上解决了它(如果您不理解 Jorge 所说的一切,这可能会有所帮助!):
1. 继续使用 anaconda 导航器并启动 qtconsole
2. 输入:$brew install sip --with-python3
$brew install pyqt --with-python3
3.将结果复制到python中,然后执行。
现在尝试制作图表,它应该可以工作!
【讨论】:
【参考方案4】:解决了这个问题:
pip 安装 matplotlib 您的根目录中有一个名为 ~/.matplotlib 的目录。
在那里创建一个文件 ~/.matplotlib/matplotlibrc 并添加以下代码:backend: TkAgg
【讨论】:
重要的一点是改变默认后端。我的配置文件在~/.config/matplotlib/matplotlibrc
以上是关于如何让 matplotlib.pyplot 在 OSX 的虚拟环境中工作?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Matplotlib.pyplot.loglog 保存到文件中?