Анимирайте разпространението на графики с NetworkX

Искам да анимирам процес на графика (за предпочитане в 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 тетрадка.


person Ashkan    schedule 04.08.2015    source източник
comment
Едно възможно решение може да бъде да начертаете графиката във всяка стъпка от процеса с различни цветове на възлите, да запазите всеки от тях и да направите gif анимация с всички запазени снимки. Това бих препоръчал.   -  person Joel    schedule 05.08.2015


Отговори (2)


Ето един опростен, съкратен пример за анимация, който трябва да бъде полезен за всеки, който търси networkx анимации. И всъщност работи, ако го стартирате.

import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
from matplotlib import animation


def simple_update(num, n, layout, G, ax):
    ax.clear()

    # Draw the graph with random node colors
    random_colors = np.random.randint(2, size=n)
    nx.draw(G, pos=layout, node_color=random_colors, ax=ax)

    # Set the title
    ax.set_title("Frame {}".format(num))


def simple_animation():

    # Build plot
    fig, ax = plt.subplots(figsize=(6,4))

    # Create a graph and layout
    n = 30 # Number of nodes
    m = 70 # Number of edges
    G = nx.gnm_random_graph(n, m)
    layout = nx.spring_layout(G)

    ani = animation.FuncAnimation(fig, simple_update, frames=10, fargs=(n, layout, G, ax))
    ani.save('animation_1.gif', writer='imagemagick')

    plt.show()

simple_animation()

Имате нужда от една функция, simple_animation за настройка и изпълнение на анимацията, и една функция, simple_update за актуализиране на анимацията. fargs ви позволява да предавате аргументи към функцията simple_update.

Тази анимация просто задава произволни цветове, трябва да можете да я адаптирате за всяка друга цел.

person chasmani    schedule 08.07.2019
comment
Можете ли да накарате анимацията да се показва в конзолата на jupyter, вместо да запазвате .gif файла? Опитах да стартирам вашия скрипт и мога да накарам анимацията да се показва в конзолата на jupyter само ако премахна def simple_animation() и изпълня анимацията в основния скрипт, а не във функцията. - person Adam Gosztolai; 23.09.2019
comment
Съжалявам, че не използвам jupyter - person chasmani; 25.09.2019

Внедрих анимирана топлинна дифузия на Networkx, използвайки рамка matplotlib animation. Ако инсталирате плъгина JSAnimation за преносими компютри IPython, можете дори да визуализирате анимацията във вашия бележник!

Алгоритъмът трябва да бъде нещо подобно:

import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation

# Optionnal if you want to animate in your notebook
from JSAnimation import IPython_display

def update_func(step, data, nodes):
    # the step parameter is mandatory for matplotlib
    # Set new value for figure data
    # update node color here
    new_data = data + 1
    nodes.set_array(new_data)
    return nodes

def diffuse_anim(inputs, G, data, nb_frames=50):
    fig = plt.figure()
    nodes = nx.draw_networkx_nodes(G, pos, node_size=30, node_color='b')
    return animation.FuncAnimation(fig, update_func, frames=xrange(nb_frames), fargs=(data, nodes))

В моето приложение можехте да видите разпространение на топлинна дифузия от различни източници в хубава анимация в бележник IPython.

въведете описание на изображението тук

person Kirell    schedule 05.08.2015