2012-10-17 3 views
7

Ho il seguente codice e risulta nell'immagine seguente. Come puoi vedere, è un po 'affollato intorno ai bordi e alle etichette dei bordi, specialmente attorno al "^ a". Qual è il modo migliore per creare solo un po 'di spazio in più, in modo che si possa vedere chiaramente quale etichetta appartiene a quale limite?Graphviz --- etichetta del bordo troppo vicina a un altro bordo

digraph finite_state_machine {                                             
    pad=0.2; 
    { 
     rank=same; 
     node [shape = point, style = invis]; q_0; 
     node [shape = doublecircle, style = solid]; q_5; 
     node [shape = circle]; 
     q_1 [ label = <<i>q<sub>1</sub></i>> ]; 
     q_2 [ label = <<i>q<sub>2</sub></i>> ]; 
     q_3 [ label = <<i>q<sub>3</sub></i>> ]; 
     q_4 [ label = <<i>q<sub>4</sub></i>> ]; 
     q_5 [ label = <<i>q<sub>5</sub></i>> ]; 
     q_0 -> q_1; 
     q_1 -> q_2 [ label = "." ]; 
     q_1 -> q_2 [ label = <&epsilon;>, constraint=false ]; 
     q_2 -> q_1 [ label = <&epsilon;>, constraint=false ]; 
     q_2 -> q_3 [ label = <<i>a</i>> ]; 
     q_3 -> q_4 [ label = <<i>^a</i>> ]; 
     q_3 -> q_4 [ label = <&epsilon;>, constraint=false ]; 
     q_4 -> q_3 [ label = <&epsilon;>, constraint=false ]; 
     q_4 -> q_5 [ label = <<i>b</i>> ]; 
    } 
} 

enter image description here

+0

Penso che si possa provare a impostare 'minlen = 5' quando si definiscono i bordi. Ad esempio - 'q_1 -> q_2 [minlen = 5, label = <ε>, constraint = false];' – Raj

+0

Non ha funzionato così bene. L'ho provato sul bordo epsilon da q4 a q3. L'egde è diventato più lungo, aumentando la distanza tra i nodi, ma in realtà non è andato più in alto, quindi il problema rimane. – oskarkv

+1

È possibile utilizzare le porte per curvare maggiormente i bordi, come in: http://stackoverflow.com/questions/18515529/graphviz-place-edge-label-on-the-other-side-ii/18698294#18698294 –

risposta

8

Non c'è attribute in Graphviz per regolare il margine/padding intorno etichette bordo. Il più vicino a cui è possibile ottenere l'effetto richiesto è utilizzare \n per introdurre righe vuote sopra/sotto l'etichetta per forzare lo spazio.

Ovviamente, questo non si ridimensiona a nulla di automatico.

In alternativa, è possibile provare a utilizzare l'attributo ranksep per forzare in uno spazio aggiuntivo.

5

Se xlabel non lo risolve, avvolgere l'etichetta in un tavolo può a volte essere un problema. Ad esempio:

q_1 -> q_2 [ label = <<table cellpadding="10" border="0" cellborder="0"> 
         <tr><td>&epsilon;</td></tr> 
         </table>>, 
      constraint = false ]; 

Per aggiungere più spazio su un lato che su un altro, è possibile aggiungere una cella vuota. Il codice diventa rapidamente (più) illeggibile, ma è possibile utilizzare un semplice script sed per pre-elaborare il file di punti.