在ipython中用igraph绘制图形时出现"TypeError: 没有行属性"layout
我最近在我的Windows电脑上安装了igraph,并通过Anaconda使用iPython。我一直在按照igraph官网的教程学习,因为我通常使用NetworkX。不过,我在绘制我的图时遇到了麻烦。
一开始,我意识到可能是因为我没有启用 pylab inline
,所以收到了一个错误提示:NameError: name 'plot' is not defined
。
但是在我启用这个选项后,再次尝试绘制图形时,又出现了一个错误:TypeError: There is no line property "layout"
。
我只是想在iPython中绘制我的网络,但我不知道自己哪里出错了。
import igraph
import cairo
g = igraph.Graph([(0,1), (0,2), (2,3), (3,4), (4,2), (2,5), (5,0), (6,3), (5,6)])
cairo.__path__
Out[4]: ['C:\\Users\\Curtis\\Anaconda\\lib\\site-packages\\cairo']
layout = g.layout_kamada_kawai()
plot(g, layout = layout)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-6-df59bbbf0497> in <module>()
----> 1 plot(g, layout = layout)
NameError: name 'plot' is not defined
启用pylab inline后:
pylab inline
Populating the interactive namespace from numpy and matplotlib
plot(g, layout = layout)

---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-8-df59bbbf0497> in <module>()
----> 1 plot(g, layout = layout)
C:\Users\Curtis\Anaconda\lib\site-packages\matplotlib\pyplot.pyc in plot(*args, **kwargs)
2985 ax.hold(hold)
2986 try:
-> 2987 ret = ax.plot(*args, **kwargs)
2988 draw_if_interactive()
2989 finally:
C:\Users\Curtis\Anaconda\lib\site-packages\matplotlib\axes.pyc in plot(self, *args, **kwargs)
4135 lines = []
4136
-> 4137 for line in self._get_lines(*args, **kwargs):
4138 self.add_line(line)
4139 lines.append(line)
C:\Users\Curtis\Anaconda\lib\site-packages\matplotlib\axes.pyc in _grab_next_args(self, *args, **kwargs)
315 return
316 if len(remaining) <= 3:
--> 317 for seg in self._plot_args(remaining, kwargs):
318 yield seg
319 return
C:\Users\Curtis\Anaconda\lib\site-packages\matplotlib\axes.pyc in _plot_args(self, tup, kwargs)
303 ncx, ncy = x.shape[1], y.shape[1]
304 for j in xrange(max(ncx, ncy)):
--> 305 seg = func(x[:, j % ncx], y[:, j % ncy], kw, kwargs)
306 ret.append(seg)
307 return ret
C:\Users\Curtis\Anaconda\lib\site-packages\matplotlib\axes.pyc in _makeline(self, x, y, kw, kwargs)
255 **kw
256 )
--> 257 self.set_lineprops(seg, **kwargs)
258 return seg
259
C:\Users\Curtis\Anaconda\lib\site-packages\matplotlib\axes.pyc in set_lineprops(self, line, **kwargs)
196 funcName = "set_%s" % key
197 if not hasattr(line, funcName):
--> 198 raise TypeError('There is no line property "%s"' % key)
199 func = getattr(line, funcName)
200 func(val)
TypeError: There is no line property "layout"
1 个回答
3
你的命令
plot(g, layout = layout)
有问题。在第一个情况下没有plot
。在第二个情况下,你从matplotlib
加载了各种东西到公共命名空间中,结果plot
指向了matplotlib.pyplot.plot
。
你真正想调用的是igraph.plot
。所以,把上面的那一行替换成
igraph.plot(g, layout=layout)
来使用正确的函数。
这里有一个简单的例子:
import igraph
g = igraph.Graph([(0,1), (0,2), (2,3), (3,4), (4,2), (2,5), (5,0), (6,3), (5,6)])
igraph.plot(g, target="/tmp/igraph_demo.png")
会生成:
注意,这会创建一个文件。如果你的plot
没有加上target="..."
,并且屏幕上什么都没有显示,那就是配置的问题。解决方法取决于你的操作系统。(igraph
使用cairo
来绘制SVG图。)