|
|
## Présentation des "ateliers" et "focus" Matplotlib et des pages dédiées :chart_with_upwards_trend:
|
|
|
|
|
|
* pourquoi Matplotlib: c'est la bibliothèque "historique" de Python, riche d'une forte communauté et de très bon "wrappers" (seaborn), même si d'autres modules sont prometteurs pour des usages spécifiques
|
|
|
* le principe de l'Atelier 2021, et ses documents
|
|
|
* ateliers disponibles : points traités et exemple de sortie
|
|
|
* [commentaires sur la version 3.5 sortie en novembre 2021](version%203.5)
|
|
|
|
|
|
:construction_site: à venir : une 'galerie' pour voir les graphiques proposés, avec les mots-clefs associés. En attendant cette galerie pour pour mieux cibler les pages correspondant à un besoin, le [readme](https://gitlab.irstea.fr/christine.poulard/atelier-matplotlib/-/blob/master/README.md) et le plan ci-dessous, sous forme de tableau, vous donneront une idée des principaux exemples.
|
|
|
|
|
|
### pourquoi Matplotlib, la bibliothèque "historique" de Python
|
|
|
|
|
|
Matplotlib n'est pas la seule bibliothèque graphique de Python, mais c'est sans doute la plus utilisée, donc avec une grande communauté, et elle est 100% Python (plein accès au code). Elle a une [**documentation complète, structurée et et tenue à jour**](https://matplotlib.org/), qu'il faut consulter en priorité ; elle manque parfois d'exemples d'utilisation, il faut alors chercher des explications et des illustrations ailleurs, [dans des cours, des tutos](Tutographie) ou des forums. Pour des données multimensionnelles, vous utiliserez peut-être Seaborn, et pour réaliser des cartes en tenant compte des systèmes de projection il y a Geopandas et Cartopy : tous sont des "wrappers" de Matplotlib, c'est-à-dire des interfaces qui proposent des syntaxes pratiques et se chargent de les transcrire en instructions matplotib. Il est donc intéressant de connaître matplotlib pour ajuster des graphiques faits avec tous les wrappers. Elle reste une bonne bibliothèque pour prendre pied dans les visualisation. NB : comme matplotlib est utilisé comme base pour le "méta-package" Plots\* en Julia le temps d'apprentissage n'est pas perdu même si vous passez à Julia (éventuellement, ce wiki sera élargi à Julia, un jour...).
|
|
|
|
|
|
Il existe maintenant des alternatives plus rapides, plus spécialisées, qui sont meilleures au niveau de l'interactivité et de la réactivité (animations, mise à jour en continu...), mais elles ne sont pas aussi complètes, et ne bénéficient pas de la même communauté de développeurs et d'utilisateurs que Matplotlib. Par ailleurs, Matplotlib continue aussi à évoluer.
|
|
|
|
|
|
Le [site Pyviz, consacré à la visualisation](https://pyviz.org/) fournit beaucoup d'informations sur les différentes solutions de visualisation, avec une très bonne [page de synthèse](https://pyviz.org/overviews/index.html) reprenant le schéma de J. Vanderplas qui cartographie les bibliothèques selon leurs "moteurs" (Python, javascript, D3js, OpenGL), et les liens entre elles.
|
|
|
|
|
|
Pour des données multimensionnelles, on citera _Altair_, basé sur le D3js. Bokeh utilise les navigateurs ; il est particulièrement intéressant pour les "dashboard" et pour être intégré à des pages internets. Plotly est très bon pour les graphiques interactifs.
|
|
|
|
|
|
Il serait intéressant de faire par la suite un fork de cet atelier avec Plotly ou Bokeh ou PyQtGraph... ou le projet [vispy](https://vispy.org/) (à ne pas confondre avec Pyviz...) basé sur l'openGL qui regroupera des éléments de plusieurs modules (PyQTGraph, glumpy...) mais il est encore en développement.
|
|
|
|
|
|
## "Atelier Python Matplotlib 2021"
|
|
|
|
|
|
### alternance de pratique et de théorie à suivre lors de sessions encadrées ou en autonomie
|
|
|
|
|
|
**En complément à la doc et aux nombreux tutos** dont certains sont excellents (voir [onglet "tutographie"](Tutographie)) il s'agit ici de découvrir matplotlib au travers d'applications de nos équipes (actuellement : chroniques de valeurs, champs de valeurs...). On insistera sur les points qui ont posé des difficultés, même si éventuellement cela ne semblait pas être du tout quelque chose de difficile (maintenir les étiquettes de dates de l'axe des x lisibles quel que soit le zoom ; construire une légende qui ne masque pas les courbes, et qui soit complète même avec des variables de natures différentes tracées avec un autre axe des y ou dans des vignettes différentes...).
|
|
|
|
|
|
Certaines pages présentent des "Ateliers" avec une démarche qui part d'un cas simple et ajoute des difficultés une à une ; ils sont référencés par des lettres. D'autres font le point sur une difficulté précise, pour garder une trace de tests effectués pour de "vrais" codes ; c'est le cas de l'[Atelier "clic"](Atelier_clics) et de l'addendum à l'atelier Carte, avec le cas des zooms. Pour que ces pages soient utilisables facilement, il faudrait un lexique des notions abordées ; en attendant, vous trouverez en en-tête des pages une liste des notions principales et secondaires.
|
|
|
|
|
|
Ce wiki est en évolution, des illustrations sont ajoutées au fur et à mesure. D'autres pages seront ajoutées, et la todo list comprend bien sûr une "galerie" pour aller voir les réalisations des uns et des autres et y piocher des idées et des solutions.
|
|
|
|
|
|
N'hésitez pas à faire part de vos questions, remarques et suggestions aux auteurs, _contributions bienvenues_ également.
|
|
|
|
|
|
#### Prérequis
|
|
|
|
|
|
connaître au moins les bases d'un langage de programmation (boucles, tests, notions d'objet...)
|
|
|
|
|
|
**Installer Python 3**, avec les modules supplémentaires matplotlib, pandas, Pathlib (à vérifier). facultatifs : pickle
|
|
|
|
|
|
Installer la distribution Anaconda permet de tout avoir en une opération.
|
|
|
|
|
|
A propos de l'épineux problème des **versions** : ce qui "marche" pour la version que vous utilisez en développement ne fonctionnera pas forcément pour un module plus ancien... et pas forcément non plus pour les versions plus récentes ! !
|
|
|
En particulier, Matplotlib est passé en 2021 de passer d'une version 3.4 à 3.5 : des modifications importantes ont été apportées. Globalement, la 3.5 devrait vous faciliter la vie, mais des codes plus anciens risquent de coincer si vous les exécutez en important une 3.5...
|
|
|
|
|
|
**Installer un environnement** de développement (IDE): j'utiliserai PyCharm, mais si vous préférez vous pourrez utiliser Spyder (avec Anaconda) ,VisualStudio. IDLE, JupyterLab et Jupyter Notebook sont des choix possibles pour tester, mais ne permettent pas de tout faire aussi facilement. Si vous n'utilisez pas pyCharm, faites quelques tests avant (définir des variables dans la console...).
|
|
|
|
|
|
#### Ressources complémentaires
|
|
|
|
|
|
Diaporama, jeux de données et documents complémentaires <https://gitlab.irstea.fr/christine.poulard/atelier-matplotlib> Vous pouvez aussi jouer avec vos propres données : préparez des fonctions de lecture pour les vôtres (liste des x et des y, ou numpy, ou pandas.Series ou DF).
|
|
|
|
|
|
Quelques bouts code de "démo" en ligne :<https://replit.com/@CPoulard/>
|
|
|
|
|
|
Enfin, les sites de référence qui expliquent non seulement comment, mais surtout pourquoi on fait comme ça : [Tutographie !](Tutographie).
|
|
|
|
|
|
## Plan de l'atelier 2021
|
|
|
|
|
|
La numérotation est critiquable et sera sans doute revue; la logique était d'aller du plus simple au plus compliqué... sauf que cela devient faux dès que l'on rajoute un exemple.
|
|
|
|
|
|
### Pour bien débuter :[Instructions de base ; manipulation dans la console](Python_%20quelques%20bases)
|
|
|
|
|
|
### Les ateliers
|
|
|
|
|
|
Les exemples suivants sont tirés de nos activités (chroniques de valeurs, champs de valeurs...).
|
|
|
|
|
|
<table>
|
|
|
<tr>
|
|
|
<th>Atelier</th>
|
|
|
<th>Exemple</th>
|
|
|
<th>Notions centrales & additionnelles</th>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>B) Atelier 1 : Un premier graphique, avec un axe des x et un axe des y</td>
|
|
|
<td>
|
|
|
|
|
|
![AtelierB1_PremiereFigure](uploads/4814f2260d6243b457d1c05706167d44/AtelierB1_PremiereFigure.png)
|
|
|
</td>
|
|
|
<td>
|
|
|
|
|
|
_voir repl en ligne_ <https://replit.com/@CPoulard/> , "Plotting long time-series"
|
|
|
</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>
|
|
|
|
|
|
[B1) Un premier graphe très simple](/christine.poulard/atelier-matplotlib/-/wikis/AtelierB1_Graphiques_simples) entrée en matière
|
|
|
</td>
|
|
|
<td>
|
|
|
|
|
|
![Fig1_graphique_basique2](uploads/b8cbe463f1de72fce4a7825e44704559/Fig1_graphique_basique2.png)
|
|
|
</td>
|
|
|
<td>syntaxe simple avec "plt" : plt.plot(), plt.xlabel(), plt(ylim), plt.title... ; arguments label, lw, marker='\*', color, ls, fontsize...)</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>
|
|
|
|
|
|
[B2) lire un fichier texte et extraire l'information (="parser")](/christine.poulard/atelier-matplotlib/-/wikis/Atelier1_2)
|
|
|
</td>
|
|
|
<td>
|
|
|
|
|
|
![FigureB2_feuilledestyle](uploads/5315b3712be9191c3d5c28498618cdf3/FigureB2_feuilledestyle.PNG)
|
|
|
</td>
|
|
|
<td>modules pathlib et datetime ; tkinter.askopenfilename() ; Path.is_file() ; with open(nom_fichier, 'r') as fichier ; fichier.readline() ; chaine.split(); dictionnaires dict(), clé et valeurs ; feuilles de style (via rc_params)</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>
|
|
|
|
|
|
[C) Atelier 2 : un graphique avec un 2e axe des y ; les objets d'une figure](/christine.poulard/atelier-matplotlib/-/wikis/AtelierC) : représenter des variables de nature différente. Problème : créer une 2e courbe avec un 2e axe des y ; partager un même axe des x sur deux vignettes différentes, obtenir une légende avec toutes les variables.
|
|
|
</td>
|
|
|
<td>
|
|
|
|
|
|
![Figure_3_graphique_PTQ_subplots](uploads/31dcb119ac7b2e3521a9a7b831010756/Figure_3_graphique_PTQ_subplots.png)
|
|
|
</td>
|
|
|
<td>Définitions "objet" de Figure et Axes ; ax2= ax1.twinx() pour créer une vignette partageant le même axe des x ; créer et organiser plusieurs vignettes selon une grille avec subplots, arguments nrows et ncols ; sharex=True pour jumeler des vignettes. Différence entre légende d'Axes et de Figure. Créer une légende de toutes pièces (voir illustration en tête de page).</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>
|
|
|
|
|
|
[D) Atelier 3 : pour changer, une carte ('heatmap') à partir d'une matrice, avec sa colormap](/christine.poulard/atelier-matplotlib/-/wikis/Atelier_D_carte) ; avec quelques imports/exports entre mpl et QGis
|
|
|
</td>
|
|
|
<td>
|
|
|
|
|
|
![carte](uploads/3495d20090b9fa6f99526442c859cf9b/carte.png)
|
|
|
</td>
|
|
|
<td>lecture et tracé des shapes (ici, sans geopandas) ; représentation d'une matrice avec imshow; notion de colormap ; customisation d'une colorbar discrète par une liste de couleurs ou par discrétisation d'une colormap continue ; page spéciale "zooms"</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>
|
|
|
|
|
|
[E) Atelier 4 : on revient au traitement de chroniques, dans le cas de longues séries](Atelier_E_longues_series) : amélioration de l'affichage des étiquettes de date sans pandas ; on pourra travailler avec le fichier de l'atelier 1 et/ou un fichier binaire
|
|
|
</td>
|
|
|
<td>
|
|
|
|
|
|
</td>
|
|
|
<td>problèmes spécifiques des longues séries (cette section sera étoffée si besoin exprimé)</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>
|
|
|
|
|
|
**NIVEAU AVANCE**
|
|
|
</td>
|
|
|
<td>
|
|
|
|
|
|
**interactions : événements et WIDGETS**
|
|
|
</td>
|
|
|
<td>
|
|
|
|
|
|
</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>
|
|
|
|
|
|
[Atelier événement : notion d'événement, de callback ; mise à jour d'un graphique ](Atelier_clics): exemple d'un "clic sur un graphique" qui va donner des infos sur le point le plus proche
|
|
|
</td>
|
|
|
<td>
|
|
|
|
|
|
![selection_point_mouseclick_2courbes](uploads/197d80a53567be4fb1ec3f375240f1ad/selection_point_mouseclick_2courbes.png)
|
|
|
</td>
|
|
|
<td>événement, liaison événement fonction ; exemples de MouseEvent et PickEvent ; identification du point le plus proche par distances "en unités du graphiques" et "en unité écran" ; widget Textbox</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>
|
|
|
|
|
|
[F) Atelier 5 : widgets et prétraitement de longues chroniques avant visualisation ](Atelier_F_pretraitement): adaptation de la résolution
|
|
|
</td>
|
|
|
<td>
|
|
|
|
|
|
![PresentationVisuSerieDynamique](uploads/bfd9cfbd308afc6ff7455467f650ab64/PresentationVisuSerieDynamique.png)
|
|
|
</td>
|
|
|
<td>pandas et rééchantillonnage, surcharge des outils de la barre d'outils</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>
|
|
|
|
|
|
[G) Atelier 6 : les widgets de matplotlib : slider et checkbutton](Atelier_G_widgets) : plusieurs exemples de difficulté croissante mais plus simple que le F ;
|
|
|
</td>
|
|
|
<td>
|
|
|
|
|
|
![AtelierG_widgetsEtBoutonsToolbar](uploads/9b805cf3cb4d2d384c7f07b7e19270f1/AtelierG_widgetsEtBoutonsToolbar.png)
|
|
|
</td>
|
|
|
<td>widgets "moins bien que ceux de Tkinter mais pouvant rendre service, modification des objets de matpotlib, ajout d'outils à la barre d'outils</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>
|
|
|
|
|
|
**TODO LIST ?**
|
|
|
</td>
|
|
|
<td>
|
|
|
|
|
|
**selon besoins exprimés**
|
|
|
</td>
|
|
|
<td>
|
|
|
|
|
|
</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>
|
|
|
|
|
|
utilisation d'objets créés par matplotlib pour calculs géométriques (ici, attributs aire et périmètre de polygones)
|
|
|
</td>
|
|
|
<td>
|
|
|
|
|
|
![Section95_Z311](uploads/abe6438f0e6e81a3cae3e7e0ed57c953/Section95_Z311.png)
|
|
|
</td>
|
|
|
<td>
|
|
|
|
|
|
code inclus dans ST2shape, pour test au service de l'interface Pamhyr en Python :
|
|
|
|
|
|
polygone_zone_en_eau = ax_st.fill_between(x_section, y1=z_eau, y2=z_section, where=z_eau>z_section, interpolate=True)
|
|
|
</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>ggplots, grammar of graphics</td>
|
|
|
<td>
|
|
|
|
|
|
![seaborn](uploads/c563f1ad5b213f49932b80d747208d6b/seaborn.png)
|
|
|
</td>
|
|
|
<td>
|
|
|
|
|
|
petite initiation en cheminant avec le Mooc MachineLearning [premiers pas dans seaborn](focus%20seaborn)
|
|
|
</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>animations (pas encore fait !)</td>
|
|
|
<td>
|
|
|
|
|
|
![sinus](uploads/6b255e402801141e260dd0b2c479a2eb/sinus.gif)
|
|
|
</td>
|
|
|
<td>mpl permet de générer des animations (animate) mais ici on triche avec un exemple en Julia (avec @gif, tuto M. Herbst)</td>
|
|
|
</tr>
|
|
|
</table> |
|
|
\ No newline at end of file |