我通常在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'
答案 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的情节表示。