节点颜色 Networkx Python 3.8

Node color Networkx Python 3.8

我正在 python 3.8 上使用 Networkx 创建一个图表,我想在我将节点附加到图表时为每个节点分配一种颜色,如下所示:

     if raw_output in occurrencies_dict_gold: 
       G.add_node(raw_output, color = 'g')  

     else: 
       G.add_node(raw_output, color = 'r') 
       print('RED STATE : ', raw_output) 

我在其中检查之前创建的特定字典中是否存在某个节点,因此我添加了该节点及其颜色。

我对边缘做同样的事情

               if transition_key in transitions_dict_gold:
                 G.add_edge(previous_raw_output, raw_output, color = 'g')
               else:
                 G.add_edge(previous_raw_output, raw_output, color = 'r')

在印刷阶段我做了以下事情:

edges = G.edges()
 nodes = G.nodes()
 e_colors = [G[u][v]['color'] for u,v in edges]
 n_colors = [G[u]['color'] for u in nodes]
 
 nx.draw(G, node_color=n_colors, edge_color=e_colors,  with_labels=True)
 plt.show()
 
 
 plt.savefig("filename.png") 

如果我只对边缘执行此操作,效果会很好,而如果我按照上面写的那样尝试,我会收到以下消息:

Traceback (most recent call last):
  File "result_iterative_parser.py", line 157, in <module>
    n_colors = [G[u]['color'] for u in nodes]
  File "result_iterative_parser.py", line 157, in <listcomp>
    n_colors = [G[u]['color'] for u in nodes]
  File "/anaconda3/lib/python3.8/site-packages/networkx/classes/coreviews.py", line 51, in __getitem__
    return self._atlas[key]
KeyError: 'color'

有什么想法吗?

而不是:

n_colors = [G[u]['color'] for u in nodes]

你可以这样做:

n_colors = [G.nodes(data='color')[u] for u in nodes]

但下面看起来更清晰:

nodes = G.nodes(data="color")
n_colors = [u[1] for u in nodes]

您可能对 u[1] 感到困惑,但这是因为 G.nodes(data="color")returns 节点列表作为元组 (node, color).


您的解决方案无效,因为 G[u] returns 节点 u 的边缘(和边缘信息)。相反,您需要的是节点上的信息,因此请使用 .nodes(data=True).nodes(data='color')
这是每个 returns:

之间的比较
In:
G=nx.Graph()

G.add_node(1, n_color="red")
G.add_node(2, n_color="blue")
G.add_node(3, n_color="green")
G.add_node(4, n_color="red")
G.add_edge(1, 3, e_color="yellow")
G.add_edge(2, 4, e_color="yellow")
G.add_edge(2, 3, e_color="black")


print("G[3] returns\t\t\t  ",                  G[3])
print("G.nodes(data=True)[3] returns\t  ",     G.nodes(data=True)[3])
print("G.nodes(data='n_color')[3] returns ",   G.nodes(data='n_color')[3])
print("G.nodes(data='e_color')[3] returns ",   G.nodes(data='e_color')[3])

Out:
G[3] returns                        {1: {'e_color': 'yellow'}, 2: {'e_color': 'black'}}
G.nodes(data=True)[3]returns        {'n_color': 'green'}
G.nodes(data='n_color')[3] returns  green
G.nodes(data='e_color')[3] returns  None