我正在制作一种程序,使用 Networkx Python中的动画在树形结构中动态添加节点。代码工作正常,没有任何错误,但每次添加新节点时,图形的布局或设计都会发生变化,我想让它变为静态。
我可以使用graphviz布局将前一个节点的初始位置固定吗?
import os, sys
import networkx
import matplotlib.animation as animation
import matplotlib.pyplot as plt
import random
def draw():
mote_color = []
mote_list = []
G = networkx.Graph()
nodes_list = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
node = random.choice(nodes_list)
def animate(self):
plt.clf()
node = random.choice(nodes_list)
mote_list.append(node)
G.add_node("BR")
for node in mote_list:
G.add_node(node)
G.add_edge("BR",node)
print(mote_list)
pos = networkx.graphviz_layout(G)
networkx.draw(G,pos,nodelist=["BR"],node_shape="p",node_size=2000)
networkx.draw(G,pos,nodelist=mote_list,node_shape="s",node_size=500)
fig = plt.figure(figsize=(16,12))
plt.clf()
anim = animation.FuncAnimation(fig, animate, frames=20, interval=2000, blit=False)
plt.show()
draw()
答案 0 :(得分:1)
此命令:pos = networkx.graphviz_layout(G)
重新计算所有节点的位置。因此,每次在循环中调用它时,所有节点都会获得新的位置。
如果可能,最好的选择是创建整个图并计算pos
。然后绘制它们一次添加一个节点。
但如果您事先不知道图表是什么样的,那么就不能这样做。在这种情况下,您要做的就是用自己的方式来定义dict pos
。因此,当您添加新节点v
时,您必须定义pos[v]
。一个明显的问题是,最后,网络可能看起来很混乱,因为你不知道最后的布局会是什么样的。
有关graphviz的更多详细信息位于this question。可以使用spring_layout
并指定现有节点由pos = nx.spring_layout(G, fixed=list_of_fixed_nodes)