如何在networkx图中绘制节点和边属性

问题描述 投票:0回答:2

我有一个图 G,其节点和边的属性为“状态”。我想绘制图形,标记所有节点,并在相应的边/节点外部标记状态。

for v in G.nodes():     
    G.node[v]['state']='X'
G.node[1]['state']='Y' 
G.node[2]['state']='Y'

for n in G.edges_iter():    
    G.edge[n[0]][n[1]]['state']='X'
G.edge[2][3]['state']='Y'

命令

draw.networkx
有一个标签选项,但我不明白如何提供该属性作为该命令的标签。有人可以帮我吗?

python plot graph networkx graphviz
2个回答
42
投票

它不是那么漂亮 - 但它的工作原理是这样的:

from matplotlib import pyplot as plt
import networkx as nx
G = nx.Graph()
G.add_edge(1,2)
G.add_edge(2,3)
for v in G.nodes():
    G.node[v]['state']='X'
G.node[1]['state']='Y'
G.node[2]['state']='Y'

for n in G.edges_iter():
    G.edge[n[0]][n[1]]['state']='X'
G.edge[2][3]['state']='Y'

pos = nx.spring_layout(G)

nx.draw(G, pos)
node_labels = nx.get_node_attributes(G,'state')
nx.draw_networkx_labels(G, pos, labels = node_labels)
edge_labels = nx.get_edge_attributes(G,'state')
nx.draw_networkx_edge_labels(G, pos, edge_labels = edge_labels)
plt.savefig('this.png')
plt.show()

enter image description here


2
投票

@Aric 的解决方案已经过时,不再运行。以下代码生成类似的图表。唯一的区别是下图将节点属性与节点标签分开绘制。

import networkx as nx
# define a graph
G = nx.Graph()
edges = [(1, 2), (2, 3)]
G.add_edges_from(edges)

# set node attributes
for n in G.nodes:
    val = 'X' if n == 3 else 'Y'
    nx.set_node_attributes(G, {n: {'state': val}})
    
# set edge attributes
for e in G.edges:
    val = 'X' if e == (1, 2) else 'Y'
    nx.set_edge_attributes(G, {e: {'state': val}})

pos = nx.spring_layout(G, seed=0)

# get edge and node attributes
edge_labels = nx.get_edge_attributes(G, 'state')
node_states = nx.get_node_attributes(G, 'state')
# set node state positions
state_pos = {n: (x+0.12, y+0.05) for n, (x,y) in pos.items()}

# draw graph
nx.draw_networkx(G, pos, node_size=600)
# draw node state labels
nx.draw_networkx_labels(G, state_pos, labels=node_states, font_color='red')
# draw edge attributes
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels);

© www.soinside.com 2019 - 2024. All rights reserved.