将LineCollection转换为数组或对Networkx图进行动画处理

4
我正在尝试使用networkx.draw函数的输出结果(LineCollection),以便在需要数组的matplotlib.animation中使用。我不想将我的图形保存为png格式,因为会有很多这样的图形。我也不想显示它,但这并不是必要的。
以下是一个简单的代码示例:
import networkx as nx
graph= nx.complete_graph(5) #a simple graph with five nodes
Drawing=nx.draw(graph)

这会输出一个Python集合:
<matplotlib.collections.LineCollection at 0xd47d9d0>

我希望创建一个这样的图纸列表:
artists=[]
artists.append(Drawing)

并将这些图纸用于动画制作:

import matplotlib
fig= plt.figure()  #initial figure, which can be empty
anim=matplotlib.animation.ArtistAnimation(fig, artists,interval=50, repeat_delaty=1000)

然而,我遇到了以下 TypeError 错误:
TypeError: 'LineCollection' object is not iterable

所以,我认为“艺术家列表”应该是一组图像,这些图像应该是numpy数组、png图像或一些称为PIL的东西(我不熟悉),我不知道如何将集合转换为其中之一而不保存图像为png或任何其他格式。
实际上,这就是我想要做的事情:一个动态动画,当我尝试使用im = plt.imshow(f(x, y))与我拥有的绘画之一时,会出现此错误:
TypeError: Image data can not convert to float

我希望我表达清晰了,这是我第一次使用动画和绘图工具。有没有人能提供一个解决方案?

1个回答

2
这里有一个动态动画(如果您想以这种方式查看,它可以在iPython笔记本中工作)。本质上,您想使用draw_networkx并为每个帧提供要绘制的项目。为了防止每次调用该函数时位置发生变化,您需要重复使用相同的位置(如下所示pos)。
%pylab inline  #ignore out of ipython notebook
from IPython.display import clear_output #ignore out of ipython notebook

import networkx as nx
graph= nx.complete_graph(5) #a simple graph with five nodes

f, ax = plt.subplots()

pos=nx.spring_layout(graph)

for i in range(5):
    nx.draw_networkx(graph, {j:pos[j] for j in range(i+1)}, ax=ax, nodelist=graph.nodes()[0:i+1], 
                     edgelist=graph.edges()[0:i], with_labels=False)
    ax.axis([-2,2,-2,2]) #can set this by finding max/mins

    time.sleep(0.05)
    clear_output(True) #for iPython notebook
    display(f)
    ax.cla() # turn this off if you'd like to "build up" plots

plt.close()

我用Ipython尝试了你的代码,它输出类似于'<matplotlib.figure.Figure at 0x4a6f0b0>'但没有显示。你的代码没有清除显示,只是清除了轴,我不明白为什么我们每次都要重新绘制轴。而我想做的是清除图像并重新绘制它。我尝试使用'plt.ion()'和'plt.show()'以及'clf()',但Python显示出现了一些问题,这并没有帮助我保存动画,有什么想法吗?我还使用了'nx.draw_network(graph, pos)'作为位置,它与之有何不同? - potato
我刚刚使用了这个答案中的一个想法,使用了pause()代替计时器,并使用了pylab.draw()代替plt.show,我不知道为什么,但它起作用了!所以你可以忽略之前的问题。但是我仍然无法解决视频问题。 - potato
抱歉,我不确定您所说的视频问题是什么?如果您取消注释此处的倒数第二行,您应该可以得到视频。 - ChrisE
matplotlib网站上的示例使用一个函数创建每个图像,它输出一个数组。 matplotlib.animation.ArtistAnimation需要一个numpy数组或png图片来创建动画。在我的情况下,networkx输出集合,我不能使用,所以我必须将它们保存为png。但我不想这样做,因为会有很多图片。我的原始问题是如何将集合转换为数组或等效于png而不保存每个新图像; 这样我就可以用它来创建视频。 - potato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接