Анимация роста сети с помощью 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, но есть ли способ заставить ее работать так?
Ответы
Ответ 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)