如何让 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、versionversion_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 matplotlibpip 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 保存到文件中?

如何解决 import matplotlib.pyplot as plt 错误?

修改 matplotlib.pyplot 图中的网格

matplotlib.pyplot画图笔记

Matplotlib/pyplot:如何强制执行轴范围?

如何将货币格式添加到 matplotlib.pyplot.text? [复制]