2010-03-19 8 views
36

Ich benutze Graphviz (Punkt), um die Grafik zu generieren, die Sie unten sehen können. Der Knoten in der unteren linken Ecke (rote Ellipse) verursacht Ärger, da seine Kanten mehrere Kanten des benachbarten Knotens kreuzen. Gibt es eine Möglichkeit, die Platzierung von Knoten auf einen bestimmten Bereich zu beschränken?Wie Knoten Platzierung in Graphviz zu steuern (d. H. Kantenübergänge zu vermeiden)

Vielen Dank für Ihre Ideen

graph with edge crossing several other edges http://i39.tinypic.com/e6od8z.png

Antwort

9

Ich bin nicht bekannt, dass Mittel, durch die die Platzierung der einzelnen Knoten zu steuern. Es macht keinen Sinn, denn um das zu tun, müssten Sie wissen, wie der endgültige Graph aussehen wird, aber die manuelle Platzierung eines Knotens würde dann ändern, wie der Rest des Graphen gerendert wird.

löste ich dieses Problem durch die Änderung der Reihenfolge, in der meine Knoten in der .dot-Datei definiert sind, und die nodesep und ranksep Attribute auf die Grafik Ebene zwicken. Es ist ein Prozess der Verfeinerung - ein paar Dinge auf einmal zu optimieren, bis es richtig aussieht.

Sie können das Diagramm auch als SVG rendern, es dann in Visio (oder einen anderen Editor) importieren und die Knoten manuell neu anordnen, mit denen Sie nicht zufrieden sind.

+1

Ich glaube nicht, Visio könnte eine generische Svg bearbeiten, aber Inkscape könnte. –

+0

@GringoSuave: Inkscape kann zwar, aber die Kanten folgen nicht, wenn Sie einen Knoten verschieben. Dies macht es für alles andere als sehr wenige Knoten unpraktisch. –

+2

Dies ist falsch und sollte nicht die akzeptierte Antwort sein. Es gibt Antworten mit 30 bzw. 20 Stimmen, von denen jede eine gut angenommene Antwort wäre. –

22

@Jannis, falls Sie dies in einer Antwort noch interessiert sind, gibt ist tatsächlich eine Möglichkeit, einzelne Knotenplatzierung zu steuern - Sie die „pos“ Attribut:

http://www.graphviz.org/doc/info/attrs.html#d:pos

als Beispiel dafür, könnten Sie schreiben:

n [pos="3,5!"]; 

dieser Knoten n genau (3,5) zwingen würde.

Dies funktioniert jedoch nur mit den Layout-Engines "fdp" und "neato".

+18

Das 'pin' Attribut (!), Ist" fdp, neato only "(es funktioniert nicht mit Punkt). Die Verwendung von 'pos' ist also bedeutungslos mit Punkt, es sei denn, Sie umgehen die Punkt-Layout-Engine. – nobar

+1

@nobar: Hmm, wenn du dir die Dokumentation ansiehst, scheint es, als hättest du recht - mein böses, tut mir leid. –

+0

Das ist mir aufgefallen! funktioniert auch nicht mit fdp, obwohl es mit neato funktioniert. Auch das Argument -s, das die Skalierung der in den "pos" -Attributen angegebenen Koordinaten (Standard 72.0) verwalten sollte, scheint nicht zu funktionieren (es verursacht Segfaults). Zusammenfassend: alle Zahlen des 'pos'-Attributs werden durch 72.0 geteilt und' neato' funktioniert! –

35

Sie könnten eine unsichtbare Einschränkung erstellen, damit der rote Knoten links von allen anderen Knoten angezeigt wird.

redNode -> leftmostNode [style=invis]; 

Bevor:

before

Nach:

after

+1

Das hat mein Problem gelöst. Ich wollte nur, dass etwas auf der anderen Seite von etwas anderem erscheint. Vielen Dank. –

5

Ich mag [style=invis] Trick @smokris zu überzeugen, graphviz Sachen zu setzen, wo Sie möchten, durch Kanten Hinzufügen die das Layout beeinflussen, aber nicht sichtbar sind.


Ein weiterer Trick ist die constraint attribute, die Sie Ränder hinzufügen können, die sichtbar sind, aber haben keinen Einfluss auf das Layout.

Wenn das Hinzufügen einer neuen Kante Ihr Diagramm durcheinanderbringt, setzen Sie [constraint=false] auf diese Kante: jetzt ignoriert graphviz es, wenn Knoten platziert werden.

Wenn false, wird die Kante nicht im Ranking der Knoten verwendet.Zum Beispiel in den Graph

digraph G { 
    a -> c; 
    a -> b; 
    b -> c [constraint=false]; 
} 

der Rand b -> c keine Einschränkung während Rang Zuordnung hinzu, so sind die einzigen Einschränkungen, dass ein oben b und c, wodurch man die Graphen:

Verwandte Themen