|
|
## :map: méthodes pour tracer des cartes et leurs légendes
|
|
|
## \*\*(⚠ en construction ! 🚧 👷 ) \*\*
|
|
|
|
|
|
Le code proposé ici a été testé avec matplotlib 4 ; avec la version 5 il y a des messages d'erreur suite à l'utilisation de BoundaryNorm, déjà signalés dans les bugfixes.
|
|
|
Le code proposé ici a été testé avec matplotlib 4 ; avec la version 5 il y a des messages d'erreur suite à l'utilisation de BoundaryNorm, déjà signalés dans les bugfixes. (en 2023, on est même à la version 3.6...).
|
|
|
|
|
|
**Objectifs** : tracer une carte à partir de données (x,y,z), définir l'échelle des couleurs et la légende (=customiser la **colormap** et la **colorbar**)
|
|
|
|
|
|
**Objectif avancé (nouveau)** : traiter des données spatiales pour obtenir des objets géométriques (typiquement : isocontours)
|
|
|
|
|
|
**Mots clés** : **matshow** (et **imshow**), **contour et contourf**, **geopandas**, **colormap** (discrétisation ; ListedColormap, BoundaryNorm...), **colorbar**
|
|
|
|
|
|
voir à la fin : références vers la doc
|
... | ... | @@ -17,11 +19,15 @@ voir à la fin : références vers la doc |
|
|
|
|
|
# Résumé des fonctions pour tracer des cartes selon une variable (version non exhaustive ?)
|
|
|
Le [code est disponible sur le repo](https://gitlab.irstea.fr/christine.poulard/atelier-matplotlib/-/blob/master/tests_carto_matrice5x5.py)
|
|
|
|
|
|
Récupérer les calculs : comme pour toute fonction, les fonctions citées ci-dessous renvoient des objets. Pour certains usages, cela peut être intéressant : récupérer la surface pour laquelle la valeur dépasse tel seuil, sous la forme d'un objet géométrique avec ses propriétés...
|
|
|
|
|
|
**Attention aux arguments** :
|
|
|
les arguments **"extent "** et **"origin"** semblent assez logique mais ils sont liés et c'est parfois piégeux : voir [la page dédiée et détaillée, pas si simple](https://matplotlib.org/stable/tutorials/intermediate/imshow_extent.html). Extent = (left, right, bottom, top) ; (left, right) = (gauche, droite), mais :warning: bottom et top correspondent à "bas, haut" dans ce sens... jusqu'à ce que l'on redimensionne avec **set_xlim / set_ylim**: les axes peuvent changer d'orientation...
|
|
|
- localisation des valeurs : par défaut, imshow trace des mailles carrées centrées sur les points de coordonnées entière ; avec extent on définit les coordonnées de la boîte englobante totale (left, right, bottom, top).
|
|
|
- origine : si = upper, la première valeur de la matrice est placée en (left, **top**) ; si = lower, la première valeur de la matrice est en (left, **bottom**)
|
|
|
- taille des vecteurs de coordonnées : pour contourf, on raisonne en POINTS : les matrices des coordonnées X et Y doivent avoir le même nombre d'éléments que la matrice des valeurs (ou le vecteur x autant de points que de colonnes et y de lignes, pour une grille régulière) MAIS pour pcolormesh on raisonne en MAILLES : les vecteurs des coordonnées doivent contenir une valeur de plus - s'il y avait une seule maille l faut bien deux valeurs de x et deux de y pour tracer.
|
|
|
est-ce que la fonction prend des valeurs moyennes centrées sur des mailles, ou des valeurs ponctuelles qui seront interpolées...
|
|
|
|
|
|
`matshow` et `imshow` prennent en entrée des **grilles régulières** de valeurs, `pcolormesh` travaille aussi sur des **grilles irrégulières** donc il demande en plus les coordonnées des sommets des mailles. Les vecteurs des coordonnées sont donc de la dimension du vercteur des valeurs PLUS UN : pour pouvoir encadrer toutes les valeurs - s'il y avait une seule maille il faut bien deux valeurs de x et deux de y pour tracer.
|
|
|
|
|
|
Pour `contourf`, on raisonne en revanche en POINTS : les matrices des coordonnées X et Y doivent avoir le même nombre d'éléments que la matrice des valeurs (grille irrégulière) ou le vecteur x autant de points que de colonnes et y de lignes ( grille rectangulaire régulière).
|
|
|
|
|
|
| MAILLAGE | Fonction | caractéristiques principales (vérifier la doc !) | exemple sur la même matrice (comparez les résultats !) |
|
|
|
|----------|----------|--------------------------------------------------|-------------|
|
... | ... | @@ -31,15 +37,8 @@ ou rectangles réguliers avec extent | matshow (cas particulier de imshow)| repr |
|
|
| PARALLELOGRAMMES même irréguliers | pcolormesh | représenter les valeurs d'une matrice de valeurs par un code couleur sur une grille à mailles rectangulaires ; on définit la grille avec un vecteur des X et un vecteur des Y (rectangles) ou une matrice des X et des Y (parallélogrammes) --- Ici, le premier point étant (0,1) la première valeur de la matrice est en (0,1), en bas à gauche, donc la carte est en miroir de la précédente | ![carte_de_champ_rectangulaire__pcolormesh_](uploads/f0acc3a81d93bc0945ca9a9c435415bf/carte_de_champ_rectangulaire__pcolormesh_.png) |
|
|
|
| IRREGULIER | contour et contourf | interpoler les isolignes à partir des valeurs d'un semis de points ; contour représente les classes par des aplats de couleur, et contourf trace les isolignes (frontières de classe) | ![matrice_vers_isolignes__contourf_](uploads/0a3a241e5f5ade42542a01b4f57d5bf4/matrice_vers_isolignes__contourf_.png) |
|
|
|
| POLYGONES | voir geopandas | colorer les polygones des objets géopandas avec un code couleur défini par une autre colonne de la DataFrame geopandas | en attente |
|
|
|
| DENSITES| 2D Histograms & Hexbin| couleur selon densité de points par mailles | voir doc et [tuto J. VdP](vois)https://jakevdp.github.io/mpl_tutorial/tutorial_pages/tut3.html) |
|
|
|
2D Histograms and Hexbin
|
|
|
| DENSITES| 2D Histograms & Hexbin| couleur selon densité de points par mailles | voir doc et [tuto J. VdP](vois)https://jakevdp.github.io/mpl_tutorial/tutorial_pages/tut3.html) |2D Histograms and Hexbin|
|
|
|
|
|
|
La doc explique la différence entre **matshow** et **imshow** : matshow est une surcharge de imshow ("wrapping") avec les réglages par défaut adaptés au tracé d'une matrice:
|
|
|
-Set origin='upper'.
|
|
|
-Set interpolation='nearest'.
|
|
|
-Set aspect='equal'.
|
|
|
-Ticks are placed to the left and above.
|
|
|
-Ticks are formatted to show integer indices.
|
|
|
|
|
|
# SOMMAIRE
|
|
|
|
... | ... | @@ -60,6 +59,24 @@ La doc explique la différence entre **matshow** et **imshow** : matshow est une |
|
|
|
|
|
_Exemple de carte d'intensité de pluie à partir d'une matrice, avec tracé des rivières et d'un BV ; colormap discrète définie par une liste de couleurs ; on verra dans l'atelier comment faire mieux en discrétisant une colormap continue prédéfinie_
|
|
|
|
|
|
|
|
|
|
|
|
## Imshow et Matshow
|
|
|
Les deux permettent de visualiser les valeurs d'une matrice très rapidement (numéros de ligne et de colonne comme abscisse et ordonnée de 1 à 1, code couleur par défaut) ou avec customisation.
|
|
|
|
|
|
|
|
|
Les arguments **`extent`** et **`origin`** permettent de régler les valeurs des abscisses et ordonnées, pour tracer une carte selon un système de coordonnées par exemple.
|
|
|
- localisation des valeurs : par défaut, imshow trace des mailles carrées centrées sur les points de coordonnées entière ; avec extent on définit les coordonnées de la boîte englobante totale (left, right, bottom, top).
|
|
|
- origine : si = upper, la première valeur de la matrice est placée en (left, **top**) ; si = lower, la première valeur de la matrice est en (left, **bottom**)
|
|
|
- Ils semblent assez logique mais ils sont liés et c'est parfois piégeux : voir [la page dédiée et détaillée, pas si simple](https://matplotlib.org/stable/tutorials/intermediate/imshow_extent.html). Extent = (left, right, bottom, top) ; (left, right) = (gauche, droite), mais :warning: bottom et top correspondent à "bas, haut" dans ce sens... jusqu'à ce que l'on redimensionne avec **set_xlim / set_ylim**: les axes peuvent changer d'orientation...
|
|
|
|
|
|
La doc explique la différence entre **matshow** et **imshow** : matshow est une surcharge de imshow ("wrapping") avec les réglages par défaut adaptés au tracé d'une matrice:
|
|
|
-Set origin='upper'. (la première valeur est placée en haut)
|
|
|
-Set interpolation='nearest'. (pas d'interpolation)
|
|
|
-Set aspect='equal'. (grille carrée)
|
|
|
-Ticks are placed to the left and above.
|
|
|
-Ticks are formatted to show integer indices.
|
|
|
|
|
|
## **Etape 1** : tracer une carte à partir d'une **matrice de valeurs** ("heatmap")
|
|
|
|
|
|
[Sur le REPL.it, une série de cartes simples est proposée](https://replit.com/@CPoulard/LaCartoAvecMplMatshowEtShapely#main.py), on ne travaille qu'avec une petite matrice 5x5 sortie du chapeau . Cela permet néanmoins de voir les bases : \* l'instruction **imshow** pour tracer le champ de valeurs sur une grille (en numéros de ligne et numéros de colonne) \* l'argument **extent** pour tracer avec, par exemple, des coordonnées Lambert \* faire apparaître **une échelle de couleurs et la customiser**.
|
... | ... | |