我尝试在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'
答案 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