我正在尝试对网络上的投票动态进行建模,并希望能够在NetworkX中创建一个图形,我可以在节点上迭代投票过程,其颜色变化与其投票“标签”相对应。
我设法让这段代码让我看到每个节点的属性,但是如何在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循环来根据节点编号进行这种类型的颜色编码,如下所示,但还没有设法让它适用于我的“投票”状态。
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()
答案 0 :(得分:2)
您可以使用H.nodes(data=True)
迭代节点属性,该属性返回字典中的节点名称和节点属性。以下是使用图表的完整示例。
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=0
和vmax=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)
请注意,通过这种方式,您可以获得与上图中不同的蓝色和黄色阴影。