tutorial nodesep libreria instalar example color graphviz networkx pygraphviz pyprocessing

nodesep - ¿Cómo establecer el tamaño de salida en GraphViz para el formato de punto?



instalar libreria graphviz en python (1)

Quiero asegurarme de que todos los nodos estén dentro de algún rango (por ejemplo, [0,0, W, H]) después del diseño.

Pensé que el cuadro delimitador sería la solución usando el atributo bb , pero tanto dot como neato simplemente lo sobreescriben.

Por ejemplo mi gráfico:

strict digraph { 1,2,3; 1 -> 3; 3 -> 2; }

Salida de neato -Gbb="0,0,50,50" -T dot file.txt :

strict digraph { graph [bb="0,0,120.49,162.36"]; node [label="/N"]; 1 [height=0.5, pos="27,18", width=0.75]; 3 [height=0.5, pos="70.233,75.918", width=0.75]; 1 -> 3 [pos="e,57.954,59.469 39.043,34.133 43.004,39.441 47.504,45.468 51.827,51.261"]; 2 [height=0.5, pos="93.485,144.36", width=0.75]; 3 -> 2 [pos="e,87.436,126.56 76.221,93.545 78.643,100.67 81.496,109.07 84.177,116.97"]; }

Obtengo las mismas posiciones para cualquier valor de bb o cualquier combinación de size y dpi .

Lo que necesito, es tener todos los nodos dentro de un cuadro dado.

¿Alguna sugerencia de cómo hacer esto?

Historia completa:

Estoy usando * graphviz_layout * de networkx para diseñar mi gráfica. Dibujé la gráfica con pyprocessing . Quiero evitar volver a escalar los resultados de * graphviz_layout *, si hay una manera de decirle a mis límites en su lugar.


Aquí está la versión TL; DR:

Para generar una imagen PNG de 900 por 1500 píxeles a partir del gráfico en foo.gv puede ejecutar:

dot -Tpng -Gsize=9,15/! -Gdpi=100 -ofoo.png foo.gv

para obtener una imagen que tenga exactamente 900 píxeles de ancho o 1500 de altura, pero no necesariamente ambas; y entonces:

convert foo.png -gravity center -background white -extent 900x1500 final.png

para rellenar la imagen con espacios en blanco de modo que sea exactamente de 900 por 1500 píxeles; donde convert es parte de la suite ImageMagick .

Aquí está la explicación detallada:

Para aclarar:

  1. El atributo bb está marcado como "solo escritura" , por lo que es probable que ninguno de los motores de diseño de Graphviz respete los valores que envíe antes del procesamiento.

  2. En el caso general, Graphviz puede generar gráficos vectoriales (escalables) y de mapa de bits , por lo que el DPI no siempre es una métrica significativa.

    En particular, el atributo dpi solo es válido para formatos de mapa de bits y de salida SVG.

Lo que estás tratando de hacer es un poco complicado, ya que el tamaño en píxeles de una imagen generada por Graphviz está impulsado por un par de atributos que interactúan.

Tomemos como ejemplo un gráfico arbitrario.

El comando gvgen‎ -dh3 generará un hipercubo dirigido de grado tres. (Si desea más detalles sobre eso, here está la versión en PDF de la página de manual de gvgen, pero no importa, es solo un gráfico arbitrario para fines de demostración).

Se puede crear una representación PNG por puntos predeterminada de ese gráfico ejecutando el comando:

gvgen -dh3 | dot -Tpng -oexample.png

Cuando hago eso, obtengo una imagen en formato PNG (mapa de bits) de 275 x 347 píxeles. (Según lo informado por el file example.png .)

El atributo de size permite recomendar una altura y anchura máxima o deseada para la imagen de salida en pulgadas. Es decir, el atributo size=3,5 le dice a Graphviz que genere una imagen de 3 por 5 pulgadas como máximo . Si la imagen es más pequeña que 3 por 5 para empezar, Graphviz la dejará sola. Si, para empezar, si la imagen mide más de 3 pulgadas por 5 pulgadas, Graphviz la reducirá hasta que se ajuste a un lienzo de 3 por 5 pulgadas (conservando la relación de aspecto de la imagen original).

