2012-12-20 14 views
7

per la mia tesi Ho bisogno di disegnare alcuni grafici di flusso di controllo probabilistico. cioè, controllare i diagrammi di flusso con probabilità rappresentati sui bordi.graph-tool: Disegna testo sui bordi

Ho trovato uno strumento grafico che sembra molto utile, dal momento che può utilizzare le copie a profondità di grafici esistenti ei miei grafici sono abbastanza simili.

Quindi la mia domanda è, se c'è la possibilità di disegnare le proprietà del bordo (o alcune stringhe) sopra/vicino ai bordi? Se non è possibile o molto complicato, c'è uno strumento che è meglio usare in questo caso?

Modifica: Ho bisogno di bordi diretti che possono anche creare loop tra 2 nodi e avere valori diversi. C'è una possibilità anche per questo? Quindi posso vedere entrambi i valori? A questo punto posso vedere il grafico diretto con un bordo bidirezionale, ma su di esso c'è solo un valore.

Così ad es. in NetworkX (in riferimento a Hooked) sarebbe simile:

G = nx.MultiDiGraph() 
G.add_edge(0,1) 
G.add_edge(1,0) 
labels = {(0,1):'foo', (1,0):'bar'} 

modo che entrambi i 'foo' e 'bar' sono visibili e si può vedere in quale direzione essi si ispirano.

Ma come lo rende networkx, ottengo 1 bordo bidirezionale con 1 delle etichette.

risposta

2
import networkx as nx 

# Sample graph 
G = nx.Graph() 
G.add_edge(0,1) 
G.add_edge(1,2) 
G.add_edge(2,3) 
G.add_edge(1,3) 

labels = {(0,1):'foo', (2,3):'bar'} 

pos=nx.spring_layout(G) 

nx.draw(G, pos) 
nx.draw_networkx_edge_labels(G,pos,edge_labels=labels,font_size=30) 

import pylab as plt 
plt.show() 

enter image description here

EDIT: Se avete bisogno di multidigraphs con etichette bordo, non credo che si può fare questo completamente all'interno networkx. Tuttavia si può fare la maggior parte di esso in pitone e fare il rendering e il layout con un altro programma:

import networkx as nx 

G = nx.MultiDiGraph() 
G.add_edge(0,1, label='A') 
G.add_edge(1,0, label='B') 
G.add_edge(2,3, label='foo') 
G.add_edge(3,1, label='bar') 
nx.write_dot(G, 'my_graph.dot') 

Io uso graphviz di trasformare questo in un'immagine. Sul mio computer Unix lo eseguo dalla riga di comando

dot my_graph.dot -T png > output.png 

Quale dà l'output desiderato che si sta cercando. Nota che graphviz ha many ways to customize the visual appearance. L'esempio precedente produce semplicemente:

enter image description here

+0

Contento che aiutato! Non so esattamente cosa ti serve, ma networkx può anche disegnare grafici diretti e multigrafici. Per la tua tesi, assicurati di salvare l'immagine risultante come PDF e non come PNG per mantenere alta la qualità (ex http://stackoverflow.com/a/9890599/249341) – Hooked

+0

Sto solo leggendo il tutorial e ho provato il MultiDiGraph poiché ho bisogno di bordi diretti che possono anche creare loop tra 2 nodi e avere valori diversi. C'è una possibilità anche per questo? Quindi posso vedere entrambi i valori? A questo punto posso vedere il grafico diretto con un bordo bidirezionale, ma su di esso c'è solo un valore. –

7

È possibile disegnare testo accanto ai bordi con graph-tool utilizzando l'opzione "edge_text" della funzione graph_draw():

from graph_tool.all import * 

g = Graph() 
g.add_vertex(4) 
label = g.new_edge_property("string") 
e = g.add_edge(0, 1) 
label[e] = "A" 
e = g.add_edge(2, 3) 
label[e] = "foo" 
e = g.add_edge(3, 1) 
label[e] = "bar" 
e = g.add_edge(0, 3) 
label[e] = "gnat" 

graph_draw(g, edge_text=label, edge_font_size=40, edge_text_distance=20, edge_marker_size=40, output="output.png") 

enter image description here