2012-04-22 4 views
1

Я хочу построить ориентированный граф и подписать ребра.python build graph with notes

import os 
import scipy as sc 
import pylab 
import networkx 
import matplotlib.pyplot as plt 
from networkx import * 
from numpy import * 

G=networkx.DiGraph() 
R=[('S0','S1'),('S1','S2'),('S1','S7'),('S2','S3'),('S2','S6'),('S3','S4'),('S3','S6'),('S4','S5'),('S5','S6'),('S6','S7'),('S7','S8'),('S7','S5'),('S8','Sk') ] 

G.add_edges_from([ (2,3,) ]) 
G.add_edges_from(R) 
networkx.draw_circular(G) 

plt.show() 
plt.savefig("path.png"); 

Теперь я это сделал. Я построил график, но я не могу придумать, как подписаться на ребра. Например, я хочу отметить S0 и S1 edge, например "565" и т. Д. Это сделает его более визуальным и демонстративным. Спасибо заранее!

enter image description here

ответ

3

Вместо Оформление печатных изданий и рисования в одном шаге (networkx.draw_circular(G)), вы можете макет и рисовать узлы, ребра, метки узлов и метки кромки отдельно. Вот небольшой пример:

import networkx as nx 
import matplotlib.pyplot as plt 

G=nx.DiGraph() 
R=[('S0','S1'),('S1','S2'),('S1','S7'),('S0','S7')] 

G.add_edges_from(R) 

# Calculate layout and get all positions 
pos = nx.circular_layout(G) 

# Draw everything 
nx.draw_networkx_nodes(G, pos) 
nx.draw_networkx_edges(G, pos) 
nx.draw_networkx_labels(G, pos) 
nx.draw_networkx_edge_labels(G, pos, 
    { 
     ('S0', 'S1'): 'edge1', 
     ('S1', 'S2'): 'edge2', 
     ('S1', 'S7'): 'edge3', 
     ('S0', 'S7'): 'edge4' 
    } 
) 

plt.axis('off') 
plt.savefig("path.png"); 
plt.show() 

Для получения дополнительной информации о том, какие параметры могут быть переданы в различные функции рисования, check the documentation.

+0

hm. Я тоже должен подумать над вашим решением. вы сделали это лучше, чем я. Так что + вы – Tebe

1

Вы можете рисовать узлы и egdes избирательно:

# nodes 
networkx.draw_networkx_nodes(graph, pos, nodelist=[list of the nodes]) 
# edges 
networkx.draw_networkx_edges(graph, pos, edgelist=[list of edges]) 

Есть больше вариантов на http://networkx.lanl.gov/reference/drawing.html#module-networkx.drawing.nx_pylab

+0

это приятно. Но я хочу подписаться на ребра. У меня уже есть края. Я хочу подписаться на них. – Tebe

1

ну, я хотел: enter image description here и я сделал это. т. е. я хотел отмечать края. Это кажется простым, но это было не так. В самом деле.

полное изображение здесь http://s019.radikal.ru/i603/1204/2a/921bc6badfae.png

import os 
import scipy as sc 
import pylab 
import networkx 
import matplotlib.pyplot as plt 
from networkx import * 
from numpy import * 

G=networkx.DiGraph() 
R=[('S0','S1'),('S1','S2'),('S1','S7'),('S2','S3'),('S2','S6'),('S3','S4'),('S3','S6'),('S4','S5'),('S5','S6'),('S6','S7'),('S7','S8'),('S7','S5'),('S8','Sk') ] 
G.add_edges_from(R) 
label={R[1]:'a',R[2]:'b',R[3]:'c'} 
networkx.draw_networkx_edge_labels(G,pos=networkx.graphviz_layout(G),edge_labels=label) 
networkx.draw_graphviz(G) 
plt.show() 
plt.savefig("path.png");