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