我用networkx.draw画网络的时候,python2和python3用的是同一个程序,但是python2画不对

When I use networkx.draw to draw the network, python2 and python3 use the same program, but python2 cannot draw correctly

当我使用networkx.draw绘制网络时,使用与python2和python3相同的程序,但python2无法正确绘制。左边是py3,右边是py2.


 import scipy
 import numpy as np
 import networkx as nx
 import matplotlib.pyplot as plt
 
 N = [("n{}".format(i), 0) for i in range(1,7)] + \ 
     [("n{}".format(i), 1) for i in range(7,13)] + \ 
     [("n{}".format(i), 2) for i in range(13,19)]
 E = [("n1","n2"), ("n1","n3"), ("n1","n5"),
      ("n2","n4"),
      ("n3","n6"), ("n3","n9"),
      ("n4","n5"), ("n4","n6"), ("n4","n8"),
      ("n5","n14"),
      ("n7","n8"), ("n7","n9"), ("n7","n11"),
      ("n8","n10"), ("n8","n11"), ("n8", "n12"),
      ("n9","n10"), ("n9","n14"),
      ("n10","n12"),
      ("n11","n18"),
      ("n13","n15"), ("n13","n16"), ("n13","n18"),
      ("n14","n16"), ("n14","n18"),
      ("n15","n16"), ("n15","n18"),
      ("n17","n18")]

 G = nx.Graph()
 print(list(map(lambda x: x[0], N)))
 G.add_nodes_from(list(map(lambda x: x[0], N)))
 G.add_edges_from(E)
 ncolor = ['r']*6+['g']*6+['b']*6
 nsize = [700] * 6 + [700] * 6 + [700] * 6
 nx.draw(G, with_labels=True, font_weight='bold',
         node_color=list(ncolor), node_size=nsize)
 plt.savefig("graph.png")
 plt.show()

如果图形之间的差异只是颜色(肯定是定位),那你可以尝试替换

ncolor = ['r']*6+['g']*6+['b']*6

具有以下内容:

color_dict = {"n{}".format(i): "r" for i in range(1, 7)}
color_dict.update({"n{}".format(i): "g" for i in range(7, 13)})
color_dict.update({"n{}".format(i): "b" for i in range(13, 19)})
ncolor = [color_dict[node] for node in G]

背景

如果我没记错的话,python 2 中的 dict 不一定保留添加元素的顺序。因此,“n0”不必是 G 中的第一个元素。在 python 3 中,他们开始保留顺序,因此您为所需的节点着色。

对于 python 3.6 之前的字典不维护插入顺序。因此,您最终可能会将这些颜色分配给不同的节点。使用 nodelist:

绘图时尝试强制执行节点列表
G = nx.Graph()
G.add_nodes_from(list(map(lambda x: x[0], N)))
G.add_edges_from(E)
ncolor = ['r']*6+['g']*6+['b']*6
nsize = [700] * 6 + [700] * 6 + [700] * 6
nodelist = [n[0] for n in N] 
nx.draw(G, with_labels=True, font_weight='bold',
     node_color=list(ncolor), node_size=nsize,
     nodelist=nodelist)
plt.savefig("graph.png")
plt.show()