Python, dessine-moi un graphe

Der­rière ce titre énig­ma­tique, qui n'aura pas été sans vous rap­pe­ler la fameuse phrase du Petit Prince d'Antoine de Saint Exu­pé­ry, se cache un module pour Python qui dira sûre­ment quelque chose à nos lec­teurs assi­dus spé­cia­li­sés dans les graphes : pygra­ph­viz !

Ce module a été créé autour de Gra­ph­Viz et vous per­met ain­si de faire des graphes sous Python en res­pec­tant les normes éta­blies par Gra­ph­Viz et, par consé­quent, d'exporter ou d'importer très faci­le­ment vos graphes pour vos dif­fé­rents pro­jets. Sans plus attendre, atta­quons-nous à quelques exemples d'utilisations du module. Prêts ? Gra­phez !

Installation de pygraphviz

Dans un pre­mier temps, il vous faut avoir ins­tal­lé Gra­ph­Viz.

Dis­po­nible depuis les dépôts offi­ciels de Python, le module peut être très faci­le­ment ins­tal­lé, à l'aide du ges­tion­naire pypi :

Si vous n'aimez pas pypi, vous pou­vez éga­le­ment uti­li­ser easy_​install :

Vous avez bien tous réus­si l'installation ? Place à un peu de pra­tique 🙂 !

pygraphviz par la pratique

Hello world !

Com­men­çons par créer une pre­mière ébauche de notre script :

Exé­cu­tez votre script et, un graphe sau­vage appa­raît ! Ce graphe appa­raît tel qu'il aurait été écrit dans un fichier au for­mat dot.

Main­te­nant que nous pou­vons affi­cher un graphe pour Gra­ph­Viz, peut-être vou­lez-vous pou­voir l'exporter ? Rien de plus simple, rajou­tez cette simple ligne :

Bon, d'accord, ce n'est pas très visuel, sur­tout lorsque nous sommes étran­ger à la logique de Gra­ph­Viz. Pour­quoi ne pas créer une image du graphe 🙂 ? Voi­ci com­ment pro­cé­der :

Et un aper­çu de l'image :

Hello world!
Votre pre­mier graphe en Python, bra­vo ! | par Norore, CC‑0

Féli­ci­ta­tions, vous avez créé votre pre­mier graphe sous Python !

Le code final si vous vou­lez vous amu­ser avec (faites-le, on apprend mieux en tes­tant !) :

Jouer avec les ontologies

Pour cet  exemple, nous allons repro­duire ce graphe déjà exis­tant : Skin deve­lop­ment

Notre objec­tif est ici mul­tiple :

  • avoir un graphe orien­té
  • chaque nœud du graphe doit être une boîte
  • le nœud prin­ci­pal qui indique le nom de l'ontologie doit être rem­pli en gris
  • cer­taines arêtes doivent être de cou­leur bleue

Par chance pygra­ph­viz nous per­met de faire des graphes orien­tés et de modi­fier les attri­buts des nœuds et des arêtes. Voi­ci com­ment j'ai pro­cé­dé pour repro­duire le graphe :

Ce qui vous donne ce résul­tat une fois le script exé­cu­té :

Reproduction des ontologies de QuickGO | par Norore, CC-by 0
Pre­mière repro­duc­tion des onto­lo­gies de Quick­GO | par Norore, CC-by 0

Bon, on a un bon pre­mier aper­çu, mais avouez que le code est un peu lourd à taper et à relire. Heu­reu­se­ment, pygra­ph­viz nous per­met de créer un graphe à par­tir d'une liste de nœuds ou d'une liste d'arêtes ! Pour nos arêtes, nous allons uti­li­ser la fonc­tion add_edges_from(list) :

Bien, on y voit déjà un peu plus clair, et ce sera plus facile à modi­fier si besoin ! Cepen­dant, on aime­rait bien que le pre­mier nœud ne soit pas en haut mais en bas du graphe. Pour cela, gra­ph­viz nous pro­pose l'option adé­quate ! Dans notre ins­tan­cia­tion de la classe AGraph, nous devons décla­rer l'option rank­dir en lui indi­quant une orien­ta­tion bot­tom -> top (par défaut, top -> bot­tom) :

