Didacticiel :
Python, dessine-moi un graphe

Derrière ce titre énigmatique, qui n'aura pas été sans vous rappeler la fameuse phrase du Petit Prince d'Antoine de Saint Exupéry, se cache un module pour Python qui dira sûrement quelque chose à nos lecteurs assidus spécialisés dans les graphes : pygraphviz !

Ce module a été créé autour de GraphViz et vous permet ainsi de faire des graphes sous Python en respectant les normes établies par GraphViz et, par conséquent, d'exporter ou d'importer très facilement vos graphes pour vos différents projets. Sans plus attendre, attaquons-nous à quelques exemples d'utilisations du module. Prêts ? Graphez !

Installation de pygraphviz

Dans un premier temps, il vous faut avoir installé GraphViz.

Disponible depuis les dépôts officiels de Python, le module peut être très facilement installé, à l'aide du gestionnaire pypi :

Si vous n'aimez pas pypi, vous pouvez également utiliser easy_install :

Vous avez bien tous réussi l'installation ? Place à un peu de pratique 🙂 !

pygraphviz par la pratique

Hello world!

Commençons par créer une première ébauche de notre script :

Exécutez votre script et, un graphe sauvage apparaît ! Ce graphe apparaît tel qu'il aurait été écrit dans un fichier au format dot.

Maintenant que nous pouvons afficher un graphe pour GraphViz, peut-être voulez-vous pouvoir l'exporter ? Rien de plus simple, rajoutez cette simple ligne :

Bon, d'accord, ce n'est pas très visuel, surtout lorsque nous sommes étranger à la logique de GraphViz. Pourquoi ne pas créer une image du graphe 🙂 ? Voici comment procéder :

Et un aperçu de l'image :

Hello world!

Votre premier graphe en Python, bravo ! | par Norore, CC-0

Félicitations, vous avez créé votre premier graphe sous Python !

Le code final si vous voulez vous amuser avec (faites-le, on apprend mieux en testant !) :

Jouer avec les ontologies

Pour cet  exemple, nous allons reproduire ce graphe déjà existant : Skin development

Notre objectif est ici multiple :

  • avoir un graphe orienté
  • chaque nœud du graphe doit être une boîte
  • le nœud principal qui indique le nom de l'ontologie doit être rempli en gris
  • certaines arêtes doivent être de couleur bleue

Par chance pygraphviz nous permet de faire des graphes orientés et de modifier les attributs des nœuds et des arêtes. Voici comment j'ai procédé pour reproduire le graphe :

Ce qui vous donne ce résultat une fois le script exécuté :

Reproduction des ontologies de QuickGO | par Norore, CC-by 0

Première reproduction des ontologies de QuickGO | par Norore, CC-by 0

Bon, on a un bon premier aperçu, mais avouez que le code est un peu lourd à taper et à relire. Heureusement, pygraphviz nous permet de créer un graphe à partir d'une liste de nœuds ou d'une liste d'arêtes ! Pour nos arêtes, nous allons utiliser la fonction add_edges_from(list) :

Bien, on y voit déjà un peu plus clair, et ce sera plus facile à modifier si besoin ! Cependant, on aimerait bien que le premier nœud ne soit pas en haut mais en bas du graphe. Pour cela, graphviz nous propose l'option adéquate ! Dans notre instanciation de la classe AGraph, nous devons déclarer l'option rankdir en lui indiquant une orientation bottom -> top (par défaut, top -> bottom) :

Ce qui nous donne le graphe final suivant :

ontologies

Reproduction de l'ontologie Skin development de QuickGO | par Norore, CC-by 0

Et le script complet :

Utiliser un graphe existant avec pygraphviz

pygraphiz utilisant l'environnement GraphViz afin de réaliser ses graphes, vous pouvez bien évidemment importer un graphe existant pour le dessiner.

