16

我想制作一个随时间增长的图表。

这是我到目前为止所拥有的:

fig = plt.figure()
ims = []
graph = nx.Graph()
for i in range(50):
    // Code to modify Graph
    nx.draw(graph, pos=nx.get_node_attributes(graph,'Position'))
    im = plt.draw()
    self.ims.append([im])
ani = animation.ArtistAnimation(fig, ims, interval=50, blit=True,repeat_delay=1000)
ani.save('dynamic_images.mp4')
plt.show()

但是,我收到以下错误消息:

 File "main.py", line 204, in <module>
    repeat_delay=1000)
  File "/usr/lib/pymodules/python2.7/matplotlib/animation.py", line 356, in __init__
    TimedAnimation.__init__(self, fig, *args, **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/animation.py", line 304, in __init__
    Animation.__init__(self, fig, event_source=event_source, *args, **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/animation.py", line 53, in __init__
    self._init_draw()
  File "/usr/lib/pymodules/python2.7/matplotlib/animation.py", line 363, in _init_draw
    artist.set_visible(False)
AttributeError: 'NoneType' object has no attribute 'set_visible'
nicomoto@nicomoto-VirtualBox:~/Desktop/CS8903-SpecialProblem/Code/

我想要的是一个动画,你可以在其中看到图形的增长。我可以在每个阶段保存图形,并且可能能够在 matplotlib 之外创建动画,但是有没有办法让它像这样工作?

4

3 回答 3

16

布雷特兰斯的改进版。希望它会有所帮助。它将显示动画,但不会显示图片

还是不知道 Animate drawing networkx edges的题主怎么 利用matplotlib的animation

#!/usr/bin/env python
import random
import pylab
from matplotlib.pyplot import pause
import networkx as nx
pylab.ion()

graph = nx.Graph()
node_number = 0
graph.add_node(node_number, Position=(random.randrange(0, 100), random.randrange(0, 100)))

def get_fig():
    global node_number
    node_number += 1
    graph.add_node(node_number, Position=(random.randrange(0, 100), random.randrange(0, 100)))
    graph.add_edge(node_number, random.choice(graph.nodes()))
    nx.draw(graph, pos=nx.get_node_attributes(graph,'Position'))

num_plots = 50;
pylab.show()

for i in range(num_plots):

    get_fig()
    pylab.draw()
    pause(2)
于 2012-12-15T11:39:55.113 回答
10

经过审查,该代码与我想象的这个问题的相关性并不高。但是,我能够使用这个 SO 答案这个 SO 答案为你拼凑一个答案。下面的代码将创建一个图形,向其中添加 50 个随机节点和 50 个随机边,并在添加每个节点和边后显示图形的图像。代码中的一些关键更改:

  1. 此代码基于 using pylab.ion()(有关更多信息,请参见此处)。
  2. 您的代码尝试使用一个图形并更改其中的图像。此代码为每一帧创建一个新图形。
  3. 此代码不会写入 .mp4。如果你真的需要这样做,我建议在渲染它们时将这些数字写入 .png 文件,并在事后转换为 mp4。
  4. 请注意,此代码使用matplotlib.pyplot.pause()而不是time.sleep(). 如果您使用time.sleep().

祝你好运!

import random
import pylab
from matplotlib.pyplot import pause
import networkx as nx
pylab.ion()

graph = nx.Graph()
node_number = 0
graph.add_node(node_number, Position=(random.randrange(0, 100), random.randrange(0, 100)))

def get_fig():
    global node_number
    node_number += 1
    graph.add_node(node_number, Position=(random.randrange(0, 100), random.randrange(0, 100)))
    graph.add_edge(node_number, random.choice(graph.nodes()))
    fig = pylab.figure()
    nx.draw(graph, pos=nx.get_node_attributes(graph,'Position'))
    return fig

num_plots = 50;
pylab.show()

for i in range(num_plots):

    fig = get_fig()
    fig.canvas.draw()
    pylab.draw()
    pause(2)
    pylab.close(fig)
于 2012-11-26T19:08:28.167 回答
5

由于现有的答案已经很老了,这里有一个版本的代码在当前版本的 matplotlib 和 networkx 下的样子。

import random
import networkx as nx
import matplotlib.pyplot as plt

graph = nx.Graph()
num_plots = 50
for node_number in range(num_plots):
    graph.add_node(node_number, Position=(random.randrange(0, 100), random.randrange(0, 100)))
    graph.add_edge(node_number, random.choice(list(graph.nodes())))
    nx.draw(graph, pos=nx.get_node_attributes(graph,'Position'))
    plt.pause(0.5)
于 2020-05-29T21:59:15.027 回答