Ce qui nous donne le graphe final sui­vant :

ontologies
Repro­duc­tion de l'ontologie Skin deve­lop­ment de Quick­GO | par Norore, CC-by 0

Et le script com­plet :

Utiliser un graphe existant avec pygraphviz

pygra­phiz uti­li­sant l'environnement Gra­ph­Viz afin de réa­li­ser ses graphes, vous pou­vez bien évi­dem­ment impor­ter un graphe exis­tant pour le des­si­ner.

Pre­nons un exemple four­ni dans la gale­rie de Gra­ph­Viz, l'exemple datas­truct : http://​www​.gra​ph​viz​.org/​G​a​l​l​e​r​y​/​d​i​r​e​c​t​e​d​/​d​a​t​a​s​t​r​u​c​t​.​g​v​.​txt (clic-droit et "Enre­gis­trer la cible du lien sous" pour récu­pé­rer le fichier). Pour des­si­ner le graphe, il vous suf­fit de sai­sir les lignes sui­vantes :

Je ne vous pré­sente pas le résul­tat, étant don­né qu'il est exac­te­ment le même que dans l'exemple four­nit par Gra­ph­Viz.

Quel inté­rêt me direz-vous ? Et bien l'intérêt pour­rait être de réuti­li­ser un graphe exis­tant afin de modi­fier les don­nées conte­nues. Il est en effet pos­sible de jouer sur les nœuds et les arêtes même si elles n'ont pas été, a prio­ri, d'abord défi­nies par votre script. La classe AGraph, en lisant le fichier du graphe, construit à la volée les dif­fé­rents nœuds et arêtes tout en appli­quant les dif­fé­rents attri­buts. Mais elle per­met éga­le­ment, grâce à des méthodes dédiées, d'afficher les nœuds et les arêtes géné­rées. Ce qui per­met, par consé­quent, de pou­voir les modi­fier à volon­té.

Dans notre exemple, je me suis amu­sée à comp­ter le nombre d'arêtes (méthode edges_​iter())et le nombre de nœuds (méthode nodes_​iter()), mais éga­le­ment à chan­ger la cou­leur des arêtes (méthode edge_attr.update(), en rouge) et la cou­leur du texte des noeuds (méthode node_attr.update(), en vio­let) :

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

Et pour ceux qui veulent voir com­ment j'ai fait, voi­ci le script final :

Le mot de la fin

En conclu­sion je dirai que pygra­ph­viz est un excellent module pour Python pour ceux qui sou­haitent réa­li­ser des graphes avec leurs don­nées. De plus, il est éga­le­ment pos­sible d'utiliser la puis­sance de Python pour géné­rer les graphes à la volée une fois les don­nées géné­rées, ce qui peut être pra­tique dans cer­tains cas. L'autre avan­tage est éga­le­ment la pos­si­bi­li­té d'exporter le graphe au for­mat Gra­ph­Viz, per­met­tant ain­si de par­ta­ger plus rapi­de­ment et faci­le­ment un graphe géné­ré, sur­tout si celui-ci est impo­sant. Les fichiers d'image pou­vant être plus ou moins lourd, rien ne vaut un bon fichier texte pour sou­la­ger les ser­veurs 🙂 !


Mer­ci à ZaZo0o, hed­jour, Romain Retu­reau et Syl­vain P. pour leur relec­ture et leurs conseils.



Pour continuer la lecture :


Commentaires

3 réponses à “Python, dessine-moi un graphe”

  1. Joli article !
    Mais une petite pré­oc­cu­pa­tion : bien vrai que R soit plus per­for­mant, j'aimerai savoir quelle est la par­ti­cu­la­ri­té de Pygra­ph­viz par rap­port à R ?

    1. Avatar de Romain Retureau
      Romain Retureau

      A ma connais­sance, R ne fait pas ce genre d'organigramme (ou bien tu connais un package en par­ti­cu­lier ?). Il ne s'agit pas de per­for­mance ici (d'ailleurs, sur quoi te base tu pour dire que R est plus per­for­mant que python ?).

      Sinon, excelent tuto :).

  2. com­ment extraire tous les che­mins pos­sible d'un graphe orien­té

Laisser un commentaire