Comment définir la taille de sortie dans GraphViz pour le format Point?

je veux m'assurer que tous les noeuds sont à une certaine distance (disons [0,0,W,H]) après la mise en page.

j'ai pensé que bounding box serait la solution en utilisant le bb l'attribut, mais les deux dot et neato il suffit de remplacer.

Par exemple, mon graphique:

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

Sortie 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"];
}

j'obtiens les mêmes positions pour toute valeur de bb ou toute combinaison de size et dpi.

ce dont j'ai besoin, c'est d'avoir tous les noeuds dans une boîte donnée.

des suggestions pour faire cela?

article Complet:

j'utilise *graphviz_layout* de networkx pour mettre en page mon graphique. Je dessine le graphique pyprocessing. Je veux éviter de redimensionner les résultats de *graphviz_layout*, s'il y a un moyen de dire neato mes limites à la place.

24
demandé sur EdChum 2013-02-09 06:44:38

1 réponses

Voici le TL;DR version:

pour générer une image PNG de 900 par 1500 pixels à partir du Graphe de foo.gv, vous pouvez exécuter:

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

pour obtenir une image qui fait exactement 900 pixels de large ou 1500 de haut, mais pas nécessairement les deux; et puis:

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

pour garnir l'image de blancs d'espace de sorte qu'elle soit exactement 900 par 1500 pixels; où convert ImageMagick suite.

Voici les détails explication:

Pour clarifier:

  1. bb l'attribut est marqué comme "écriture seule", donc aucun des moteurs de mise en page de Graphviz n'est susceptible de respecter les valeurs que vous soumettez avant traitement.

  2. Dans le cas général, Graphviz peut générer à la fois des graphiques vectoriels (évolutifs) et bitmap, donc DPI n'est pas toujours une mesure significative.

    en particulier, le dpi attribut n'est valide que pour les formats de sortie bitmap et SVG.

ce que vous essayez de faire est un peu compliqué car la taille du pixel d'une image générée par Graphviz est pilotée par quelques attributs en interaction.

prenons un graphique arbitraire comme exemple.

La commande gvgen‎ -dh3 générera un hypercube dirigé de degré trois. (Si vous souhaitez plus de détails à ce sujet, une version PDF de la page de manuel de gvgen est ici, mais il n'a pas d'importance, c'est juste un graphe arbitraire des fins de démonstration.)

un rendu PNG généré par défaut de ce graphique peut être créé en exécutant la commande:

gvgen -dh3 | dot -Tpng -oexample.png

quand je fais cela, j'obtiens une image au format PNG (bitmap) de 275 x 347 pixels. (Tel que rapporté par file example.png.)

size attribut vous permet de recommander une hauteur et une largeur maximales ou désirées pour l'image de sortie en pouces. I. e., l'attribut size=3,5 dit à Graphviz de générer une image de 3 par 5 pouces tout au plus. Si L'image est plus petite que 3 par 5 pour commencer, Graphviz la laissera tranquille. Si L'image est plus grande que 3 pouces par 5 pouces pour commencer, Graphviz la réduire jusqu'à ce qu'elle rentre dans une toile de 3 par 5 pouces (en préservant le rapport d'aspect de l'image originale).

L'ajout d'un point d'exclamation change le size attribut d'une taille maximale à une désiré taille de l'. Maintenant, si les dimensions sont plus petites que la taille spécifiée, le dessin est mis à l'échelle jusqu'à au moins la dimension est égale à la taille spécifiée.

Par exemple, en cours d'exécution:

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

(Notez que \! échappe au point d'exclamation de bash. Dans un fichier de points vous écririez juste size=3,5!.)

génère une image de 288 x 363 pixels, légèrement plus grande dans les deux dimensions que la valeur par défaut.

Comment ne point venir à ces chiffres? La valeur par défaut du DPI de Graphviz est de 96 pixels par pouce. A cette résolution a 3 par 5 po l'image est de 288 480 pixel image. Le moteur de mise en page a simplement agrandi l'image jusqu'à ce qu'au moins une des dimensions corresponde à la taille désirée.

vous pouvez outrepasser la valeur par défaut de DPI en utilisant le dpi l'attribut, comme ceci:

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

maintenant le l'image générée mesure 600 par 757 pixels. Encore une fois, Graphviz a simplement redimensionné l'image jusqu'à ce qu'une des dimensions corresponde à la taille désirée (mais à cette résolution, une image de 3 par 5 pouces est une image de 600 par 1000 pixels).

Donc, si vous voulez générer une image qui contient un nombre arbitraire de pixels, vous devez définir les deux size et dpi de façon appropriée.

C'est-à-dire supposons que vous voulez créer une image de 900 par 1500 pixels. Vous pourriez utilisation:

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

ou

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

ou encore:

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

(mais alors que ce dernier semblait fonctionner pour moi EN test rapide, je recommande de s'en tenir à une valeur DPI plus conventionnelle juste au cas où.)

cela résout la plupart de votre problème, mais notez que Graphviz ne fait que mettre à l'échelle l'image jusqu'à des dimensions correspondent à la taille spécifiée. Selon le rapport d'aspect de votre image originale vous pouvez ou ne pouvez pas obtenir taille exacte que vous recherchez.

C'est là ratio l'attribut entre en jeu.

La commande:

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

devrait vous donner une image avec la dimension précise que vous recherchez, mais avec quelques mises en garde:

  • en pratique, il semble parfois donner une taille légèrement différente de celle désirée. Par exemple, lorsque j'exécute la commande ci-dessus, j'obtiens une image de 900 par 1472 pixels (plutôt que 900 par 1500). Je ne sais pas si cela est dû à l'erreur d'arrondi ou quoi.

  • pour ce faire, Graphviz doit dimensionner la mise en page de façon indépendante dans chaque dimension. C'est assez intelligent pour mettre à l'échelle le mise en page et pas image, de sorte que l'image n'est pas déformée en soi, mais en fonction de la différence entre le rapport d'aspect demandé et le rapport d'aspect "naturel" de la mise en page, l'espacement horizontal vs. vertical peut sembler un peu étrange.

ratio accepte aussi quelques valeurs différentes. Voir la documentation et/ou d'expérimenter un peu pour voir ce qu'ils font.

pour ce que ça vaut, si vous voulez littéralement une image des dimensions précises du pixel que vous demandez, ma suggestion serait de laisser Graphviz dimensionner L'image de telle sorte que l'une des deux dimensions correspond et puis utiliser quelque chose comme ImageMagick pour remplir l'image pour obtenir le précis le format que vous recherchez. E. g., la commande:

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

va centrer l'image (de in.png) sur une toile de 900 par 1500 pixels (la sauvant en out.png) par rembourrage de la dimension horizontale ou verticale si nécessaire

56
répondu Rod 2018-01-15 19:51:29