sottografo grappolo classifica a punti
Domanda
Sto cercando di utilizzare graphviz sulla wiki media come strumento di documentazione per il software.
In primo luogo, ho documentato alcune relazioni di classe che ha funzionato bene. Tutto è stato classificato in verticale come previsto.
Ma, allora, alcuni dei nostri moduli sono DLL, che ho voluto separare in una scatola. Quando ho aggiunto i nodi a un cluster, hanno ottenuto bordati, ma cluster sembrano avere una regola classifica LR. O essere aggiunto a un cluster ha rotto la classifica TB dei nodi del cluster ora viene visualizzata sul lato del grafico.
Questo grafico rappresenta quello che sto cercando di fare. Al momento, cluster1 e cluster2 sembrano destro di cluster0
voglio / bisogno loro di comparire in basso.
<graphviz>
digraph d {
subgraph cluster0 {
A -> {B1 B2}
B2 -> {C1 C2 C3}
C1 -> D;
}
subgraph cluster1 {
C2 -> dll1_A;
dll1_A -> B1;
}
subgraph cluster2 {
C3 -> dll2_A;
}
dll1_A -> dll2_A;
}
</graphviz>
Soluzione
Il layout è un tentativo da parte di Dot per ridurre al minimo l'altezza complessiva.
Una ragione per la più compatta rispetto layout richiesto è l'uso del bordo che va nella direzione inversa da dll1_a B1 . Si cerca di tirare il gruppo più vicino al nodo di destinazione possibile. Per evitare questo bordo influenzare il grafico, sia rilassare il constraint sulle upwards bordi, come illustrato, o disegnare il bordo in avanti e utilizzare il dir attributo per invertire la freccia .
Questo vi aiuterà con molti layout, ma da sola non è sufficiente a correggere l'esempio dato. Per evitare che Dot di mantenere il layout compatto che preferisce è possibile aggiungere un minlen di attributo ai bordi che dovrebbe rimanere (quasi) verticale. Questo può essere difficile da calcolare in generale, ma è pratico per i layout sintonizzati manualmente.
digraph d {
subgraph cluster0 {
A -> {B1 B2}
B2 -> {C1 C2 C3}
C1 -> D;
}
subgraph cluster1 {
C2 -> dll1_A [minlen = 2];
dll1_A -> B1 [constraint = false];
/* B1 -> dll1_A [dir = back]; */
}
subgraph cluster2 {
C3 -> dll2_A;
}
dll1_A -> dll2_A;
}
Altri suggerimenti
La mia esperienza dimostra che constraint=false
dà comunemente bordi inutilmente complesse. Sembra che weight=0
dà risultati migliori:
digraph d {
subgraph cluster0 {
A -> {B1 B2}
B2 -> {C1 C2 C3}
C1 -> D;
}
subgraph cluster1 {
C2 -> dll1_A [minlen = 2];
dll1_A -> B1 [weight = 0];
/* B1 -> dll1_A [dir = back]; */
}
subgraph cluster2 {
C3 -> dll2_A;
}
dll1_A -> dll2_A;
}
Questo produrrà il grafico che si sta cercando:
digraph d {
subgraph cluster0 {
A -> {B1 B2}
B2 -> {C1 C2 C3}
C1 -> D;
}
subgraph {
rankdir="TB"
subgraph cluster1 {
C2 -> dll1_A;
dll1_A -> B1;
}
subgraph cluster2 {
C3 -> dll2_A;
}
}
dll1_A -> dll2_A;
}
Quello che fa è creat un sottografo che viene utilizzato solo per scopi di layout per fornire la parte superiore di ordinare in basso che si desidera.