Динамическое добавление ребер в сети с помощью matplotlib

Я пытаюсь смоделировать рост сети, имея ребра, соединяющиеся с различными узлами. Следующий код при запуске отображает всю последовательность ребер и узлов одновременно. Но как мне показать, что одно ребро добавляется к другому после задержки в n единиц времени (на том же графике). Я понимаю, что должен использовать пакет 'animation', но не уверен, как

import networkx as nx
import matplotlib.pyplot as plt

def f1(g):

    nodes = set([a for a, b in g] + [b for a, b in g])

    G=nx.Graph()

    for node in nodes:
       G.add_node(node)

    for edge in g:
       G.add_edge(edge[0], edge[1])

    pos = nx.shell_layout(G)

    nx.draw(G, pos)

    plt.show()

g = [(10, 11),(11, 12),(12, 13), (13, 15),(15,10)]
f1(g)

Я надеюсь, что намерение правильно. Когда код выполняется, график действительно отображается, но как сделать так, чтобы каждое ребро появлялось одно за другим, а не появлялось одновременно.

1 ответ

По сути, здесь уже есть ответ на этот вопрос, но я решил написать еще один ответ, соответствующий вашей конкретной проблеме. Вместо того, чтобы использовать nx.draw(), Я использую nx.draw_networkx_edges а также draw_networkx_nodes, которые возвращают LineCollections и PathCollection соответственно. Затем их можно изменить несколькими способами, например, вы можете изменить цвет каждого отрезка линии в LineCollection, В начале я установил цвета всех ребер на white а потом я использую matplotlib.animation.FuncAnimation изменить эти цвета сегмента на black один за другим через определенные промежутки времени. Как только все края станут черными, анимация начнется заново. Надеюсь это поможет.

import networkx as nx
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

g = [(10, 11),(11, 12),(12, 13), (13, 15),(15,10)]

fig = plt.figure()

G = nx.Graph()
G.add_edges_from(g)
G.add_nodes_from(G)

pos = nx.shell_layout(G)
edges = nx.draw_networkx_edges(G, pos, edge_color = 'w')
nodes = nx.draw_networkx_nodes(G, pos, node_color = 'g')

white = (1,1,1,1)
black = (0,0,0,1)

colors = [white for edge in edges.get_segments()]

def update(n):
    global colors

    try:
        idx = colors.index(white)
        colors[idx] = black
    except ValueError:
        colors = [white for edge in edges.get_segments()]

    edges.set_color(colors)
    return edges, nodes

anim = FuncAnimation(fig, update, interval=150, blit = True) 

plt.show()

Результат выглядит так:

результат приведенного выше кода

Другие вопросы по тегам