在ipython中使用igraph绘制顶点标签的图表

时间:2015-06-04 09:47:02

标签: svg matplotlib plot ipython igraph

我通常在IPython笔记本中工作,我在Windows上使用命令

打开它
ipython qtconsole --matplotlib inline

我目前正在使用IPython QtConsole 3.0.0,Python 2.7.9和IPython 3.0.0。

我想绘制图表及其标签

from igraph import *
g = Graph.Lattice([4,4],nei=1,circular=False)
g.vs["label"]=[str(i) for i in xrange(16)]
plot(g, layout="kk")

通过这种方式,我获得了图表的内联图,但是有没有标签,并且每个丢失的标签都出现以下消息错误

link glyph0-x hasn't been detected!

其中x是某个整数。

我还尝试使用plot()直接在vertex_label = ...命令中指定标签,但没有任何作用。

在我看来,标签定义正确,问题在于ipython笔记本和/或用于绘制图形的模块。有人可以帮我解决这个问题吗?

我还尝试了所有可能的数字格式SVG和PNG,使用下面的命令,但问题仍然存在。

%config InlineBackend.figure_format = 'svg'
%config InlineBackend.figure_format = 'png'

1 个答案:

答案 0 :(得分:3)

这个问题可能存在于Qt及其SVG实现的内部深处。将图形格式设置为png没有用,因为igraph仅提供图形对象的SVG表示,因此我怀疑IPython首先创建SVG表示,然后将其栅格化为PNG。问题只能通过修补Plot中的igraph/drawing/__init__.py类来解决。必须从类中删除_repr_svg_方法并添加以下方法:

def _repr_png_(self):
    """Returns a PNG representation of this plot as a string.

    This method is used by IPython to display this plot inline.
    """
    # Create a new image surface and use that to get the PNG representation
    surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, int(self.bbox.width),
                                 int(self.bbox.height))
    context = cairo.Context(surface)
    # Plot the graph on this context
    self.redraw(context)
    # No idea why this is needed but Python crashes without this
    context.show_page()
    # Write the PNG representation
    io = BytesIO()
    surface.write_to_png(io)
    # Finish the surface
    surface.finish()
    # Return the PNG representation
    return io.getvalue()

我在igraph的Python界面的官方代码中做这个修改有点不安; SVG表示通常更好(和可扩展),但它似乎也导致Windows和Mac OS X上的问题。如果阅读这篇文章的人对Qt及其SVG实现有更多的经验,我会很感激帮助找到这个bug的根本原因,这样我们就可以在igraph中保留SVG的情节表示。