Анимация роста сети с помощью NetworkX и Matplotlib - программирование
Подтвердить что ты не робот

Анимация роста сети с помощью NetworkX и Matplotlib

Я хотел бы оживить график, который растет с течением времени.

Это то, что у меня есть до сих пор:

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'
[email protected]:~/Desktop/CS8903-SpecialProblem/Code/

То, что я хочу, это анимация, где вы можете видеть, как график растет. Я могу сохранить график на каждом этапе и может создать анимацию вне matplotlib, но есть ли способ заставить ее работать так?

4b9b3361

Ответ 1

После обзора этот код не был почти уместным для этой проблемы, как я думал. Тем не менее, я смог использовать этот SO ответ и этот SO ответ, чтобы собрать ответ для вас. Здесь код, который создаст граф, добавит к нему 50 случайных узлов и 50 случайных ребер и покажет изображение графика после каждого node и добавляется кромка. Несколько ключевых изменений из вашего кода:

  • Этот код основан на использовании pylab.ion() (см. здесь для получения дополнительной информации).
  • Ваш код пытается использовать одну фигуру и изменять изображение внутри нее. Этот код создает новую цифру для каждого кадра.
  • Этот код не записывается в .mp4. Если вам действительно нужно это сделать, я бы предложил написать данные в файл .png при их рендеринге и преобразовать в mp4 после факта.
  • Обратите внимание, что этот код использует 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)

Ответ 2

Улучшенная версия бретланса. Надеюсь, это будет полезно. Он покажет анимацию, но не изображение после изображения.

Все еще не знаю, как владелец вопроса Анимированные чертежи для сетевых краев использование анимации matplotlib

#!/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)