Agregar un signo de exclamación cambia el atributo de size de un tamaño máximo a un tamaño deseado . Ahora, si ambas dimensiones son más pequeñas que el tamaño especificado, el dibujo se ampliará hasta que al menos una dimensión sea igual al tamaño especificado.

Por ejemplo, ejecutando:

gvgen -dh3 | dot -Tpng -Gsize=3,5/! -oexample.png

(Tenga en cuenta que /! Escapa al signo de exclamación para bash. En un archivo DOT, simplemente escribiría size=3,5! )

genera una imagen de 288 x 363 píxeles, un poco más grande en ambas dimensiones que la predeterminada.

¿Cómo surgió dot con esos números? Bueno, el valor de ppp predeterminado de Graphviz es de 96 píxeles por pulgada. En esa resolución, una imagen de 3 por 5 pulgadas es una imagen de 288 por 480 píxeles . El motor de diseño simplemente ha escalado la imagen hasta que al menos una de las dimensiones coincide con el tamaño deseado.

Puede anular el valor predeterminado de DPI usando el dpi , de esta manera:

gvgen -dh3 | dot -Tpng -Gsize=3,5/! -Gdpi=200 -oexample.png

Ahora la imagen generada mide 600 por 757 píxeles. Una vez más, Graphviz simplemente amplió la imagen hasta que una de las dimensiones coincidiera con el tamaño deseado (pero a esta resolución, una imagen de 3 por 5 pulgadas es una imagen de 600 por 1000 píxeles).

Por lo tanto, si desea generar una imagen que contenga un número arbitrario de píxeles, debe configurar tanto el size como los dpi .

Es decir, suponga que desea crear una imagen de 900 por 1500 píxeles. Podrías usar:

gvgen -dh3 | dot -Tpng -Gsize=9,15/! -Gdpi=100 -oexample.png

o

gvgen -dh3 | dot -Tpng -Gsize=3,5/! -Gdpi=300 -oexample.png

o incluso:

gvgen -dh3 | dot -Tpng -Gsize=900,1500/! -Gdpi=1 -oexample.png

(Pero mientras que el último pareció funcionar para mí en la prueba rápida, recomendaría seguir con un valor de DPI más convencional por si acaso).

Eso resuelve la mayor parte de su problema, pero tenga en cuenta que Graphviz solo está escalando la imagen hasta que una de las dimensiones coincida con el tamaño especificado. Dependiendo de la relación de aspecto de su imagen original, puede obtener o no el tamaño exacto que está buscando.

Aquí es donde el atributo de ratio entra en juego.

El comando:

gvgen -dh3 | dot -Tpng -Gsize=3,5/! -Gdpi=300 -Gratio=fill -oexample.png

debería darle una imagen con la dimensión precisa que está buscando, pero con un par de advertencias:

  • En la práctica, parece que a veces produce un tamaño ligeramente diferente al deseado. Por ejemplo, cuando ejecuto el comando anterior obtengo una imagen de 900 por 1472 píxeles (en lugar de 900 por 1500). No sé si esto se debe a un error de redondeo o qué.

  • Para lograr esto, Graphviz debe escalar el diseño de forma independiente en cada dimensión. Es lo suficientemente inteligente como para escalar el diseño y no la imagen , por lo que la imagen no se distorsiona per se, pero dependiendo de qué tan diferente sea su relación de aspecto solicitada de la relación de aspecto "natural" del diseño, el espaciado entre horizontales y verticales puede verse un poco extraño.

ratio también acepta algunos valores diferentes. Ver la documentación y / o experimentar un poco para ver lo que hacen.

Para lo que vale, si literalmente quieres una imagen de las dimensiones precisas de píxeles que estás solicitando, mi sugerencia sería dejar que Graphviz escale la imagen de manera que una de las dos dimensiones coincida y luego use algo como ImageMagick para rellenar la imagen para llegar a la relación de aspecto precisa que estás buscando. Por ejemplo, el comando:

convert in.png -gravity center -background white -extent 900x1500 out.png

centrará la imagen (de in.png ) en un lienzo de 900 por 1500 píxeles (guardándolo en out.png ) rellenando la dimensión horizontal o vertical según sea necesario