Matplotlib 1.1 et autres outils de visualisation en Python

Posté par  . Modéré par Nÿco. Licence CC By‑SA.
27
1
nov.
2011
Python

Matplotlib est une bibliothèque en Python très utilisée pour tracer des graphiques en deux et trois dimensions. Le degré de sophistication peut être très élevé mais les choses simples le restent ; pour se donner une idée, il suffit de regarder la galerie d’exemples.
En combinaison avec les bibliothèques scientifiques NumPy ou SciPy et l’interpréteur IPython, nous obtenons un outil de prototypage très pratique.

Matplotlib n’est pas exempte de limitations, pour de grosses séries de données ou des visualisations complexes en trois dimensions. Il faut alors se tourner vers d’autres outils tels que guiqwt ou Mayavi, si l’on veut rester avec des outils en Python.

Matplotlib

Cette nouvelle version de Matplotlib est compatible avec Python 2.4 à 2.7, et la prochaine version ajoutera la compatibilité avec Python 3.

Diagrammes de Sankey

La représentation de diagrammes de Sankey est désormais possible. Ces diagrammes permettent de représenter l’importance de flux en jouant sur la largeur des flèches.

Animations

Un nouveau framework indépendant du moteur d’affichage (Matplotlib en possède une panoplie dont PS, SVG, GTK ou Qt Agg, PDF, Wx et Tk) fait son apparition pour l’animation des figures. Encore en statut bêta… à tester !

Tight Layout

Un comportement assez ennuyeux de Matplotlib est qu’il a tendance à produire des graphes où les textes se superposent ou sortent du graphique. C’est alors à l’utilisateur de prendre le contrôle sur la taille et la position des éléments du graphe pour obtenir un résultat acceptable. La nouvelle commande tight_layout() permet maintenant un arrangement plus intelligent du graphique, en calculant correctement la place nécessaire aux intitulés d’axes, titres, etc..

Exemple sans Tight Layout

Exemple avec Tight Layout

PyQt4, PySide

Le moteur d’affichage en Qt4 est maintenant compatible avec les interfaces Python de Qt4 : PyQt4 et PySide.

Légendes

L’affichage des légendes a été amélioré. Plus de détails sur ce qu’il est possible de faire à l’adresse http://matplotlib.sourceforge.net/users/legend_guide.html#legend-complex-plots.

3D

Le travail sur la simplification de l’interface pour créer des graphiques tridimensionnels continue. La classe Axes3D se rapproche de plus en plus de sa cousine en 2D, de la documentation a été ajoutée, etc..

Divers

  • les listes des symboles des fonctions plot() (tracé de courbes) et scatter() (tracé de nuages de points) ont été fusionnées pour une plus grande cohérence de l’interface ;
  • on peut maintenant nommer les figures lors de leur création, via figure() ;
  • pour imshow() (tracé d’images), l’interpolation nearest devient une véritable interpolation, tandis que l’option none la désactive complètement. En outre, la consommation de la mémoire a été réduite ;
  • gestion des unités pour les axes et les flèches en coordonnées polaires ;
  • correction d’erreurs dans le passage d’arguments pour les fonctions triples telles que tripcolor() ;
  • le paramètre « axes.labelweight » a été ajouté à rcParams ;
  • corrections d’une erreur lors d’une projection de Hammer ;
  • Jae‐Joon Lee a ajouté les classes HBox et VBox ;
  • scatter() accepte désormais les entrées vides ;
  • the behavior for ‘symlog’ scale has been fixed, but this may result in some minor changes to existing plots. This work was refined by ssyr ;
  • Michiel de Hoon a modifié le back‐end pour Mac OS X, afin que son comportement soit similaire avec les autres back‐ends ;
  • nombreuses corrections de bogues et amélioration de la documentation.

Autres outils de visualisation

guiqwt

guiqwt est un outil qui permet de créer des interfaces graphiques pour visualiser et exploiter des données. Il se distingue de Matplotlib par un nombre plus restreint de types de graphes. La contre‐partie est un gain de performance, comme expliqué sur cette page.
Une qualité de cet outil est qu’il est livré avec de nombreux exemples qui permettent de facilement se l’approprier.

Mayavi

