代码之家  ›  专栏  ›  技术社区  ›  Yadeses

Networkx动画,图形不变

  •  0
  • Yadeses  · 技术社区  · 8 年前

    我有以下代码: https://pastebin.com/L4KfLhMc

    其中最重要的部分是:

    def animate(i):
        ax.clear()
        plt.axis('off')
        edges = G.edges()
        edge1, edge2 = random.sample(edges, 2)
        while set(edge1) & set(edge2):
            edge1, edge2 = random.sample(edges, 2)
    
        new_edge1 = (edge1[0], edge2[1])
    
        new_edge2 = (edge1[1], edge2[0])
    
        if not(new_edge1 in edges or new_edge2 in edges):
    
            G.remove_edge(*edge1)
            G.remove_edge(*edge2)
            G.add_edge(new_edge1[0], new_edge2[0])
            G.add_edge(new_edge1[1], new_edge2[1])
    
        #print(G.edges())
        edges = nx.draw_networkx_edges(G, pos, ax=ax)
        nodes = nx.draw_networkx_nodes(G, pos, node_color="#87CEEB", node_size=50, ax=ax)
        return edges, nodes
    

    起始图是Watts-Strogatz图,其中没有任何连接被重新连接。

    在这段代码中,我尝试使用matplotlib FuncAnimation创建一个随时间变化的图。这在动画功能中发生。因此,我检查了以下内容:自ax以来,每次都会重新绘制边缘。clear()清除绘图。然后G也随着时间的推移而改变。但是每当我画G的图时,它看起来与起始图一样,即使边已经改变了。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Reti43    8 年前

    new_edge1 = (edge1[0], edge2[1])
    new_edge2 = (edge1[1], edge2[0])
    
    if not(new_edge1 in edges or new_edge2 in edges):
        G.remove_edge(*edge1)
        G.remove_edge(*edge2)
        G.add_edge(new_edge1[0], new_edge2[0])  # equal to (edge1[0], edge1[1])
        G.add_edge(new_edge1[1], new_edge2[1])  # equal to (edge2[1], edge2[0])
    

    我想你是有意的

    G.add_edge(*new_edge1)
    G.add_edge(*new_edge2)
    

    动画随其变化。