Graphviz

Utilisation

Graphviz permet de créer rapidement des diagrammes à partir de fichier text. La disposition des éléments n’est pas gérer par l’utilisateur mais par le programme lui même.

On peut trouver graphviz sur le site qui lui est dédié http://www.graphviz.org/

il existe trois grand programmes de génération # dot # neato # twopi

chacun de ces programmes génèrent des diagrammes différents

exemple de fichier dot

digraph G {
    A1 -> A3 [arrowhead = none];
    A3 -> A5;
    A3 -> A6;
    A2 -> A4;
    A1 [fillcolor=yellow, style="rounded,filled", shape=diamond, label="Hugo"];
    A2 [label="Boris"];
    A3 [label="Cecile"];
    A4 [label="Francois"];
    A5 [label="Frank"];
    A6 [label="Elise"];
}

pour générer le fichier avec le programme dot par exemple

dot -Tjpg -omonImage.jpg monGraphe.dot

le résultat

_images/20110107_3.jpg

vous pouvez trouver plus d’explication sur les paramètres sur ces pages http://www.graphviz.org/doc/info et voir les pages

  • node shapes
  • dot language

exemple de graphique avec des sous graphique

graph G {
  e
  subgraph clusterA {
    a -- b;
    subgraph clusterC {
      C -- D;
    }
  }
  subgraph clusterB {
    d -- f
  }
  d -- D
  e -- clusterB
  clusterC -- clusterB
}

le résultat

_images/20110107_4.jpg

un autre exemple qui incorpore du HTML et des images

digraph sample{
    nodesep=.35;
    ranksep=0.8;
    edge [fontsize=11,labelfontsize=11];
    node [fontsize=11,height=.35,width=.55];
    bgcolor="#FFFFFF";
    ratio=auto;
    compound=true;
    remincross=true;
    searchsize=500;

    a -> b -> c;
    b -> d;
    a [shape=plaintext,label=<<TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0"><TR><TD ALIGN="RIGHT"><IMG SRC="C:\delete.png"/></TD><TD ALIGN="LEFT"><FONT POINT-SIZE="12" FACE="italic" COLOR="#000000">AbstractCollection</FONT></TD></TR></TABLE>>, URL="http://www.redmine.org"];
    b [label="Wiki link", URL="[[WikiSamplePage]]"];
  }

on peut même créer des modèles merise complet

digraph sample{
    nodesep=.35;
    ranksep=0.8;
    edge [fontsize=11,labelfontsize=11];
    node [fontsize=11,height=.35,width=.55];
    bgcolor="#FFFFFF";
    ratio=auto;
    compound=true;
    remincross=true;
    searchsize=500;

    graph [ rankdir = "LR"];

    a -> b  [ label = "generer", headlabel ="1", taillabel = "0..n", label = "test" ,arrowhead = none ];
    b -> c  [ label = "posseder",headlabel ="1", taillabel = "1..n", arrowhead = none];
    c -> d  [label = "composer", headlabel ="0..n", taillabel = "1", arrowhead = none];
    a [ label = <client|id<BR/>nom<BR/>prenom > shape = Mrecord ];
    b [ label = <commande|id<BR/>id_client<BR/>date> shape = Mrecord ];
    c [ label = <ligne|id<BR/>id_commande<BR/>id_art<BR/>qty<BR/>price> shape = Mrecord ];
    d [ label = <article|id<BR/>nom> shape = Mrecord ];
  }
_images/20110126_1.jpg

Python

On peut utiliser un module python pour générer des graphs via graphviz.

Pour cela on utilise le module pydot

pip install pydot

Note

il est possible d’avoir l’erreur “Couldn’t import dot_parser, loading of dot files will not be possible.” il faut alors

pip uninstall pyparsing
pip install -Iv https://pypi.python.org/packages/source/p/pyparsing/pyparsing-1.5.7.tar.gz#md5=9be0fcdcc595199c646ab317c1d9a709
pip install pydot

Exemple de script python:

graph = pydot.Dot('graphname', graph_type='digraph')
subg = pydot.Subgraph('', rank='same')
subg.add_node(pydot.Node('a'))
graph.add_subgraph(subg)
subg.add_node(pydot.Node('b'))
subg.add_node(pydot.Node('c'))

Et encore

# -*- coding: utf-8 -*-
import pydot
graph = pydot.Dot(graph_type='graph')

for i in range(3):
    edge = pydot.Edge("king", "lord%d" % i)
    graph.add_edge(edge)

vassal_num = 0
for i in range(3):
    for j in range(2):
        edge = pydot.Edge("lord%d" % i, "vassal%d" % vassal_num)
        graph.add_edge(edge)
        vassal_num += 1

graph.write_png('example1_graph.png')