在ipython中用igraph绘制图形时出现"TypeError: 没有行属性"layout

0 投票
1 回答
2802 浏览
提问于 2025-04-18 16:41

我最近在我的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图。)

撰写回答