Prenons un exemple fourni dans la galerie de GraphViz, l'exemple datastruct : http://www.graphviz.org/Gallery/directed/datastruct.gv.txt (clic-droit et "Enregistrer la cible du lien sous" pour récupérer le fichier). Pour dessiner le graphe, il vous suffit de saisir les lignes suivantes :

Je ne vous présente pas le résultat, étant donné qu'il est exactement le même que dans l'exemple fournit par GraphViz.

Quel intérêt me direz-vous ? Et bien l'intérêt pourrait être de réutiliser un graphe existant afin de modifier les données contenues. Il est en effet possible de jouer sur les nœuds et les arêtes même si elles n'ont pas été, a priori, d'abord définies par votre script. La classe AGraph, en lisant le fichier du graphe, construit à la volée les différents nœuds et arêtes tout en appliquant les différents attributs. Mais elle permet également, grâce à des méthodes dédiées, d'afficher les nœuds et les arêtes générées. Ce qui permet, par conséquent, de pouvoir les modifier à volonté.

Dans notre exemple, je me suis amusée à compter le nombre d'arêtes (méthode edges_iter())et le nombre de nœuds (méthode nodes_iter()), mais également à changer la couleur des arêtes (méthode edge_attr.update(), en rouge) et la couleur du texte des noeuds (méthode node_attr.update(), en violet) :

Notre graphe datastruct, qu'il est kitch ! |par Norore, CC-by 0

Notre graphe datastruct, qu'il est kitch ! |par Norore, CC-by 0

Et pour ceux qui veulent voir comment j'ai fait, voici le script final :

Le mot de la fin

En conclusion je dirai que pygraphviz est un excellent module pour Python pour ceux qui souhaitent réaliser des graphes avec leurs données. De plus, il est également possible d'utiliser la puissance de Python pour générer les graphes à la volée une fois les données générées, ce qui peut être pratique dans certains cas. L'autre avantage est également la possibilité d'exporter le graphe au format GraphViz, permettant ainsi de partager plus rapidement et facilement un graphe généré, surtout si celui-ci est imposant. Les fichiers d'image pouvant être plus ou moins lourd, rien ne vaut un bon fichier texte pour soulager les serveurs 🙂 !


Merci à ZaZo0o, hedjour, Romain Retureau et Sylvain P. pour leur relecture et leurs conseils.

  • À propos de
  • Issue d'une licence de biologie cellulaire et physiopathologie et d'un master de bioinformatique, je m'intéresse tout particulièrement au monde de la recherche et au domaine de la santé. J'ai travaillé dans l'unité 946 de l'INSERM, dirigée par Florence Demenais, où mon travail principal a été l'étude et la recherche de bases de données et d'outils d'intérêt majeur pour l'axe de recherche dans lequel j'étais impliquée. J'ai aussi travaillé à l'Institut Pasteur où j'ai été recrutée en tant qu'ingénieure bioinformaticienne dans le cadre du LabEx Milieu Intérieur et où ma mission principale a été de mettre en place une base de données pour la gestion de nos échantillons biologiques. Mes centres d'intérêt en bioinformatique sont : la mise en application de méthodes dans les domaines de la génomique, de la protéomique et les interactions gène-gène protéine-protéine pouvant nous apporter des informations sur leurs influences dans les maladies. Je travaille actuellement au service informatique de l'IBENS où j'ai été recrutée en qualité de développeuse d'applications !

Catégorie: Didacticiel | Tags: , ,

3 commentaires sur “Python, dessine-moi un graphe

  1. Joli article!
    Mais une petite préoccupation: bien vrai que R soit plus performant, j'aimerai savoir quelle est la particularité de Pygraphviz par rapport à R?

    • A ma connaissance, R ne fait pas ce genre d'organigramme (ou bien tu connais un package en particulier ?). Il ne s'agit pas de performance ici (d'ailleurs, sur quoi te base tu pour dire que R est plus performant que python ?).

      Sinon, excelent tuto :).

  2. comment extraire tous les chemins possible d'un graphe orienté

Laisser un commentaire