for 循环中的节点属性,NetworkX

Node attributes in for loops, NetworkX

我正在尝试对网络上的投票动态进行建模,并希望能够在 NetworkX 中创建一个图表,在其中我可以在节点上迭代选民流程,使它们的颜色变化与他们的投票相对应 'labels'.

我已经设法获得这段代码,让我可以看到每个节点的属性,但是我该如何在 for 循环中使用这些代码来指定颜色?

H = nx.Graph()

H.add_node(1,vote='labour')

H.add_node(2,vote='labour')

H.add_node(3,vote='conservative')

h=nx.get_node_attributes(H,'vote')

h.items()

给我结果:

[(1, 'labour'), (2, 'labour'), (3, 'conservative')]

我有一个 for 循环来根据节点编号进行这种类型的颜色编码,如下所示,但未能使其适用于我的 'vote' 状态。

S=nx.star_graph(10)
colour_map=[]
for node in S:
     if node % 2 ==0:
         colour_map.append('blue')
     else: colour_map.append('yellow')
nx.draw(S, node_color = colour_map,with_labels = True)
plt.show()

您可以使用 H.nodes(data=True) 迭代节点属性,其中 returns 字典中的节点名称和节点属性。这是使用您的图表的完整示例。

import networkx as nx
import matplotlib.pyplot as plt

H = nx.Graph()
H.add_node(1, vote='labour')
H.add_node(2, vote='labour')
H.add_node(3, vote='conservative')

color_map = []
for node, data in H.nodes(data=True):
    if data['vote'] == 'labour':
        color_map.append(0.25)  # blue color
    elif data['vote'] == 'conservative':
        color_map.append(0.7)  # yellow color

nx.draw(H, vmin=0, vmax=1, cmap=plt.cm.jet, node_color=color_map, with_labels=True)
plt.show()

此代码将在您每次 运行 时绘制不同的节点布局(某些布局,例如 draw_spring 可用 here)。

关于颜色,我用0.25表示蓝色,0.7表示黄色。请注意,我使用 jet matplotlib 颜色图并设置 vmin=0vmax=1 以便颜色值是绝对的(而不是相对于彼此)。

以上代码的输出:

更新:

我不知道您可以在 matplotlib 中简单地使用颜色名称。这是更新后的 for 循环:

for node, data in H.nodes(data=True):
    if data['vote'] == 'labour':
        color_map.append("blue")
    elif data['vote'] == 'conservative':
        color_map.append("yellow")

更新后的绘图命令:

nx.draw(H, node_color=color_map, with_labels=True)

请注意,通过这种方式您可以获得与上图中不同的蓝色和黄色阴影。