微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过 Networkx 中的属性值将颜色设置为节点组 这是一个例子:

如何解决通过 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(颜色或颜色数组(默认=‘#1f78b4’))——节点颜色。可以是单一颜色或长度与节点列表相同的颜色序列。颜色可以是字符串,也可以是 rgb(或 rgba)从 0 到 1 的浮点数元组。如果指定了数值,它们将使用 cmap 和 vmin,vmax 参数映射到颜色。有关更多详细信息,请参阅 matplotlib.scatter。

所以如果我们考虑一个列表,我们可以像这样获得 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)

抽奖:
Example Result


编辑:

可能导致您遇到问题的一件事:

使用 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,node_color = colors)

这会产生与您相同的错误:

ValueError: 'c' 参数必须是颜色、颜色序列或数字序列,而不是 ['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)

如果您在任何节点的 None 属性中有 node_type,这将以黑色打印这些节点:

#(change *colors* to):

colors = []
for u in G.nodes(data="nodetype"):
    if u[1] in ("red","blue"):
        colors.append(u[1])
    elif u[1] == None:
        colors.append("black")
    else:
        #do something?
        print("ERROR: Should be red,green,blue or None")

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。