Какой инструмент для рисования анимированного сетевого графика - PullRequest
0 голосов
/ 16 мая 2018

Я хотел бы получить анимацию распределения вероятностей случайного блуждания на сложном графике.В настоящее время я использую Python и NetworkX для манипулирования графиком и оценки динамики ходьбы.

Моя цель - создать анимацию (скажем, файл GIF), где каждый узел графа имеет размер, пропорциональный его степени (или другим топологическим свойствам), и цвет, пропорциональный скалярному атрибуту (вероятностираспределение).Размер и положение узла остаются неизменными во времени, но цвет меняется.

В настоящее время я могу нарисовать график с нужными свойствами в определенный момент времени, используя Gephi , но я хотел бы знать, как сделать анимацию или как автоматизировать процесс создания изображения для каждого момента времени.

Может ли кто-нибудь указать на какое-нибудь упоминание, где было сделано нечто подобное?Я также могу использовать другие инструменты визуализации, кроме Gephi.На самом деле, я бы идеально использовал весь свой рабочий процесс на Python, не прибегая к внешним программам.

1 Ответ

0 голосов
/ 16 мая 2018

Довольно просто с FuncAnimation в matplotlib:

import numpy as np
import matplotlib.pyplot as plt; plt.close('all')
import networkx as nx
from matplotlib.animation import FuncAnimation

def animate_nodes(G, node_colors, pos=None, *args, **kwargs):

    # define graph layout if None given
    if pos is None:
        pos = nx.spring_layout(G)

    # draw graph
    nodes = nx.draw_networkx_nodes(G, pos, *args, **kwargs)
    edges = nx.draw_networkx_edges(G, pos, *args, **kwargs)
    plt.axis('off')

    def update(ii):
        # nodes are just markers returned by plt.scatter;
        # node color can hence be changed in the same way like marker colors
        nodes.set_array(node_colors[ii])
        return nodes,

    fig = plt.gcf()
    animation = FuncAnimation(fig, update, interval=50, frames=len(node_colors), blit=True)
    return animation

total_nodes = 10
graph = nx.complete_graph(total_nodes)
time_steps = 20
node_colors = np.random.randint(0, 100, size=(time_steps, total_nodes))

animation = animate_nodes(graph, node_colors)
animation.save('test.gif', writer='imagemagick', savefig_kwargs={'facecolor':'white'}, fps=0.5)

enter image description here

...