Produire des graphiques esthétiques ou interactifs
Sommaire
- Python ou R : comment choisir
- Faciliter la collaboration et la reproductibilité
- La visualisation de données avec Python
- Importer et structurer des données pour la visualisation
- Structurer en tableaux avec NumPy
- Structurer en DataFrames grâce à pandas
- Les bibliothèques de visualisation de Python
- La structure des données dans R
- Les outils de visualisation
- Quel type de graphique choisir ?
- Ressources en accès ouvert
L’adage est connu : une image vaut mille mots. On pourrait aussi affirmer que la chimie, comme la physique, sont des sciences visuelles (1). Esquisse de schéma réactionnel dans un cahier de laboratoire, courbes de traction dans un article ou encore spectres d’absorption sont autant de techniques de datavisualisation.
Si la mise en forme des données permet de communiquer efficacement un résultat, les chercheurs ou leurs étudiants ne bénéficient pas tous d’une formation en datavisualisation.
Nous vous proposons ici une série d’outils permettant à la fois de faciliter l’exploration de vos données, mais aussi d’enrichir vos articles ou présentations.
S’il existe une multitude de logiciels spécialisés, maîtriser quelques compétences en programmation permet de s’assurer une grande polyvalence. Ainsi, Python et R sont deux langages de programmation qui permettent d’effectuer de nombreuses visualisations, des plus simples aux plus complexes.
Python ou R : comment choisir ?
Les deux langages de programmation Python et R sont très largement utilisés dans la communauté scientifique, quelle que soit la discipline. La plupart des types de visualisation est réalisable avec Python comme avec R. Le choix d’un langage ou d’un autre dépend donc essentiellement de la communauté dans laquelle on s’insère, et des collaborations que l’on souhaite mener.
Néanmoins, quelques différences entre les deux langages valent la peine d’être prises en considération.
R est avant tout un langage de traitement des données. Il a été originellement conçu par et pour des statisticiens, afin d’élargir la portée du langage S. De ce fait, R inclut d’emblée un certain nombre de fonctions d’analyse statistique et de modules de traçage de graphiques assez poussés, auxquels de nouveaux peuvent être ajoutés en téléchargeant les packages dédiés. Python est un langage de programmation général. Pour pouvoir faire de l’analyse statistique et des visualisations, il faut importer des bibliothèques additionnelles comme matplotlib. Néanmoins, Python est de plus en plus utilisé en science des données, notamment pour réaliser de l’apprentissage automatique, même si R est aussi, en tant que langage façonné pour le traitement statistique des données, un langage naturel pour le machine learning.
Python est donc utilisé par une communauté plus large que R (2), mais en grande partie pour des usages qui ne sont pas liés aux statistiques et à la visualisation de données, alors que la communauté R est centrée sur la science des données.
Enfin, il faut remarquer que les deux langages ne sont pas exclusifs. D’une part, ils partagent un certain nombre de possibilités communes, comme plotly, une bibliothèque qui permet d’intégrer des éléments de JavaScript pour créer des graphiques interactifs, ou Shiny, pour créer des applications web. D’autre part, il est tout à fait possible d’utiliser à la fois Python et R lorsque les besoins l’imposent, notamment grâce au package reticulate, qui permet d’appeler dans R des fonctions et des bibliothèques Python, et rpy2, qui permet, à l’inverse, d’appeler des éléments de R en Python.
Faciliter la collaboration et la reproductibilité
L’utilisation de bloc-notes n’est pas nécessaire pour écrire en Python ou en R, mais elle est particulièrement indiquée lorsqu’on cherche à faire de la visualisation de données. En effet, cela permet d’écrire des documents en explicitant les choix faits pour la représentation graphique dans des blocs de commentaires, et d’insérer les images dans la trame d’un récit, selon les principes de la programmation lettrée théorisée par Donald E. Knuth (3).
Il s’agit de combiner des blocs de texte rédigés au format markdown, avec des blocs de code dans le langage choisi, exécutables à l’aide d’un noyau dédié. Lorsque les blocs de code sont exécutés, leur output (par exemple un graphique), est inséré dans le document, soit à la place du bloc de code, soit à sa suite. De nombreuses solutions sont disponibles pour rédiger sous forme de bloc-notes. Elles peuvent être regroupées en deux grandes catégories :
- Celles dont l’interface s’affiche directement dans un navigateur web, comme Jupyter Notebook
- Des IDE (integrated development environment) ou environnements de développement intégré, dans lesquelles est chargée la bibliothèque appropriée, par exemple R Mardown dans RStudio ou Jupyter Lab.
Combiner l’utilisation de notebooks Jupyter avec Quarto permet de les exporter et de les visualiser dans une grande variété de formats et d’obtenir, très facilement, des documents de qualité publiable, notamment en utilisant les modèles disponibles correspondant aux standards de grands éditeurs comme PLOS, Elsevier ou ACS. Il est aussi possible d’obtenir un résultat en HTML, afin de créer une version dans laquelle les lecteurs peuvent interagir avec les tableaux et les graphiques. Ainsi, les solutions de ce type permettent, à partir du même document, d’obtenir en quelques commandes à la fois une version à publier dans un journal et une version interactive, à afficher sur un site internet.
La visualisation de données avec Python
Importer et structurer des données pour la visualisation
Le moyen le plus simple pour importer des données dans Python est de construire des listes. Une liste est une série de valeurs qui peuvent être de types différents. Les listes peuvent être construites à la main ou importées depuis divers formats de fichiers, comme le csv, le JSON ou l’XML. En Python, une liste est un ensemble de valeurs entre crochets, séparées par des virgules. Pour aller au-delà des listes, deux bibliothèques très courantes facilitent grandement la tâche. Il s’agit de la bibliothèque NumPy et de la bibliothèque pandas.
Structurer en tableaux avec NumPy
La bibliothèque NumPy (pour Numeric Python) permet de manipuler des matrices. L’élément de base introduit par NumPy est le tableau (array). Le tableau à une dimension ressemble à une liste, mais à la différence de cette dernière, il ne peut contenir que des objets de même type (soit numériques, soit textuels, etc.).
Le premier avantage du tableau est qu’il peut être multidimensionnel. Il permet de combiner des listes en lignes et en colonnes. Mais surtout, le package NumPy permet d’appliquer un certain nombre de fonctions mathématiques aux tableaux. Il peut être étendu avec le package SciPy (Scientific Python) qui introduit des possibilités supplémentaires de transformations mathématiques.
Structurer en DataFrames grâce à pandas
Une autre solution pour structurer des données en lignes et en colonnes est d’utiliser le package pandas. L’utilisation de pandas n’exclut pas celle de numpy. Pandas permet de créer des DataFrames compatibles avec d’autres types de données structurées en deux dimensions comme une base de données SQL ou un tableau Excel ou csv (voir la liste des formats lisibles sous forme de DataFrame). Pandas permet de dépasser certaines limitations de NumPy car un DataFrame peut contenir des objets de types différents.
Interagir directement avec les cahiers de laboratoire électroniques. La plupart des cahiers de laboratoire électroniques ont une API qui permet d’interfacer facilement l’application avec un logiciel utilisant Python. Ainsi, la bibliothèque Python elabapi permet d’interagir avec l’API v2 du cahier eLabFTW, et les bibliothèques LabguruPython, elabjournal, rspace-client-python avec les cahiers de laboratoire électronique correspondant. Il est aussi possible de retrouver l’équivalent dans les bibliothèques R, comme par exemple LabguruR ou elabjournal-r.
Les bibliothèques de visualisation de Python
Il y a énormément d’outils de visualisation disponibles sous Python, dont une grande partie d’outils très spécialisés, spécifiques à une communauté. Un outil très utile pour naviguer parmi les bibliothèques existantes est la plateforme PyViz. Elle propose notamment une page d’exemples par sujets ou sous domaines spécifiques. Malgré ce foisonnement, un petit nombre de bibliothèques généralistes permettent de réaliser une grande variété de graphiques.
Les bibliothèques généralistes
- Matplotlib : La bibliothèque matplotlib cherchait à l’origine à répliquer les possibilités de visualisation offertes par MATLAB. C’est une bibliothèque essentielle pour produire des graphiques avec Python. Elle permet de paramétrer énormément d’éléments d’une représentation graphique : tracés de ligne, police, taille, couleur, style, etc. L’objet central créé par matplotlib est la figure. Cette figure est au sommet d’une hiérarchisation de sous-objets : titre, axes, courbes, etc. Ces sous-objets ont eux-mêmes des ramifications : titres des axes, graduations, marqueurs, etc. Ainsi, matplotlib permet aussi bien de tracer des fonctions, que de faire des graphiques courants (histogramme, graphique circulaire, boîtes à moustaches, nuages de points …) en deux ou trois dimensions. Mais si chaque élément d’une figure peut être configuré, c’est parfois au détriment de la simplicité de l’écriture. Pour écrire un code plus simple, d’autres packages peuvent être envisagés
- Seaborn : Pour qui n’a pas besoin de configurer chaque détail d’un graphique, il est possible d’utiliser une bibliothèque telle que Seaborn plutôt que matplotlib directement. Seaborn construit des graphiques directement à partir des données structurées grâce à pandas. Ainsi par exemple, plutôt que d’avoir à entrer soi-même les titres des axes dans le code comme il faut le faire avec matplotlib, seaborn utilise directement les étiquettes de colonnes du DataFrame. Dès que cela est possible, seaborn inclut une représentation de l’intervalle de confiance (à 95% par défaut, mais cela peut être changé).
- Bokeh : Bokeh permet de créer des visualisations interactives, qui peuvent être visualisées via un navigateur web, en permettant d’utiliser du Javascript dans Python sans avoir à écrire directement de Javascript. La bibliothèque fonctionne aussi bien avec des listes, des tableaux NumPy que des DataFrames pandas.
- Plotly : Plotly est, comme Bokeh, une bibliothèque qui permet d’introduire de l’interactivité dans les productions graphiques. Elle est plus polyvalente que Bokeh, dans le sens où elle fonctionne avec Python et R, de même que directement en JavaScript. Elle est aussi plus adaptée aux représentations en 3D.
- Streamlit et Dash : Streamlit et Dash permettent de réaliser des applications web interactives, à partir de graphiques plotly.
Des bibliothèques plus spécialisées
- ASE’s GUI pour la visualisation atomique : ASE, pour Atomic Simulation Environment, est un ensemble d’outils python permettant de réaliser des simulations atomiques, de les analyser et de les visualiser.
- Astropy pour l’astronomie et l’astrophysique : Astropy est un ensemble de bibliothèques utiles en astronomie et en astrophysique
- Biopython pour la biologie et la bioinformatique : Biopython est une bibliothèque qui permet de travailler sur des séquences, comme des séquences de nucléotides ou d’acides aminés.
- NetworkX : La bibliothèque NetworkX permet de représenter des réseaux complexes.
- Nglview pour la bioinformatique : Nglview permet ensuite de visualiser des données de séquences ou de molécules, produites par exemples avec Biopython ou RDKit.
- NMRglue pour la spectroscopie RMN : Cette bibliothèque permet de lire les fichiers Bruker, Pipe, Sparky, Varian et JCAMP. Elle requiert l’installation de NumPy et SciPy, ainsi que de Matplotlib pour la visualisation.
- RDKit pour la chimie informatique : RDKit permet de visualiser des molécules en deux ou trois dimensions. La bibliothèque permet de travailler à partir des représentations de molécules sur le format SMILES (Simplified Molecular-Input Line-Entry System), InChl (International Chemical Identifier) ou MOL. Cette bibliothèque permet aussi d’inclure un certain nombre de métadonnées concernant les molécules et les réactions chimiques concernées dans le fichier produit.
- SunPy : SunPy est une bibliothèque conçue pour analyser des données solaires.
- TomoPy : TomoPy permet de faire de la reconstruction d’images obtenues par tomographie.
- yt : yt permet de visualiser des simulations en astrophysique.
La structure des données dans R
Tout comme en Python, les données peuvent être importées dans R à partir des formats csv, Excel, Google Sheets, JSON ou XML. A la différence de Python, les données sont enregistrées dans R directement sous la forme d’une base de données relationnelle, dans des tableaux de données appelés dataframes.
Focus sur le tidyverse
Pour importer, manipuler et visualiser les données, une norme tend à se répandre dans la communauté R autour du tidyverse. Sont désignées comme « rangées » (tidy), des données organisées en longueur plutôt qu’en largeur. Dans cette perspective, dans une table tidy :
- chaque variable correspond à une colonne
- chaque observation correspond à une ligne
- chaque valeur correspond à une cellule
Le package tidyverse regroupe un ensemble de bibliothèques qui permettent d’une part d’obtenir des données tidy, et d’autre part de les manipuler avec une logique commune.
Importer des données : readr, readxl, xml2, httr, jsonlite, haven, revest
Une multitude de packages du tidyverse permettent d’importer des données à partir d’une grande diversité de formats. Ces données sont importées sous forme de tibbles. Chaque bibliothèque permet de lire et d’écrire un format spécifique :
- readr pour les fichiers tabulaires type csv, avec délimiteur ou à largeur fixe
- readxl pour les fichiers excel
- xml2 pour les fichiers xml et html
- jsonlite pour les fichiers JSON
- haven pour les données provenant d’autres logiciels statistiques comme SAS, SPSS ou STATA.
De plus, il est possible d’importer des données via une API avec le package httr ou via du webscrapping avec le package rvest.
Les outils de visualisation
Les outils de visualisation dans R
Alors que les outils de visualisation de données en Python sont multiples, et doivent être ajoutés via des bibliothèques complémentaires, l’essentiel des visualisations qu’elles permettent sont réalisables dans R avec la bibliothèque ggplot2, qui fait partie du tidyverse.
ggplot2
ggplot2 reproduit la Grammaire des graphiques théorisée par Leland Wilkinson. Le package faisant partie du tidyverse, il s’articule particulièrement bien avec des données organisées en tibbles, mais il fonctionne aussi avec des dataframes.
La polyvalence de ggplot2 tient au fait que les graphiques y sont construits via une succession de couches, ajoutées les unes après les autres, à l’aide du symbole + . Il n’y a donc pas de graphiques prédéfinis. Pour créer un graphique, il faut appeler la fonction ggplot() en lui attribuant comme arguments :
- avec data, l’objet où se trouvent les données
- avec mapping et la fonction aes(), une association entre les variables et les attributs du graphique tels que les axes, la taille des points, leur couleur .
Ensuite, le signe + permet d’ajouter les couches supplémentaires. Son fonctionnement est comparable au pipe %>% ou |>.
Une seule de ces couches est indispensable : geom, qui spécifie le type de graphique (points, courbes, barres …). D’autres couches permettent de spécifier des titres, de modifier les axes, de réaliser des graphiques par sous-groupes (les facettes ou facets), d’ajouter des étiquettes (labels), etc.
ggplot2 ne permet pas de réaliser de graphiques interactifs. Néanmoins, il peut être combiné avec l’utilisation de plotly, grâce à la fonction ggplotly().
Plotly, Bokeh et Shiny pour des graphiques interactifs
plotly est une bibliothèque disponible en R comme en Python. Elle permet de réaliser des graphiques interactifs et de les afficher dans un navigateur web. Il est aussi possible d’utiliser Bokeh avec R, à l’aide du package rbokeh. Shiny, directement dans RStudio, permet d’éditer des applications web. Pour obtenir un aperçu des possibilités de R-Shiny, vous pouvez vous rendre sur la galerie ici.
Quel type de graphique choisir ?
Si vous êtes un peu perdu dans le choix d’un type de visualisation adapté à vos données, un certain nombre d’outils permettent de naviguer entre les différentes possibilités.
- le Catalogue de Visualisation de Données, créé par Severino Ribecca, et disponible en français, en anglais ainsi que quatre autres langues, permet de découvrir une grande variété de types de graphiques, et de les parcourir par fonction.
- le Data Viz Project permet lui aussi de comparer différents types de visualisation par fonction, mais encore par type de données d’input ou même par forme.
- From Data to Viz permet de décider du graphique le plus adapté grâce à différents filtres et un schéma en réseaux. Le site regorge de ressources expliquant comment réaliser des graphiques via R et Python grâce à différentes librairies (dont ggplot2 et plotly).
Ressources en accès ouvert
- Dans un ouvrage disponible sous la forme de bloc-note Jupyter, Scientific Computing for Chemists with Python, Charles J. Weiss explicite le fonctionnement d’un certain nombre de bibliothèques utiles pour les chercheurs en sciences expérimentales.
- Dans Scientific Visualization: Python + Matplotlib, publié en accès ouvert dans HAL, Nicolas P. Rougier, chercheur à l’Inria en neurosciences, décortique l’utilisation de matplotlib. Il est aussi l’auteur de From Python to Numpy et de Python & OpenGL for Scientific Visualization.
- Le manuel en ligne R for Data Science d’Hadley Wickham, Mine Çetinkaya-Rundel, and Garrett Grolemund, permet de maitriser l’essentiel du tidyverse et de R en général.
- ggplot2: Elegant Graphics for Data Analysis, d’Hadley Wickham, Danielle Navarro et Thomas Lin Pedersen, explicite la logique de la Grammaire des graphiques qui est à la base de la production de graphiques dans R.
- Wu, Hsin-Kai, et Priti Shah. « Exploring Visuospatial Thinking in Chemistry Learning ». Science Education, vol. 88, nᵒ 3, mai 2004, p. 465, doi:10.1002/sce.10126.
- En novembre 2023, Python était en première position du TIOBE Index, un classement mensuel de la popularité des langages basé sur alors que et R était classé 19e. De la même façon, le classement RedMonk des langages de programmation, basé sur l’activité sur GitHub et Stack Overflow, classait Python 2ème et R 12ème en janvier 2023.
- Knuth, Donald E., Literate Programming, Center for the Study of Language and Information Lecture Notes, no. 27, 1992, xvi+368p. ISBN 0-937073-80-6