使用matplotlib

时间:2018-01-03 08:01:19

标签: python animation matplotlib networkx edge

我试图通过将边连接到不同的节点来模拟网络增长。以下代码在运行时会同时显示整个边和节点序列。 但是如何在延迟n个单位时间后(在同一图表中)显示一个边缘被添加到另一个边缘。我知道我必须使用动画'包但但不确定如何

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 个答案:

答案 0 :(得分:1)

基本上已经有了这个问题here的答案,但我决定写另一个针对您的具体问题的答案。我使用的nx.draw()nx.draw_networkx_edges分别返回draw_networkx_nodesLineCollections,而不是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()

结果如下:

result of the above code