igraph情节功能不会在IPython笔记本中显示图像

时间:2014-11-12 12:54:04

标签: graphics ipython igraph

我尝试在IPython笔记本中进行基本的igraph绘图:

fn = 'misrables.gml'
gr = igraph.Graph.Read_GML(fn)
igraph.plot(gr)

而不是看图表我看到了:

Out[7]: <igraph.drawing.Plot at 0x1120d6978>

如何说服IPython实际显示图形?

一些澄清

内联matplotlib运行正常,所以这不是问题。

我安装了cairo

import cairo
cairo.version

输出:1.10.0

在绘图对象上调用_repr_svg()会导致错误:

TypeError                                 Traceback (most recent call last)
/Users/boris/Documents/workspace/communityAnalysis/src/utils.py in <module>()
----> 1 z = ig.plot(gr)._repr_svg_()

/usr/local/lib/python3.4/site-packages/igraph/drawing/__init__.py in _repr_svg_(self)
    362         # No idea why this is needed but python crashes without
    363         context.show_page()
--> 364         surface.finish()
    365         # Return the raw SVG representation
    366         return io.getvalue()

TypeError: string argument expected, got 'bytes'

2 个答案:

答案 0 :(得分:3)

您的计算机上是否安装了Cairo库及其Python绑定? igraph的Plot对象有一个_repr_svg_方法,足以让IPython显示情节,但_repr_svg_在幕后使用Cairo将图形绘制成SVG文件,所以如果你没有Cairo,_repr_svg_可能会抛出IPython吞下的异常,然后你得到一个普通的repr()表示。

更新:根据更新的帖子,结果发现问题是_repr_svg_没有为Python 3.x做准备,因为它使用了StringIO对象一个BytesIO对象本来是合适的。在函数开头用io = StringIO()替换io = BytesIO()并在最后用return io.getvalue()替换return io.getvalue().decode()可以解决问题。 from io import BytesIO的顶部也需要igraph/drawing/__init__.py。已经在GitHub上提交了bug report;该问题将在下一个次要版本中修复。

更新:问题现已在开发版中修复;请参阅this commit获取补丁。

答案 1 :(得分:0)

在python 3.7.4和IPython 7.8.0中更新igraph 0.7.1 如果您通过以下方式安装软件包:

conda install python-igraph

然后您可以简单地使用

igraph.plot(gr).show()

,在Ubuntu中,使用ImageMagick在单独的窗口中自动显示.png