【问题标题】:Node attributes in for loops, NetworkXfor循环中的节点属性,NetworkX
【发布时间】:2017-06-10 20:45:09
【问题描述】:

我正在尝试对网络上的投票动态进行建模,并希望能够在 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()

【问题讨论】:

  • 既然你提到了选民动态,我想节点状态的动画可能会很有趣。请参阅stackoverflow.com/q/13437284(networkx 特定)和stackoverflow.com/q/11874767(matplotlib,不特定于 networkx)
  • 我还没有走到那一步,但是是的,我稍后可能会为这些东西制作动画,谢谢!

标签: networkx


【解决方案1】:

您可以使用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=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)

请注意,这样你会得到与上图不同的蓝色和黄色阴影。

【讨论】:

  • 这真的很有帮助,谢谢!出于兴趣,与“蓝色”和“黄色”颜色映射相比,使用数字、vmax、vmin 和 cmap=plt.cm.jet 有什么好处/区别?
  • 我使用这种方法是因为我过去使用的方法。我使用颜色名称进行了测试,效果很好(请参阅我的更新答案)。
猜你喜欢
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 2018-08-26
  • 2016-04-23
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
相关资源
最近更新 更多