2013-07-18 4 views
7

consideri il seguente grafico minimale esempio che dovrebbe stare su una pagina A4Graphviz ignora attributo size (pagina A4)

digraph G{ 
size="8.3,11.7!" ratio=fill; 
foo->bar; 
} 

compilazione con neato -Tpdf -o min_ex.pdf min_ex.gv Il file pdf risultante ha dimensioni di 236 millimetri x 115 millimetri e non, come previsto , 210 mm x 297 mm.

Graphviz ignora questo attributo sia per i grafici che sono più piccoli della pagina (come questa) che per quelli che devono essere ridimensionati per adattarsi.

Ho provato qualsiasi combinazione di attributi size e ratio, non riesco a far sì che il grafico venga inserito in una pagina A4 con nessuno di essi.

Quindi, cosa devo specificare che il grafico viene sempre inserito in una pagina A4, indipendentemente dalle sue dimensioni?

Documentation:

size:

larghezza massima e altezza del disegno, in pollici. Se viene dato un solo numero, questo viene usato sia per la larghezza che per l'altezza.

Se definito e il disegno è più grande della dimensione specificata, il disegno viene ridimensionato in modo uniforme in modo che rientri nella dimensione specificata.

Se la dimensione termina in un punto esclamativo (!), Viene considerata la dimensione desiderata. In questo caso, se entrambe le dimensioni del disegno sono inferiori alle dimensioni, il disegno viene ridimensionato in modo uniforme fino a quando almeno una dimensione è uguale alla sua dimensione in termini di dimensioni.

ratio

Imposta il rapporto di aspetto (altezza del disegno/disegno larghezza) per il disegno. Si noti che questo viene regolato prima che i vincoli dell'attributo della dimensione siano applicati. Inoltre, i calcoli di solito ignorano le dimensioni dei nodi, quindi la dimensione del disegno finale può solo approssimare ciò che si desidera.

Se il rapporto è numerico, viene preso come rapporto di aspetto desiderato. Quindi, se il rapporto di aspetto effettivo è inferiore al rapporto desiderato, l'altezza del disegno viene ridimensionata per ottenere il rapporto desiderato; se il rapporto effettivo è maggiore di quello desiderato, la larghezza del disegno viene ridimensionata.

Se ratio = "fill" e l'attributo size è impostato, le posizioni dei nodi vengono ridimensionate, separatamente in xey, in modo che il disegno finale riempia esattamente la dimensione specificata. Se entrambi i valori delle dimensioni superano la larghezza e l'altezza del disegno, entrambi i valori delle coordinate di ciascun nodo vengono adattati di conseguenza. Tuttavia, se la dimensione della dimensione è inferiore alla dimensione corrispondente nel disegno, una dimensione viene ridimensionata in modo che il disegno finale abbia le stesse proporzioni specificate dalla dimensione. Quindi, quando renderizzato, il layout verrà ridimensionato in modo uniforme in entrambe le dimensioni per adattarsi alla dimensione specificata, il che potrebbe causare la riduzione dei nodi e del testo. Questo potrebbe non essere ciò che l'utente desidera, ma evita il difficile problema di come riposizionare i nodi in modo accettabile per ridurre le dimensioni del disegno.

Se ratio = "compress" e l'attributo size è impostato, dot tenta di comprimere il layout iniziale per adattarlo alla dimensione specificata. Ciò consente un imballaggio più stretto dei nodi ma riduce l'equilibrio e la simmetria. Questa funzione funziona solo in punto.

Se ratio = "expand", l'attributo size è impostato, e sia la larghezza che l'altezza del grafico sono inferiori al valore in dimensione, le posizioni dei nodi vengono ridimensionate in modo uniforme finché almeno una dimensione si adatta esattamente alle dimensioni. Si noti che questo è distinto dall'utilizzo della dimensione come dimensione desiderata, poiché in questo caso il disegno viene espanso prima che i bordi vengano generati e tutte le dimensioni del nodo e del testo rimangano invariate.

Se ratio = "auto", l'attributo di pagina viene impostato e il grafico non può essere disegnato su una singola pagina, quindi la dimensione è impostata su un valore "ideale". In particolare, la dimensione in una determinata dimensione sarà il più piccolo multiplo integrale della dimensione della pagina in quella dimensione che è almeno la metà della dimensione corrente. Le due dimensioni vengono quindi ridimensionate in modo indipendente rispetto alle nuove dimensioni. Questa funzione funziona solo in punto.

risposta

6

Il problema sta nei dettagli circa il rapporto:

noti che questa viene regolata prima attributo dimensione vincoli vengono applicate. Inoltre, i calcoli di solito ignorano le dimensioni del nodo, in modo che la dimensione del disegno finale possa solo approssimare ciò che si desidera.

Sembra che graphviz

  • delinea i nodi come punti (dimensione ignorando)
  • regola per il rapporto dei nodi puntiformi (ancora nessun formato per i nodi)
  • vale i limiti di dimensione del grafico (nel nostro caso, l'ingrandimento dell'immagine): qui abbiamo già raggiunto le dimensioni desiderate, ma non abbiamo finito ...
  • poi nodi punto diventano nodi con una dimensione reale (per impostazione predefinita alta 0,5 pollici e 0,75 pollici di larghezza)
  • ed infine l'intera produzione ottiene il margine aggiunto

Il risultato sarebbe più grande di A4.

Pertanto, se dovessimo rendere i nodi e il margine il più piccoli possibile, l'output dovrebbe essere relativamente vicino a A4.

Impostazione margin a 0 e del nodo shape a point così come la loro width e height ai valori minimi con il grafico seguente:

digraph G{ 
ratio="fill"; 
size="8.3,11.7!"; 
margin=0; 

node[shape=point, height=0.02, width=0.01]; 
foo->bar; 
} 

neato -Tpdf con questo grafico i risultati in un PDF con dimensioni 211x297mm (usando 8.267 inches as width si otterrà un 210x297mm pulito).


Purtroppo, pur sapendo come funziona graphviz in rispetto al ratio=fill, non credo ci sia un modo semplice per assicurarsi che il risultato finale è sempre A4 quando si utilizzano i nodi che in realtà hanno una larghezza e altezza.

+0

avviso !!!se la dimensione del grafico è come 4096x4096, con "riempimento" potrebbe "congelare" la macchina (in realtà la macchina è tornata dopo 3 minuti ma ho dovuto interrompere il processo che causava ancora problemi) quando si utilizzava 'punto' (almeno in linux) –