使用NetworkX动画图扩散

时间:2015-08-04 17:18:17

标签: python animation matplotlib graph networkx

我想在图表上制作流程动画(最好是在NetworkX中)。我已经看过this question了。但是,当我运行解决方案中给出的代码时,我只看到最终输出。此外,这并不能以某种可用的格式保存动画。

假设我们有以下图表:

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

我想知道是否有任何方法可以看到这个过程。我知道我可以在networkX中使用nx.draw()函数绘制网络。但是,我还没有看到任何为此场景生成动画或任何其他有用输出的函数。

一种可能的解决方案可能是使用不同的节点颜色在流程的每个步骤中绘制图形,保存每个节点并制作包含所有已保存图片的gif动画。

如何使用Networkx为扩散设置动画?优选地,动画将在IPython笔记本中运行。

2 个答案:

答案 0 :(得分:0)

我使用matplotlib animation框架实现了动画Networkx热扩散。如果您为IPython笔记本安装JSAnimation插件,您甚至可以在笔记本中可视化动画!

算法应该是这样的:

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笔记本中看到来自不同来源的热扩散传播。

enter image description here

答案 1 :(得分:0)

这是一个简化的精简动画示例,对正在寻找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函数。

此动画仅设置随机颜色,您应该可以将其调整为其他用途。