我试图通过将边连接到不同的节点来模拟网络增长。以下代码在运行时会同时显示整个边和节点序列。 但是如何在延迟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)
我希望这种意图是正确的。运行代码时,会显示一个图表,但是如何让每个边缘一个接一个地出现,而不是同时出现。
答案 0 :(得分:1)
基本上已经有了这个问题here的答案,但我决定写另一个针对您的具体问题的答案。我使用的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()
结果如下: