7

für meine These Ich muss einige probabilistische Kontrollflussgraphen zeichnen. d.h. Kontrollflussdiagramme mit Wahrscheinlichkeiten, die an den Kanten dargestellt sind.graph-tool: Zeichne Text an Kanten

Ich fand Graph-Tool, das ziemlich nützlich scheint, da es tiefe Kopien von vorhandenen Graphen verwenden kann und meine Graphen sind sehr ähnlich.

Also meine Frage ist, ob es eine Möglichkeit gibt, Kanteneigenschaften (oder einige Zeichenfolgen) auf/neben den Kanten zu zeichnen? Wenn es nicht möglich oder sehr kompliziert ist, gibt es ein Werkzeug, das in diesem Fall besser ist?

Bearbeiten: Ich brauche gerichtete Kanten, die sogar Schleifen zwischen 2 Knoten erstellen können und unterschiedliche Werte haben. Gibt es dafür auch eine Möglichkeit? Also kann ich beide Werte sehen? Inzwischen kann ich den gerichteten Graphen mit einer 2-direktionalen Kante sehen, aber es gibt nur einen Wert darauf.

Also z.B. in NetworkX (in Bezug auf Hooked) würde es wie folgt aussehen:

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

, so dass beide ‚foo‘ und ‚bar‘ sind sichtbar, und Sie können in welche Richtung sie verbunden sind, sehen.

Aber wie networkx es rendert, bekomme ich 1 bidirektionale Kante mit 1 der Etiketten.

Antwort

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: Wenn Sie multidigraphs mit Etiketten benötigen, ich glaube nicht, dass Sie dies in networkx vollständig tun können. Sie können jedoch die meisten davon in Python tun und das Rendering und das Layout mit einem anderen Programm tun:

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') 

ich graphviz verwenden diese in ein Bild zu machen. Auf meinem Unix-Rechner führe ich dies von der Kommandozeile

Die gibt die gewünschte Ausgabe, die Sie suchen. Beachten Sie, dass graphviz many ways to customize the visual appearance hat. Das obige Beispiel erzeugt einfach:

enter image description here

+0

Froh, dass es geholfen! Ich weiß nicht, was Sie genau brauchen, aber Networkx kann auch gerichtete und multigraphische Graphen zeichnen. Für Ihre These, sicher sein, das resultierende Bild als PDF und nicht als PNG zu speichern, um die Qualität zu halten (ex http://stackoverflow.com/a/9890599/249341) – Hooked

+0

Ich lese gerade das Tutorial und versuchte das MultiDiGraph, da ich gerichtete Kanten benötige, die sogar Schleifen zwischen 2 Knoten erzeugen können und unterschiedliche Werte haben. Gibt es dafür auch eine Möglichkeit? Also kann ich beide Werte sehen? Inzwischen kann ich den gerichteten Graphen mit einer 2-direktionalen Kante sehen, aber es gibt nur einen Wert darauf. –

7

Sie Text neben den Kanten mit graph-tool ziehen kann "edge_text" Option der graph_draw() Funktion:

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