如何在树结构中的其他位置添加节点时保持节点固定?

时间:2015-08-02 10:49:06

标签: python networkx

我正在制作一种程序,使用 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()

1 个答案:

答案 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)

保持固定