我正在制作一种程序,其中使用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()
此命令:
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)
保持固定相关问题 更多 >
编程相关推荐