Matplotlib permet de visualiser des données en trois dimensions mais ce n’est pas l’outil le plus adapté. Mayavi offre une meilleure alternative pour cette activité, tout en fournissant une interface simple comme Matplotlib.

Mayavi s’appuie sur la bibliothèque VTK et permet d’ajuster des paramètres de visualisation par un jeu de classes Python ou bien avec des boîtes de dialogues.

Aller plus loin

  • # C'est du bon, mangez-en !

    Posté par  (site web personnel) . Évalué à 4.

    Tout est dit,... ou presque.

    J'utilise quotidiennement le groupe python-numpy-scipy-matplotlib pour le traitement de donnée dans notre laboratoire.
    Je me bats encore avec des ersatz de matlab dans le labo, mais la qualité des graphiques, la facilité d'utilisation et de programmation me facilitent la tâche.

    Cependant, ayant essayé MayaVi pour la visualisation 3D, je ne l'ai pas trouvé si facile à utiliser. Je me suis finalement tourné vers la programmation OpenGL avec pyOpenGl. C'est pas facile non plus, mais plus stable.

    Un grand merci à tous ces développeurs qui nous rendent la vie plus agréable.

    • [^] # Re: C'est du bon, mangez-en !

      Posté par  (site web personnel) . Évalué à 2.

      as-tu essayé tvtk ? (par les mêmes gens que ceux qui font mayavi). Je m'en suis servi il y a 7-8 ans (!) et c'était vraiment pas mal, assez simple a utiliser (par rapport à du vtk brut, ou mayavi qui est plus un logiciel scriptable qu'un toolkit graphique) et capable grosso modo de reproduire les fonctionnalités d'une fenetre graphique matlab pour le rendu 3D , mais en plus rapide.

    • [^] # Re: C'est du bon, mangez-en !

      Posté par  . Évalué à 2.

      Pareil, merci pour la suite Numpy/Scipy/Matplotlib... Pour moi associé à du LaTeX/Beamer et Inkscape... Ça coule tout seul!

    • [^] # Re: C'est du bon, mangez-en !

      Posté par  . Évalué à 3.

      Je me bats encore avec des ersatz de matlab dans le labo, mais la qualité des graphiques, la facilité d'utilisation et de programmation me facilitent la tâche.

      C’est vrai que tous ces machins python semblent séduisants et que cela vaudrait peut-être la peine que j’apprenne ce langage. Cependant, ce qui me fait rester sous Octave pour le moment, c’est son « backend » Gnuplot qui permet d’exporter en LaTeX. Du côté de Matplotlib, j’ai vu qu’il existait Usetex, mais ça ne semble utiliser LaTeX que pour le rendu du texte et n’est pas un véritable export.

      D’où ma question, est-il possible avec tes outils magiques de produire des figures complètement vectorielles qui s’adapteront au style et à la police du document LaTeX dans lequel elles seront incluses ? Ou alors retraces-tu tes figures chaque fois que veux les réutiliser dans un autre contexte ?

      Ta réponse pourrait achever de convaincre un utilisateur d’ersatz de Matlab (même si j’aime beaucoup cet ersatz, bien plus que l’original).

      • [^] # Re: C'est du bon, mangez-en !

        Posté par  . Évalué à 1.

        Pour autant que je sache il n'est actuellement pas possible d'exporter des figures en LaTeX comme tu l'entends. Si tu veux changer la fonte le plus simple est de regénérer la figure. L'astuce du \psfrag ne semble pas marcher non plus pour des raisons techniques depuis la version 1.0.1. Personnellement je mets juste la même fonte que celle qu'utilise le journal. Après si tu veux garder une bonne cohérence avec des documents différents je comprends que ça puisse poser problème.

      • [^] # Re: C'est du bon, mangez-en !

        Posté par  (site web personnel) . Évalué à 3.

        En fait, j'utilise le format svg. Avec Inkscape, je fait des modifications mineures (police, taille) pour avoir des graphiques publiables dans nos articles.

        Un gros bémole : pour les labels (titres, axes, ...) les objets textes sont des lettres séparées, au lieu d'être qu'un seul objet texte pour tout le label. Cela m'oblige à supprimer ces labels et les recréer avec Inkscape.

        Par exemple, au lieu d'avoir : [Titre du graphique],
        on a : [T][i][t][r][e][ ][d][u][ ][g][r][a][p][h][i][q][u][e]

        • [^] # Re: C'est du bon, mangez-en !

          Posté par  . Évalué à 3.

          Juste une question, pourquoi ce ne serait pas faisable directement dans matplotlib ? On peut facilement changer la fonte TeX ou la taille de celle-ci. Par exemple pour le prochain papier que je vais publier, le journal utilise du times. Du coup matplotlib me sort des graphes qu'avec du times.

          • [^] # Re: C'est du bon, mangez-en !

            Posté par  . Évalué à 1.

            Ça oblige tout de même à refaire le graphe, après avoir changé les polices.

            Par contre les solutions à \psfrag&co ne sont pas non plus la panacée, car changer la police ou sa taille rend très souvent le graphe impropre avec des textes qui dépassent des cadres, mal dimensionnés ou mal positionnés.

        • [^] # Re: C'est du bon, mangez-en !

          Posté par  . Évalué à 3.

          avoir des labels "entiers" se fait grâce à "svg.embed_char_paths : False" dans .matplotlib/matplotlibrc
          en tout cas ça marche pour les pyplot.xlabel

          sinon après un export "pdf+latex" dans Inkscape (qui génère un .pdf_tex contenant les text avec leurs position en latex et un .pdf sans text), puis une macro à base de cet exemple de svg dans latex, on obtient de très jolis graphs avec la police latex en cours, les références croisées si on en veux, sélectionnable, et toutes les bonnes qualités qu'on veut lui trouvé. On peut même changer le text grâce à vim sans régénérer la figure en éditant le .pdf_tex !

          Par contre, il est vrai que parfois avec les redimentionements ce n'est plus toujours très alignés, mais du coup, sous Inkscape, vu que les textes sont en un seul morceau, ce n'est plus la croix et la bannière.

      • [^] # Re: C'est du bon, mangez-en !

        Posté par  . Évalué à 1.

        D’où ma question, est-il possible avec tes outils magiques de produire des figures complètement vectorielles qui s’adapteront au style et à la police du document LaTeX dans lequel elles seront incluses ? Ou alors retraces-tu tes figures chaque fois que veux les réutiliser dans un autre contexte ?

        Généralement, je crée un petit script qui trace la figure, pour que la génération soit plus simple. Idéalement, les données sont rangées dans une classe, et les calculs et les diverses représentations sont des attributs de cette classe. Après, comme je bosse avec des biologistes, les graphes sont généralement inclus dans des figures plus vastes. Donc j'exporte le graphique en pdf puis j'importe dans inkscape (l'export en svg direct depuis une figure pylab ne marchais pas bien du tout la dernière fois que j'ai essayé). Donc l'étape inkscape viens surtout du fait que je rajoute des zigouigouis à mes figures... Mais l'export en pdf et un \includegraphics marchent très bien si tu as la chance de faire du 'pur' (pdf)latex.

        • [^] # Re: C'est du bon, mangez-en !

          Posté par  . Évalué à 1.

          Oui, en fait j’utilise Inkscape aussi… Ma chaîne complète est :

           

          [Octave/Gnuplot]----> .tex ----------------------------------------------------
                            |                                                            `--[LaTeX]--> .pdf/.dvi
                            `-> .eps ---> .svg --[Inkscape + zigouigouis]--> .pdf/.eps --´
          
          

          Finalement une solution qui serait satisfaisante est celle proposée par mbussonn avec le paquet « svg-inkscape » même si elle impose d’éditer les légendes des figures dans Inkscape ce qui est moins pratique pour les traductions de documents. N’avoir qu’un gros fichier .tex à traduire, légendes incluses, est un atout agréable mais si Matplotlib est si génial, je saurai faire sans.

          Bon, ne me reste plus qu’à apprendre Python, dès que j’en aurai le temps.

          • [^] # Re: C'est du bon, mangez-en !

            Posté par  . Évalué à 2.

            Finalement une solution qui serait satisfaisante est celle proposée par mbussonn avec le paquet « svg-inkscape » même si elle impose d’éditer les légendes des figures dans Inkscape ce qui est moins pratique pour les traductions de documents

            Pas vraiment, Inkscape va juste convertir en un .pdf et un .pdf_tex, même uniquement en ligne de commande.
            Le .pdf_tex ne contient que du code latex avec les légendes et leur positionnement. Il est donc tout à fait traduisible, et modifiable sans Inkscape. Il est vrai que les .pdf_tex restent des fichier annexes avec un code pas forcément très joli.

            extrait interessant d'un pdf_tex, qui n'as pas besoin d'inkscape pour la traduction:

            %[...]
            %legende de l'axe horizontal
            \put(0.538,0.0){\color[rgb]{0,0,0}\makebox(0,0)[b]{\smash{temps (unit\'e arbitraire)}}}%
            %legende de l'axe vertical
            \put(0.013,0.26){\color[rgb]{0,0,0}\rotatebox{90}{\makebox(0,0)[b]{\smash{$\delta_{QPD} (u.a.)$}}}}%
            %[...]
            
            
  • # Beaucoup de qualité et quelques défauts

    Posté par  . Évalué à 4.

    Comme pour le premier commentaire, je n'utilise pour ainsi dire plus que ça pour faire mes graphes en combinaison avec numpy/scipy et quelques paquets plus spécialisés, en remplacement d'IDL. Dans l'ensemble ça fonctionne très bien même si l'on tombe sur certaines bizarreries de temps à autre. Cependant il faut avouer que matplotlib n'est pas très véloce dans certains cas de figure. Par exemple pour enregistrer un nuage de points (scatter()) dans un PDF, ça peut commencer à prendre pas mal de temps et ça génère des fichiers assez gros dès qu'on a quelques centaines ou milliers de points. Ce n'est pas un problème quand on a qu'une figure mais ça le devient quand on en génère des centaines. Quant aux nouveautés, je ne sais déjà plus me passer de la fonction fonction tight_layout() qui résout largement les problèmes de chevauchement qui n'étaient que trop communs.

    Sinon je suis content de voir que l'usage d'outils libres se répand en remplacement d'outils propriétaires comme Matlab ou IDL. On commence à voir l'émergence d'un écosystème assez riche dans des domaines assez spécialisés, ce qui n'est pas pour me déplaire.

    • [^] # Re: Beaucoup de qualité et quelques défauts

      Posté par  . Évalué à 1.

      Pour le bémol par rapport à la critique. Lorsqu’on veut afficher un très gros nuage de points, utilisez les histogrammes, c’est fait pour.

      h, x, y = histogram2d(data_y, data_x) # il faut inverser les axes en arguments
      imshow(h)
      contour(h)
      # etc.
      
      

      Et voilà… (il existe aussi une fonction, hist je crois, qui fait tout en une seule fois, mais avec moins de contrôles)
      • [^] # Re: Beaucoup de qualité et quelques défauts

        Posté par  . Évalué à 2.

        C'est une solution effectivement mais j'utilise aussi la couleur des points pour indiquer des informations supplémentaires. D'ailleurs si tu veux montrer une densité de points, je suggérerais plutôt d'utiliser hexbin(), le côté plus circulaire de l'hexagone par rapport au carré ou au triangle (les 2 autres pavages réguliers du plan possibles) permet de ne prendre que les points qui sont plus proches du centre (je ne sais pas si je m'exprime clairement).

    • [^] # Re: Beaucoup de qualité et quelques défauts

      Posté par  . Évalué à 2.

      Pour les nuages de points de plusieurs milliers d'element tu es cense utilise une "collection". C'est pas forcement bien documente enfin cela ne l'etait pas lorsque j'avais du m'en servir. Peut etre que cela resout aussi le probleme de sauvegarde. Mais bon il faut voir que sauvegarder des figures dans un format vectoriel lorsque tu as enormement de point cela risque de produire des figures enormes (que ce soit avec matplotlib ou gnuplot)...

  • # Vélocité

    Posté par  (site web personnel) . Évalué à 1.

    J'utilise WxPython et je cherche une solution pour afficher un tracé qui se déroule selon des données recueillies en continu.(imaginez un sismographe à bande)
    Vous connaissez une lib de visualisation qui fait ça?

    On m'a dit que Matplotlib était plutot lent. Wx.lib.plot est plutôt simple, mais il faut redessiner tout le graph à chaque fois si bien que niveau CPU utilisé c'est un peu la cata.

    Je cherche un outil véloce dans le sens où il n'a pas besoin de beaucoup de CPU pour l'utiliser sur des mini-PCs où l'autonomie est importante.

  • # Chaco

    Posté par  . Évalué à 4.

    Un autre outil en python de visualisation de données est Chaco
    http://code.enthought.com/chaco/

    Il est écrit par les meme developeurs que myavi, a l'aide de la bibliothèque Traits.
    Cet outil gagne vraiment a être connu, et introduit des concepts de manipulation de données tres intéressants.

    Le gros point fort de chaco est son aspect dynamique, on peut facilement creer des interfaces spécifiques pour zoomer sur les donnes, sélectionner un partie, etc.

    C'est moins simple d'approche que matplotlib, mais vraiment tres puissant.
    Je parle en connaissance de cause, puisque c'est le moteur de pytimechart:
    http://elinux.org/images/6/63/Elce11_tardy.pdf

    • [^] # Re: Chaco

      Posté par  . Évalué à 3.

      Le gros point negatif c'est l'installation. Tu dois te taper toutes la panoplie enthought.

      • [^] # Re: Chaco

        Posté par  . Évalué à 1. Dernière modification le 03 novembre 2011 à 08:18.

        apt-get install python-chaco.
        
        

        Ca tire en effet 50Mo de dependances, mais ca se passe plutôt bien.
        En effet installer ETS avec easy_install ou pip fut vraiment penible (je ne sais pas si ils ont amélioré avec ETS4)
  • # En complément.

    Posté par  . Évalué à 2.

    Excellente bibliothèque en effet. Un point très positif est qu'elle est integrée (à l'instar de NumPy et ScIpy) dans le très bon logiciel de mathématique Sage, ce dernier étant piloté par Python.

    La liste de l'ensemble de ce qui est inclus dans Sage : Composants

  • # Le retour du script dans kst, basé sur python/matplotlib

    Posté par  . Évalué à 6.

    Comme mentionné par Nonolapero plus haut, kst (http://kst-plot.kde.org) est très performant : je l'utilise pour tracer des courbes avec plusieurs millions de points, sans aucun problème de performance. La prochaine version (2.0.5, actuellement en cours de gestation) verra le retour de la possibilité de faire des scripts depuis python avec une syntaxe basée sur matplotlib. Cf documentation préliminaire sur http://hen.astro.utoronto.ca/pyKst/ et le message http://mail.kde.org/pipermail/kst/2011-August/020047.html.
    Le développement est en cours, la mailing list (kst@kde.org) est ouverte pour tout commentaire. C'est le moment ou jamais de donner vos bonnes idées !

    Concernant l'utilisation avec Latex, kst dispose aussi d'un véritable export vectoriel, qui vient d'être encore amélioré cette semaine et sera donc meilleur dans la prochaine version. Les formats supportés sont .ps (transformable facilement en .eps), .pdf et .svg.

  • # Difficultés de mise en page

    Posté par  . Évalué à 1.

    Je découvre en ce moment matplotlib. Ça a l'air effectivement très puissant, il n'y a qu'à voir la page d'exemples !

    En revanche, j'ai vraiment des difficultés avec la mise en page. tight_layout ne résout pas (encore) tout.

    • Apparemment, il ne tient pas compte d'un éventuel axe y secondaire à droite.
    • Il ne tient pas compte d'une légende à l'extérieur du graphique.

    Je n'arrive pas à mettre facilement et joliment une légende en dehors du graphique. (La doc explique comment disposer la légende par rapport au graphique, mais elle dépasse de la figure et empiète sur les ticklabels.) On trouve des messages de 2008 traitant de ce sujet sur la liste des utilisateurs, et pas vraiment de réponse satisfaisante. Ça ne me semble pourtant pas être un besoin trop exotique. Il y a peut-être moyen de bidouiller mais ça veut dire récréer une sorte de tight_layout adaptés à son besoin et j'imagine que si c'était simple, ça existerait déjà...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.