Я хочу анимировать процесс на графике (желательно в NetworkX). Я уже видел этот вопрос. Однако, когда я запускаю код, указанный в решении, я вижу только конечный результат. Кроме того, это не сохраняет анимацию в каком-либо пригодном для использования формате.
Предположим, у нас есть следующий график:
import networkx as nx
g = nx.Graph()
g.add_edges_from([(1, 2), (2, 3), (1, 3), (1, 4), (3, 4), (4, 5), (5, 9), (4, 9)])
Также у нас есть начальный набор узлов, которые мы называем активными:
active = {1, 3}
Интуитивно я хочу анимировать, как каждый активный узел заставит другие узлы в графе становиться активными во времени. Итак, если мы предположим модель, в которой каждый узел становится активным, если активируются хотя бы два его соседа, во второй итерации набор активных узлов будет:
active = {1, 3, 2, 4}
На следующей итерации набор активных узлов будет:
active = {1, 3, 2, 4, 5}.
На последней итерации все узлы графа станут активными:
active = {1, 3, 2, 4, 5, 9}
Этот процесс, называемый процессом опрокидывания, является примером распространения информации в сетях. Вы можете увидеть очень простую реализацию алгоритма ниже.
def tipping(graph, seed_set, thr=2):
active = seed_set
has_changed = False
for n in filter(lambda n: n not in active, graph.nodes()):
if len(filter(lambda nei: nei in active, graph.neighbors(n))) >= thr:
active.add(n)
has_changed = True
if has_changed:
return tipping(graph, active, thr) | active
return active
Я хочу знать, есть ли способ визуализировать этот процесс. Я знаю, что могу нарисовать сеть с помощью функции nx.draw()
в networkX. Однако я не видел ни одной функции, которая создавала бы анимацию или какой-либо другой полезный вывод для этого сценария.
Одним из возможных решений может быть построение графика на каждом этапе процесса с разными цветами узлов, сохранение каждого из них и создание анимации gif со всеми сохраненными изображениями.
Как я могу анимировать распространение с помощью Networkx? Предпочтительно, чтобы анимация выполнялась в блокноте IPython.