当我使用networkx.draw绘制网络时,python2和python3使用相同的程序,但python2无法正确绘制

2024-06-28 16:24:37 发布

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

当我使用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()

enter image description here


Tags: inimportformatforasrangepltnx
2条回答

对于早于3.6的python,字典不维护插入顺序。因此,最终可能会将这些颜色指定给不同的节点。使用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()

如果图形之间的差异只是颜色(以及确定的位置),则可以尝试替换

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]

背景

如果我没记错的话,python2中的dict不一定保留添加元素的顺序。因此,“n0”不需要是G中的第一个元素。在Python3中,它们开始保留顺序,从而为所需的节点着色

相关问题 更多 >