ipython 笔记本的 matplotlib 和 libpng 问题

Posted

技术标签:

【中文标题】ipython 笔记本的 matplotlib 和 libpng 问题【英文标题】:matplotlib and libpng issues with ipython notebook 【发布时间】:2012-11-28 20:51:42 【问题描述】:

我试图使用 ipython notebook 。我安装了所有依赖库。但是,在启动 ipython 或 Ipython 控制台中的“savefig”函数时,我不能使用“--pylab=inline”选项。当我尝试执行其中任何一个时,由于执行 matplotlib,返回了一条错误消息“RuntimeError:无法创建写入结构”。此外,来自 notebookApp 提示的警告说“libpng 警告:应用程序使用 libpng-1.2.41 构建但使用 1.5.13 运行”。

但是,我安装了最新的 libpng(1.5.13),使用 pip uninstall 卸载了 matplotlib,并使用 pip install 重新安装了 matplotlib(在构建过程中,我可以看到 libpng1.5.13 用于构建 matplotlib)。

我的系统配置是Mac OS X10.6,python2.7。有没有人有类似的经历或者给点建议?

以下是回溯错误:

[<matplotlib.lines.Line2D at 0x106066d50>]
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/zmq/pylab/backend_inline.pyc in show(close)
    100     try:
    101         for figure_manager in Gcf.get_all_fig_managers():
--> 102             send_figure(figure_manager.canvas.figure)
    103     finally:
    104         show._to_draw = []

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/zmq/pylab/backend_inline.pyc in send_figure(fig)
    209     """
    210     fmt = InlineBackend.instance().figure_format
--> 211     data = print_figure(fig, fmt)
    212     # print_figure will return None if there's nothing to draw:
    213     if data is None:

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/core/pylabtools.pyc in print_figure(fig, fmt)
    102     try:
    103         bytes_io = BytesIO()
--> 104         fig.canvas.print_figure(bytes_io, format=fmt, bbox_inches='tight')
    105         data = bytes_io.getvalue()
    106     finally:

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/backend_bases.pyc in print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, **kwargs)
   2050                     orientation=orientation,
   2051                     dryrun=True,
-> 2052                     **kwargs)
   2053                 renderer = self.figure._cachedRenderer
   2054                 bbox_inches = self.figure.get_tightbbox(renderer)

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/backends/backend_agg.pyc in print_png(self, filename_or_obj, *args, **kwargs)
    501             _png.write_png(renderer._renderer.buffer_rgba(),
    502                            renderer.width, renderer.height,
--> 503                            filename_or_obj, self.figure.dpi)
    504         finally:
    505             if close:

RuntimeError: Could not create write struct

非常感谢,

【问题讨论】:

LD_LIBRARY_PATH 设置可能是您的问题。它可能是 matplotlib 使用的另一个库,它实际上是用 1.2.41 构建的。另外,您可以编辑您的帖子并复制粘贴完整回溯吗? 我使用了 export LD_LIBRARY_PATH="/opt/local/$LD_LIBRARY_PATH"(/opt/local/ 是我找到 libpng15 的位置),但没有任何区别。 不应该是LD_LIBRARY_PATH=/opt/local/lib:$LD_LIBRARY_PATH吗?但我怀疑你的问题也可能出在其他地方。你能从 IPython 之外的 matplotlib 中保存 pngs 吗?例如,来自简单脚本或来自默认 Python 提示符? 【参考方案1】:

也许它在运行时加载了错误的 libpng。如果您针对 libpng 1.5 构建 matplotlib,请确保您也使用它运行。 libpng 1.2 和 1.5 不兼容。

在 shell 中,您可以设置 DYLD_LIBRARY_PATH 以更改链接器首先搜索库的位置。

otool -L /<somepath>/matplotlib/_png.so

应该告诉你 matplotlib 在运行时发现了什么。

【讨论】:

【参考方案2】:

我有几乎完全相同的经历:

完全相同的“RuntimeError:无法创建写入结构” IPython 笔记本 完全相同的“libpng 警告:应用程序已构建” 使用 libpng-1.2.41 但运行 1.5.13" 相同的操作系统:Mac OS X10.6 py33-ipython @0.13.1_0+notebook+parallel(来自 MacPorts) python3.3(来自 MacPorts)代替你的 python2.7(我从你那里看到的唯一差异)

我认为 IPython 的 MacPorts 配方对于某些操作系统版本可能存在一些问题。

不知道你从哪里得到你的 python2.7,但我的解决方案是我最终放弃了 MacPorts 转而支持homebrew(这也有一些问题,但我能够通过直接从源安装一些包来解决它们,见this question)。

【讨论】:

【参考方案3】:

我也有这个问题。另一种解决方案是将笔记本渲染图像的格式从“png”更改为“svg”。这可以在您的config file 中完成。我的位置:

~/.ipython/profile_default/ipython_notebook_config.py

有一条线是这样的

# c.InlineBackend.figure_format = 'png'

取消注释并更改为“svg”对我有用:

c.InlineBackend.figure_format = 'svg'

【讨论】:

不错的一个! +1 来自我;这不仅为我解决了问题,而且 svg 是从浏览器中的本机标记呈现的,因此它是在基于浏览器的 ipython 笔记本中呈现绘图的更好选择,并且它应该与 javascript 绘图库(例如,D3-基于 mpld3 的库)。【参考方案4】:

我在 OS X Mavericks 上遇到了同样的问题,通过自制软件安装了 libpng 并安装了 XQuartz。事实证明,matplotlib 在编译时找到了较旧的 XQuartz libpng 版本,但在运行时找到了更新的自制 libpng。

我找到的最佳解决方案来自this comment by jaengelberg on github:卸载 matplotlib,暂时重命名 XQuartz libpng 标头,使其无法找到,安装 matplotlib,然后将标头名称改回。

这里是完整的:

pip uninstall matplotlib
cd /opt/X11/include/libpng15
sudo mv png.h _png.h
sudo mv pngconf.h _pngconf.h
sudo mv pnglibconf.h _pnglibconf.h
pip install matplotlib
sudo mv _png.h png.h
sudo mv _pngconf.h pngconf.h
sudo mv _pnglibconf.h pnglibconf.h

【讨论】:

【参考方案5】:

我在 Anaconda 环境中工作时尝试在 Jupyter Notebook 中查看来自 OpenCV 的图像时遇到了同样的问题。强制重新安装 matplotlib 对我有用:

pip install -U --force-reinstall matplotlib

我在查看 Matt 的解决方案中的 this GitHub link 时发现了这种方法。

【讨论】:

【参考方案6】:

对我来说

%matplotlib inline

在所有 matplotlib 导入解决此问题之前

【讨论】:

不知道为什么会这样,但它也对我有用!使用 Python2.7,只有在运行 %matplotlib inline 之前的其他导入是 numpycv2matplotlib.pyplot 本身。

以上是关于ipython 笔记本的 matplotlib 和 libpng 问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 IPython 笔记本中隐藏 <matplotlib.lines.Line2D>

在 ipython 笔记本中显示 matplotlib 时出错

使用 pandas 或 matplotlib 在 IPython 笔记本中绘制性别图表

如何在 ipython 笔记本中设置 matplotlib 图形默认大小?

如何在 IPython 笔记本中打开交互式 matplotlib 窗口?

osx上的Ipython笔记本matplotlib gui后端dlopen导入错误