2012-11-12 7 views
9

Ho lottato con questo per un po 'e non riesco a trovare una risposta diretta. Sto lavorando con i sottografi composti in graphviz e non riesco a trovare la giusta combinazione di impostazioni per forzare due sottografi ad allinearsi l'uno con l'altro.Come posso ottenere graphviz per generare sottografi di dimensioni fisse?

In allegato è un semplice esempio per mostrare il problema ...

digraph g { 
    compound=true; 

    subgraph cluster_top { 
    graph [color=black, label="Top", rank=min]; 

    nodeA; nodeB; nodeC 
    cluster_top_DUMMY [shape=point style=invis] 
    } 

    subgraph cluster_service { 
    graph [color=black, label="Bottom", rank=min]; 
    node1; node2; node3; node4; node5; extra_long_node 
    cluster_bottom_DUMMY [shape=point style=invis] 
    } 
    cluster_top_DUMMY -> cluster_bottom_DUMMY [ style=invis ] 
} 

Questo genera in uscita con il sottografo inferiore notevolmente più ampia rispetto alla sottografo Top.

enter image description here

Quello che voglio davvero è per far sì che sia superiore e inferiore sono sempre esattamente la stessa larghezza. Inoltre, se ci sono troppi nodi per adattarsi alla larghezza disponibile, genererebbe ulteriori righe di nodi.

risposta

2

Una possibile soluzione (mal funzionante) sarebbe utilizzare nodi invisibili e impostare la larghezza. Si consideri il seguente:

digraph g { 
    compound=true; 

    subgraph cluster_top { 
     graph [color=black, label="Top", rank=min]; 

     nodeAI0 [style=invisible] 
     nodeAI1 [style=invisible] 
     nodeAI2 [style=invisible,fixedsize=true,width=1.65] 
     nodeA; nodeB; nodeC 
     cluster_top_DUMMY [shape=point style=invis] 
    } 

    subgraph cluster_service { 
     graph [color=black, label="Bottom", rank=min]; 
     node1; node2; node3; node4; node5; extra_long_node 
     cluster_bottom_DUMMY [shape=point style=invis] 
    } 
    cluster_top_DUMMY -> cluster_bottom_DUMMY [ style=invis ] 
} 

enter image description here

I nodi invisibili (NodeAI0-NodeAI2) prendono lo spazio. fixedsize = true, width = 1.65 fa l'ultimo prendere esattamente 1,65 pollici.

altro, migliore soluzione sarebbe quella di fissare anche il nodo più pertinente specifico (per evitare di dover cercare il valore corretto) aggiungendo qualcosa come:

node [fixedsize=true,width=0.75] 

dopo il composto = true porzione.