2010-03-19 13 views
36

Sto utilizzando graphviz (punto) per generare il grafico che è possibile vedere di seguito. Il nodo nell'angolo in basso a sinistra (ellisse rossa) causa fastidio poiché i suoi bordi attraversano diversi bordi del nodo adiacente. C'è un modo per trattenere il posizionamento dei nodi in una determinata area?Come controllare il posizionamento del nodo in graphviz (ad esempio, evitare gli attraversamenti del bordo)

Grazie per le vostre idee

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

risposta

9

io non sono a conoscenza di eventuali mezzo per controllare il posizionamento dei singoli nodi. Non ha molto senso, perché per farlo è necessario sapere come sarà il grafico finale, tuttavia posizionare manualmente un nodo cambierebbe il modo in cui viene eseguito il rendering del resto del grafico.

ho risolto questo problema modificando l'ordine in cui i miei nodi sono definite nel file .dot, e tweaking gli attributi nodesep e ranksep a livello grafico. È un processo di raffinatezza - aggiustare alcune cose alla volta fino a farlo sembrare giusto.

È anche possibile eseguire il rendering del grafico come SVG, quindi importarlo in Visio (o un altro editor) e riorganizzare manualmente i nodi di cui non si è soddisfatti.

+1

Non penso che Visio possa modificare uno svg generico, ma Inkscape potrebbe. –

+0

@GringoSuave: Inkscape può davvero, ma i bordi non seguono se sposti un nodo. Ciò lo rende poco pratico per qualsiasi cosa eccetto pochissimi nodi. –

+2

Questo non è corretto e non dovrebbe essere la risposta accettata. Di seguito sono elencate le risposte con 30 e 20 voti, ciascuno dei quali sarebbe una buona risposta accettata. –

22

@Jannis, nel caso in cui siete ancora interessati a una risposta a questo, v'è in realtà un modo per controllare il posizionamento singolo nodo - si utilizza il "pos" attributo:

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

come esempio di questo, si potrebbe scrivere:

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

che costringerebbe nodo n essere esattamente (3,5).

Tuttavia, questo funziona solo con i motori di layout "fdp" e "neato".

+18

L'attributo 'pin' (!), È" fdp, neato only "(non funziona con il punto). Quindi usare 'pos' non ha senso con il punto se non si ignora il motore di layout dei punti. – nobar

+1

@nobar: Hmm, guardando di nuovo la documentazione sembra che tu abbia ragione - il mio male, mi dispiace. –

+0

L'ho notato! inoltre non funziona con FDP, anche se funziona con Neato. Inoltre, l'argomento -s che dovrebbe gestire il ridimensionamento delle coordinate fornite negli attributi "pos" (default 72.0) non sembra funzionare (causa segoults). In breve: dividendo tutti i numeri dell'attributo 'pos' per 72.0 e usando i lavori' neato'! –

35

È possibile creare un vincolo invisibile per far apparire il nodo rosso alla sinistra di tutti gli altri nodi.

redNode -> leftmostNode [style=invis]; 

Prima:

before

Dopo:

after

+1

Questo ha risolto il mio problema. Volevo solo che qualcosa apparisse dall'altra parte di qualcos'altro. Grazie. –

5

Mi piace [style=invis] trucco @smokris' per persuadere graphviz per mettere le cose dove vuoi, con l'aggiunta di bordi che influenzano il layout ma non sono visibili.


Un altro trucco è il constraint attribute, che consente di aggiungere bordi che sono visibili, ma non influenzano il layout.

Se aggiungendo un nuovo bordo si confonde il grafico, impostare [constraint=false] su quel bordo: ora graphviz lo ignorerà quando si posizionano i nodi.

Se false, il bordo non viene utilizzato nella classificazione dei nodi.Ad esempio, in grafico

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

bordo b -> c non aggiunge un vincolo durante l'assegnazione rango, quindi gli unici vincoli sono che un essere sopra b, c, ottenendo il grafico:

Problemi correlati