通过 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 种不同的颜色绘制节点。我尝试了多种方法,但由于我是 NetworkxMatplotlib 的新手,所以没有成功。

使用 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")