2010-04-16 Logiciel à découvrir, Graphviz

Dernière modification

Résumé : Graphviz est un ensemble d'outils permettant de créer des graphes en ligne de commande, ceux-ci étant décrits dans des scripts décrivant des objets et leurs relations au moyen d'une syntaxe spécifique.

Ajouté(e) :

> [[Logiciels]]


Logiciels

http://www.k1ka.be/pics/exemple.png

Graphviz est un ensemble d'outils permettant de créer des graphes en ligne de commande, ceux-ci étant décrits dans des scripts décrivant des objets et leurs relations au moyen d'une syntaxe spécifique, le langage Dot.

À la manière de LaTeX qui se charge de produire un document sans que le rédacteur ait eu à se préoccuper de sa mise en forme, Graphviz dispose les éléments du graphe de la manière la plus appropriée, l'utilisateur n'ayant eu qu'à décrire les objets (les noeuds) et leurs relations (les arcs ou les arêtes).

Tout ensemble de données entre lesquelles on peut établir des relations, des hiérarchies, peut se trouver décrit de cette manière. Ainsi:

Les graphes simples se décrivent de manière assez intuitive, le langage Dot est souple, les relations entre les noeuds pouvant être exprimés «en train», en une ligne continue, ou bien de manière séquentielle, l'une après l'autre. Ceci est la source du petit graphe en haut de page:

 digraph G {
  a -> b -> c -> d -> e -> f
  a -> c
  c -> e
  a -> g 
  g -> c
 }

La relation peut être exposée sans que les noeuds qui la composent aient été déclarés de manière préalable. Dans des graphes plus élaborés, il sera possible d'attribuer aux noeuds comme aux arcs des caractéristiques graphiques (couleur, forme, police...), des attributs comme des labels (qui seront affichés à la place de leur nom), des urls, des contraintes de positions, etc. Dès lors, il devient logique de commencer par décrire les noeuds, puis ensuite leurs relations. On pourra aussi regrouper par des accolades des noeuds ou des relations qui partagent les mêmes caractéristiques; les accolades permettent aussi de créer des sous-graphes.

À titre d'exemple, un petit réseau domestique - noter qu'il s'agit ici de relations non orientées - où les noeuds sont représentés par des images, ceci pour montrer qu'on peut parvenir à des résultats assez esthétiques (le code est en bas de page):

http://www.k1ka.be/pics/network.png

Pour un exemple plus complexe, voir la chaîne de conversion du logiciel Pandoc, où le résultat au format svg permet de proposer des liens actifs vers les pages concernées.

Cet article n'a pas la prétention d'aller bien loin dans la présentation de Graphviz, qui s'avère un logiciel extrêmement riche... et parfois ardu à exploiter. Il faut savoir que d'autre types de graphes peuvent être réalisés, non-hiérarchiques, radiaux (un noeud central autour duquel les autres s'étendent en cercles concentriques en fonction du nombre de «sauts» qui les en séparent), circulaires...

Parmi les formats exportés, outre les classiques pdf (produit directement sans passer par le PostScript), bitmaps, svg, on notera le vrml. Je n'ai pas testé, mais il serait en effet possible d'attribuer un niveau à un noeud, et donc de produire un résultat en 3D.

S'il peut sembler pénible d'écrire à la main des fichiers en langage dot, le potentiel de Graphviz est surtout de produire des graphes à partir de données établies de manière automatisée, y compris dans des scripts CGI. C'est ainsi que Wikimedia l'utilise pour proposer une [[2010-01-03_Naviguer_dans_les_catégories_de_Wikipedia_avec_Catgraph?|navigation entre ses catégories]], que des systèmes de wiki s'en servent pour afficher un plan de leurs pages1. J'ai fait une pareille tentative pour réaliser un plan de ce blog à partir d'un crawler en Perl, mais le résultat est d'une utilité très contestable :-) ...

Pour aller plus loin

Le fichier dot du réseau

 graph G { 
  overlap=false;
  splines=true;
  nodesep=1;
  pad=1;
              
  node  [shape=none,
         labelloc=b,               /* pour ne pas superposer texte et image */
         fontname="sans-serif"];   /* placer le label en bas                */
  
  /* On peut regrouper les noeuds dotés de la même image */
  { node [image="system.png"]
    spirou    [label="\N\n192.168.0.201"]
    zorglub   [label="\N\n192.168.0.202"]
    fantasio  [label="\N\n192.168.0.200"]
  }  
  
  Brother [shape=none, image="printer1.png"];
  scanner [shape=none, image="scanner.png"];
  routeur [shape=none, image="routeur.png"];
  geexbox [shape=none, image="tv.png", label="\N\n192.168.0.203"];
  
  subgraph cluster_1 { 
    label="Local 1" fontname=Helvetica style=rounded color=grey
  
    Brother -- fantasio
    scanner -- fantasio
  }
  
  fantasio -- routeur
  spirou   -- routeur
  zorglub  -- routeur
  geexbox  -- routeur
 }

Footnotes:

1. Voir cette page, un plugin pour Dokuwiki , cet autre wiki, etc.