Pour afficher une hiérarchie Graphviz comme un plan à indentation sur votre Mac, attribuez à chaque nœud une ligne et une coordonnée d’indentation, puis effectuez le rendu avec neato -n2. Cela préserve les liens parent-enfant tout en vous permettant de contrôler l’ordre de lecture.
Ce guide crée un exemple à six nœuds et l’exporte au format PDF. L’objectif est précis : un nœud par ligne, les descendants immédiatement sous leur parent et une indentation identique pour les nœuds de même profondeur. Graphviz documente le rendu à positions fixes via son option de ligne de commande -n.
Pourquoi un arbre Graphviz classique ne ressemble-t-il pas à un plan ?
Une hiérarchie décrit des relations ; un plan à indentation définit aussi un ordre de lecture. Dans cet exemple, la racine comporte deux branches et les descendants de la première branche doivent apparaître avant la deuxième. L’ordre souhaité est le suivant :
Node R
Node A
Node C
Node D
Node B
Node E
Les relations du graphe sont : racine vers A, racine vers B, A vers C, A vers D et B vers E. Il n’existe aucune relation de D vers B simplement parce que B apparaît à la ligne suivante. DOT exprime les arêtes dirigées avec l’opérateur -> ; les déclarations de nœuds et leurs attributs de présentation sont des éléments distincts du langage. Consultez la référence du langage DOT officielle.
Le moteur dot de Graphviz produit des dessins hiérarchiques ou en couches. Il oriente les arêtes dans une direction commune tout en cherchant à réduire les croisements et la longueur des arêtes. Cet objectif convient à un diagramme ramifié, mais ne définit pas le plan à une ligne par nœud présenté ci-dessus. Consultez la documentation sur la disposition dot.
Plusieurs attributs courants ne règlent qu’une partie du problème :
| Réglage | Fonction documentée | Ce qu’il ne règle pas |
|---|---|---|
rankdir=LR |
Modifie le sens de la disposition pour aller de gauche à droite | Ne définit pas une séquence verticale de plan |
rank=same |
Place les nœuds d’un sous-graphe au même rang | N’attribue pas à chaque nœud sa propre ligne dans le plan |
ordering=out |
Contraint les arêtes sortantes à apparaître de gauche à droite, dans l’ordre de saisie | Ne définit pas l’indentation selon la profondeur ni les coordonnées des lignes |
Ces limites découlent des références officielles pour rankdir, rank et ordering. Pour obtenir la disposition exacte des lignes présentée dans cet article, des coordonnées explicites offrent une construction plus directe que la combinaison de ces attributs.
Comment préparer Graphviz sur un Mac ?
Ouvrez Terminal. Si vous utilisez déjà Homebrew, installez Graphviz avec la commande suivante. La page de téléchargement de Graphviz officielle indique cette méthode d’installation sur Mac :
brew install graphviz
Si vous utilisez plutôt MacPorts, cette même page indique sudo port install graphviz. Choisissez le gestionnaire de paquets que vous utilisez déjà. Si aucun n’est installé, suivez le lien d’installation correspondant sur cette page avant de reprendre ce guide.
Vérifiez que le moteur de rendu est disponible :
neato -V
L’option -V affiche des informations sur la version de Graphviz. Conservez la version indiquée pour comparer les résultats entre ordinateurs ; aucune version particulière n’est requise dans cet article. Graphviz documente cette option dans sa référence de la ligne de commande.
Comment créer la hiérarchie à indentation ?
Le bloc shell complet suivant crée un nouveau dossier de travail et y écrit le fichier DOT. Exécutez-le dans Terminal ; le chemin du dossier s’affichera à la fin. Le délimiteur heredoc entre guillemets préserve le texte DOT tel qu’il est écrit.
outline_dir=$(mktemp -d "$HOME/graphviz-outline.XXXXXX")
if [ -n "$outline_dir" ] && cd "$outline_dir"; then
cat > hierarchy.dot <<'DOT'
digraph Hierarchy {
graph [splines=ortho, bgcolor=white];
node [
shape=box,
width=1.2,
height=0.35,
fixedsize=true,
fontname="Courier",
fontsize=12
];
r [label="Node R", pos="100,300"];
a [label="Node A", pos="136,252"];
c [label="Node C", pos="172,204"];
d [label="Node D", pos="172,156"];
b [label="Node B", pos="136,108"];
e [label="Node E", pos="172,60"];
r -> a;
r -> b;
a -> c;
a -> d;
b -> e;
}
DOT
pwd
fi
Les positions des nœuds encodent le plan. Chaque ligne successive descend de 48 points et chaque niveau de profondeur supplémentaire se décale de 36 points vers la droite. Ces valeurs sont des choix d’espacement illustratifs, et non des valeurs par défaut de Graphviz. La documentation de pos précise que les positions des nœuds correspondent à leurs centres et que neato interprète les positions en points lorsqu’il est utilisé avec -n.
| Nœud | Profondeur | Ligne, à partir de zéro | Position du centre |
|---|---|---|---|
| Node R | 0 | 0 | 100,300 |
| Node A | 1 | 1 | 136,252 |
| Node C | 2 | 2 | 172,204 |
| Node D | 2 | 3 | 172,156 |
| Node B | 1 | 4 | 136,108 |
| Node E | 2 | 5 | 172,60 |
Pour cette construction, les règles de coordonnées sont x = 100 + 36 × depth et y = 300 − 48 × row. Observez le passage de Node D à Node B : la ligne avance, mais la profondeur diminue. C’est cette transition qui donne au dessin l’apparence d’un plan plutôt que d’une chaîne.
Toutes les boîtes ont les mêmes dimensions ; des coordonnées de centre identiques alignent donc aussi leurs bords gauches. Les libellés synthétiques de même longueur facilitent la comparaison du placement du texte. Avec fixedsize=true, Graphviz utilise les dimensions de nœud spécifiées au lieu d’agrandir les boîtes pour qu’elles contiennent leur contenu ; les libellés trop grands produisent un avertissement. Consultez la référence de fixedsize.
Comment effectuer le rendu et examiner le résultat ?
Dans la même session Terminal et le même dossier de travail, exécutez :
neato -n2 -Tpdf hierarchy.dot -o hierarchy.pdf
Ici, -n2 conserve la disposition des nœuds fournie sans ajustement pour éviter les chevauchements et calcule les tracés des arêtes qui n’ont pas de positions propres. Chaque nœud doit donc avoir une valeur pos. Les options -Tpdf et -o sélectionnent la sortie PDF et sa destination. Ces comportements sont documentés dans la référence de la ligne de commande.
Ouvrez le dossier de travail dans Finder, puis ouvrez hierarchy.pdf. La sortie PDF nécessite une version de Graphviz qui comprend le moteur de rendu Cairo, comme indiqué sur la page consacrée à la sortie PDF de Graphviz. L’exemple a été vérifié par rapport à la documentation, mais son rendu n’a pas été testé ici, car Graphviz n’était pas disponible dans l’environnement de recherche.
Examinez séparément trois éléments :
- Lecture vers le bas : R, A, C, D, B et E doivent occuper des lignes successives.
- Comparaison de l’indentation : A et B doivent être alignés ; C, D et E doivent être alignés un niveau plus à droite.
- Suivi des relations : R est relié à A et B ; A est relié à C et D ; B est relié à E.
Les deux premières vérifications évaluent la construction des coordonnées. La troisième vérifie le graphe lui-même. En séparant ces vérifications, on repère plus facilement un diagramme qui semble ordonné, mais dont une relation parent-enfant est incorrecte.
Les connecteurs ressembleront-ils exactement aux branches d’un navigateur de fichiers ?
Les lignes et l’indentation des nœuds sont spécifiées explicitement ; les tracés des connecteurs sont toujours calculés. L’exemple demande splines=ortho, qui achemine les arêtes par des segments alignés sur les axes. La documentation de Graphviz précise également que ce mode d’acheminement ne gère pas les ports ; l’ajout de ports de boussole ne constitue donc pas un moyen documenté d’imposer un motif particulier de coudes. Consultez la référence de splines.
Par conséquent, cette construction fournit une hiérarchie à indentation avec des connecteurs à angle droit acheminés automatiquement. Elle ne définit pas un rail vertical partagé avec des jonctions de branches positionnées avec précision. Si cette géométrie des connecteurs est indispensable, il faut une construction supplémentaire qui spécifie explicitement les tracés des arêtes ; splines=ortho seul n’exprime pas cette exigence.
Pour obtenir un plan épuré sans connecteurs visibles, modifiez le réglage du graphe en splines=none, puis relancez le rendu. Le fichier DOT conserve les relations parent-enfant, tandis que le moteur de rendu omet leurs traits. Cette option de rendu est documentée dans la même référence de splines.
Comment adapter l’exemple sans en changer le sens ?
Commencez par écrire l’ordre de lecture souhaité indépendamment de la liste des arêtes. Parcourez d’abord un parent, puis son premier enfant et les descendants de celui-ci, avant de passer à l’enfant suivant. Attribuez une ligne à chaque nœud dans cette séquence. Attribuez ensuite l’indentation en fonction de la profondeur.
Par exemple, pour ajouter un autre enfant sous Node A après Node D, insérez-le dans la séquence de lecture avant Node B. Attribuez-lui une profondeur de deux, décalez les lignes suivantes vers le bas et ajoutez une arête entre A et le nouveau nœud. Les relations parentales existantes ne changent pas simplement parce que leurs numéros de ligne changent.
Suivez cette séquence de diagnostic lorsqu’une version modifiée semble incorrecte :
- Le dessin prend une disposition différente : vérifiez que la commande utilise toujours
neato -n2. L’exemple repose sur les positions fournies plutôt que sur une disposition automatique ordinaire. - Le rendu signale une position manquante : vérifiez chaque identifiant de nœud, y compris ceux mentionnés uniquement dans les déclarations d’arêtes. Pour cette méthode, chacun doit avoir une déclaration avec position.
- Un libellé dépasse de sa boîte : augmentez les dimensions communes des boîtes ou raccourcissez le libellé. Les boîtes de taille fixe ne s’agrandissent pas automatiquement.
- Les lignes se chevauchent après l’agrandissement des boîtes : augmentez l’intervalle entre les lignes. Le mode de rendu choisi conserve les positions au lieu de corriger les chevauchements.
- Une branche est reliée au mauvais nœud : corrigez la déclaration de l’arête. Déplacer une boîte ne peut pas réparer une relation incorrecte.
Les cas de position manquante et de chevauchement découlent du comportement documenté de -n2 par Graphviz ; le cas du libellé découle du comportement de fixedsize. Augmenter l’espacement est l’ajustement de conception correspondant à cet exemple positionné manuellement.
Conservez la liste des arêtes de la hiérarchie comme référence pour les relations et le tableau des coordonnées comme référence pour la présentation. Pour un petit diagramme sur Mac, cette séparation facilite la maintenance : modifiez les arêtes lorsque la hiérarchie change, les lignes lorsque l’ordre de lecture change et l’espacement lorsque les libellés ont besoin de plus de place.
Sources
- Langage DOT — Graphviz
- dot — Graphviz
- rankdir — Graphviz
- rank — Graphviz
- ordering — Graphviz
- Téléchargement — Graphviz
- Ligne de commande — Graphviz
- pos — Graphviz
- fixedsize — Graphviz
- PDF — Graphviz
- splines — Graphviz