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

2024-04-28 16:06:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: posbrimportnetworkxaddnode节点plt
1条回答
网友
1楼 · 发布于 2024-04-28 16:06:00

此命令: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)保持固定

相关问题 更多 >