通过 Networkx 中的属性值将颜色设置为节点组
Set colors to group of nodes by attribute values in Networkx
我有三种类型的节点(动态绘制成百上千个节点)
1- 动物
2- 树
3- 人类
我正在从 JSON 文件中读取值,并且动态节点是用未知值创建的。
我想按类型给它们上色。所以我分配了一个nodetype
属性来标识。
这是我的节点代码。
G.add_node(HumanID, nodetype="red", UserName=userName)
G.add_node(TreeID, nodetype="green", BranchName=branchName)
G.add_node(AnimalID, nodetype="blue", AName=aName)
并获取值
colors = set(nx.get_node_attributes(G,'nodetype').values())
print(colors)
输出:{'green', 'red', 'blue'}
我知道这不对,但我想要这样的东西
nx.draw(G, node_color= colors)
所以它应该用 3 种不同的颜色绘制节点。我尝试了多种方法,但由于我是 Networkx
和 Matplotlib
的新手,所以没有成功。
使用 nx.draw
对图表着色时,关键是 保持 colors
的顺序与节点顺序相同 。
所以使用集合是行不通的,因为它们是无序的并且不允许重复值。
相反,你想要的是 nx.draw_networkx
documentation:
node_color (color or array of colors (default=’#1f78b4’)) – Node color. Can be a single color or a sequence of colors with the same length as nodelist. Color can be string, or rgb (or rgba) tuple of floats from 0-1. If numeric values are specified they will be mapped to colors using the cmap and vmin,vmax parameters. See matplotlib.scatter for more details.
所以如果我们考虑一个列表,我们可以这样得到colors
:
colors = [u[1] for u in G.nodes(data="nodetype")]
这是一个例子:
G=nx.Graph()
G.add_node(1, nodetype="red")
G.add_node(2, nodetype="blue")
G.add_node(3, nodetype="green")
G.add_node(4, nodetype="red")
G.add_edge(1, 3)
G.add_edge(2, 4)
G.add_edge(2, 3)
colors = [u[1] for u in G.nodes(data="nodetype")]
nx.draw(G, with_labels =True, node_color = colors)
平局:
编辑:
一件事可能会导致您遇到的问题:
添加节点 nodetype="not_a_color"
:
G.add_node(4, nodetype="not_a_color")
colors = [u[1] for u in G.nodes(data="nodetype")]
nx.draw(G, with_labels =True, node_color = colors)
这给出了与您得到的相同的错误:
ValueError: 'c' argument must be a color, a sequence of colors, or a sequence of numbers, not ['red', 'blue', 'green', 'not_a_color']
当然,如果你的列表很长,就更难检查了。
尝试 运行 以下方法,检查是否存在既不是 "red"
、"green"
也不是 "blue"
的颜色
colors = [u[1] for u in G.nodes(data="nodetype")]
not_colors = [c for c in colors if c not in ("red", "green", "blue")]
if not_colors:
print("TEST FAILED:", not_colors)
如果您的任何节点的 node_type
属性中有 None
,这将以黑色打印这些节点:
#(change *colors* to):
colors = []
for u in G.nodes(data="nodetype"):
if u[1] in ("red", "green", "blue"):
colors.append(u[1])
elif u[1] == None:
colors.append("black")
else:
#do something?
print("ERROR: Should be red, green, blue or None")
我有三种类型的节点(动态绘制成百上千个节点)
1- 动物 2- 树 3- 人类
我正在从 JSON 文件中读取值,并且动态节点是用未知值创建的。
我想按类型给它们上色。所以我分配了一个nodetype
属性来标识。
这是我的节点代码。
G.add_node(HumanID, nodetype="red", UserName=userName)
G.add_node(TreeID, nodetype="green", BranchName=branchName)
G.add_node(AnimalID, nodetype="blue", AName=aName)
并获取值
colors = set(nx.get_node_attributes(G,'nodetype').values())
print(colors)
输出:{'green', 'red', 'blue'}
我知道这不对,但我想要这样的东西
nx.draw(G, node_color= colors)
所以它应该用 3 种不同的颜色绘制节点。我尝试了多种方法,但由于我是 Networkx
和 Matplotlib
的新手,所以没有成功。
使用 nx.draw
对图表着色时,关键是 保持 colors
的顺序与节点顺序相同 。
所以使用集合是行不通的,因为它们是无序的并且不允许重复值。
相反,你想要的是 nx.draw_networkx
documentation:
node_color (color or array of colors (default=’#1f78b4’)) – Node color. Can be a single color or a sequence of colors with the same length as nodelist. Color can be string, or rgb (or rgba) tuple of floats from 0-1. If numeric values are specified they will be mapped to colors using the cmap and vmin,vmax parameters. See matplotlib.scatter for more details.
所以如果我们考虑一个列表,我们可以这样得到colors
:
colors = [u[1] for u in G.nodes(data="nodetype")]
这是一个例子:
G=nx.Graph()
G.add_node(1, nodetype="red")
G.add_node(2, nodetype="blue")
G.add_node(3, nodetype="green")
G.add_node(4, nodetype="red")
G.add_edge(1, 3)
G.add_edge(2, 4)
G.add_edge(2, 3)
colors = [u[1] for u in G.nodes(data="nodetype")]
nx.draw(G, with_labels =True, node_color = colors)
平局:
编辑:
一件事可能会导致您遇到的问题:
添加节点 nodetype="not_a_color"
:
G.add_node(4, nodetype="not_a_color")
colors = [u[1] for u in G.nodes(data="nodetype")]
nx.draw(G, with_labels =True, node_color = colors)
这给出了与您得到的相同的错误:
ValueError: 'c' argument must be a color, a sequence of colors, or a sequence of numbers, not ['red', 'blue', 'green', 'not_a_color']
当然,如果你的列表很长,就更难检查了。
尝试 运行 以下方法,检查是否存在既不是 "red"
、"green"
也不是 "blue"
colors = [u[1] for u in G.nodes(data="nodetype")]
not_colors = [c for c in colors if c not in ("red", "green", "blue")]
if not_colors:
print("TEST FAILED:", not_colors)
如果您的任何节点的 node_type
属性中有 None
,这将以黑色打印这些节点:
#(change *colors* to):
colors = []
for u in G.nodes(data="nodetype"):
if u[1] in ("red", "green", "blue"):
colors.append(u[1])
elif u[1] == None:
colors.append("black")
else:
#do something?
print("ERROR: Should be red, green, blue or None")