|
## \*\*(⚠ en construction ! 🚧 👷 ) \*\*
|
|
## \*\*(⚠ en construction ! 🚧 👷 ) \*\*
|
|
|
|
|
|
**Objectifs** :
|
|
**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**)
|
|
|
|
|
|
|
|
**Mots clés** : **matshow** (et **imshow**), **contour et contourf**, **geopandas**, **colormap** (discrétisation ; ListedColormap...), **colorbar**
|
|
|
|
|
|
|
|
**Modules optionnels** : **Shapely**, **pyproj**, **geopandas**, (_**cartopy ?**_)
|
|
|
|
|
|
|
|
**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))
|
|
|
|
- **1.a** affichage sous forme de matrice (abscisses et ordonnées = indices de colonne et de lignes)
|
|
|
|
- **1.b** ajout d'une légende colorimétrique (**colorbar**)
|
|
|
|
- **1.c** affichage de la carte en coordonnées précisées via les xmin, xmax, ymin, ymax (argument **extent=**(gauche, droite, haut, bas))
|
|
|
|
- **1.d** personnalisation de la **colormap** (code couleur) et de la **colorbar** (légende)
|
|
|
|
|
|
|
|
**Etape 2** : lire un fichier **shape** et tracer les lignes ou polygones correspondants avec le module **Shapely**. Variante : avec **geopandas**, un module puissant mais difficile à installer
|
|
|
|
|
|
|
|
**Etape 3** : lire des données (x,y,z) et les représenter par des isolignes
|
|
|
|
|
|
|
|
**Etape 4** : _à venir_ : gestion des projections, modules pyproj et geopandas
|
|
|
|
|
|
* tracer une carte à partir d'une matrice de valeurs ("heatmap"), définir l'échelle des couleurs et la légende (=customiser la **colormap** et la **colorbar**)
|
|
|
|
* lire un fichier **shape** et tracer les lignes ou polygones correspondants avec le module **Shapely**. Variante : avec **geopandas**, un module puissant mais difficile à installer
|
|
|
|
|
|
|
|
**Mots clés** : colormap (discrétisation ; ListedColormap...), colorbar
|
|
|
|
|
|
|
|
<img src="uploads/3495d20090b9fa6f99526442c859cf9b/carte.png" width="240">
|
|
<img src="uploads/3495d20090b9fa6f99526442c859cf9b/carte.png" width="240">
|
|
|
|
|
|
_Exemple de carte d'intensité de pluie 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_
|
|
_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_
|
|
|
|
|
|
|
|
**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**.
|
|
[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**.
|
|
|
|
|
|
Sur ce git, le code est plus complet, et permet de tracer :
|
|
Sur ce git, le code est plus complet, et permet de tracer :
|
... | @@ -19,7 +34,7 @@ Sur ce git, le code est plus complet, et permet de tracer : |
... | @@ -19,7 +34,7 @@ Sur ce git, le code est plus complet, et permet de tracer : |
|
* des champs lus dans un fichier binaire (pour info)
|
|
* des champs lus dans un fichier binaire (pour info)
|
|
* des fichiers shape.
|
|
* des fichiers shape.
|
|
|
|
|
|
## Premier contact avec _plt.matshow_, sur une matrice simple
|
|
## Etape 1.a : Premier contact, afficher une matrice avec _plt.matshow_
|
|
|
|
|
|
Un premier contact avec la méthode **plt.imshow** ou **plt.matshow**, où on passe juste une matrice .
|
|
Un premier contact avec la méthode **plt.imshow** ou **plt.matshow**, où on passe juste une matrice .
|
|
Un bon réflexe : lire la doc !
|
|
Un bon réflexe : lire la doc !
|
... | @@ -55,7 +70,9 @@ Quelques remarques suite à la première figure générée : |
... | @@ -55,7 +70,9 @@ Quelques remarques suite à la première figure générée : |
|
| ![Cartes_Replit_2](uploads/cf23f79e6554fe32fbc2de57eceb3e89/Cartes_Replit_2.PNG) | ![](uploads/7b3cc259ebe50939fce5a65662361842/Cartes_Replit_3.PNG) |
|
|
| ![Cartes_Replit_2](uploads/cf23f79e6554fe32fbc2de57eceb3e89/Cartes_Replit_2.PNG) | ![](uploads/7b3cc259ebe50939fce5a65662361842/Cartes_Replit_3.PNG) |
|
|
|
|
|
|
|
|
|
|
**Etape 2 **: on va ajouter une légende colorimétrique, sans préciser ses propriétés. On en profite pour ajouter un carré orange de côté 1 dont un des sommets est en (0,0), pour matérialiser le décalage entre le pixels et la grille. Note : l'argument 'interpolate' nous permet de choisir entre cette représentation "par pixels" et une représentation lissée.
|
|
**Etape 1.b **: légende colorimétrique
|
|
|
|
|
|
|
|
Dans un premier temps, on va demander à afficher la légende ; comme on n'a pas précisé le code couleur, donc c'est donc un paramétrage "par défaut". On en profite pour ajouter un carré orange de côté 1 dont un des sommets est en (0,0), pour matérialiser le décalage entre le pixels et la grille. Note : l'argument 'interpolate' nous permet de choisir entre cette représentation "par pixels" et une représentation lissée.
|
|
|
|
|
|
```python
|
|
```python
|
|
from matplotlib import pyplot as plt
|
|
from matplotlib import pyplot as plt
|
... | @@ -77,7 +94,10 @@ plt.tick_params(labeltop=False, labelbottom=True) |
... | @@ -77,7 +94,10 @@ plt.tick_params(labeltop=False, labelbottom=True) |
|
fig.show()
|
|
fig.show()
|
|
```
|
|
```
|
|
|
|
|
|
**Etape 3 **: On spécifie les coordonnées des coins grâce à l'argument _extent_. La carte reste visuellement identique mais le repère a changé : les cases coïncident alors avec les mailles de la grille, et l'axe des y prend alors la valeur 0 en bas . Pour bien montrer le changement de repère, on a placé un rectangle défini de la même manière qui n'a pas le même emplacement dans les 2 repères.
|
|
**Etape 1.b **: On spécifie les coordonnées des coins grâce à l'argument _extent_.
|
|
|
|
=========================
|
|
|
|
La carte reste visuellement identique mais le repère a changé : les cases coïncident alors avec les mailles de la grille, et l'axe des y prend alors la valeur 0 en bas . Pour bien montrer le changement de repère, on a placé un rectangle défini de la même manière qui n'a pas le même emplacement dans les 2 repères.
|
|
|
|
Voir aussi l'argument **origin** qui peut être utile.
|
|
|
|
|
|
```python
|
|
```python
|
|
fig = plt.figure("D'une matrice à une carte de champ")
|
|
fig = plt.figure("D'une matrice à une carte de champ")
|
... | @@ -95,7 +115,7 @@ plt.tick_params(labeltop=False, labelbottom=True) |
... | @@ -95,7 +115,7 @@ plt.tick_params(labeltop=False, labelbottom=True) |
|
fig.show()
|
|
fig.show()
|
|
```
|
|
```
|
|
|
|
|
|
**Etape 4 **: personnaliser l'échelle colorimétrique et la légende correspondante
|
|
**Etape 1.d **: personnaliser l'échelle colorimétrique et la légende correspondante
|
|
On peut personnaliser le code couleur, en imposant les couleurs et les limites de classe, et la légende, en formatant les valeurs ou en ajoutant un titre par exemple.
|
|
On peut personnaliser le code couleur, en imposant les couleurs et les limites de classe, et la légende, en formatant les valeurs ou en ajoutant un titre par exemple.
|
|
|
|
|
|
| 4) on peut définir une colormap par une liste de couleurs, et spécifier des limites de classe ; notez les classes pour "-200 et moins" ou "500 et plus" | 5) quand c'est préférable, on peut partir d'une échelle colorimétrique continue que l'on va découper en N classes. Il reste possible de la modifier couleur par couleur. |
|
|
| 4) on peut définir une colormap par une liste de couleurs, et spécifier des limites de classe ; notez les classes pour "-200 et moins" ou "500 et plus" | 5) quand c'est préférable, on peut partir d'une échelle colorimétrique continue que l'on va découper en N classes. Il reste possible de la modifier couleur par couleur. |
|
... | @@ -152,7 +172,12 @@ plt.tick_params(labeltop=False, labelbottom=True) |
... | @@ -152,7 +172,12 @@ plt.tick_params(labeltop=False, labelbottom=True) |
|
fig.show()
|
|
fig.show()
|
|
```
|
|
```
|
|
|
|
|
|
## Travailler avec des vrais fichiers de champs et des shapes
|
|
## **Etape 2** : Lire et tracer des shapes
|
|
|
|
=================
|
|
|
|
Lire des fichiers *shape**, issus de SIG comme QGis (plusieurs fichiers dont un avec l'extension *.shp) est utile indépendamment ou avec une représentation de champs de valeur, pour laquelle ils serviront au minimum de points de repère.
|
|
|
|
|
|
|
|
## **Etape 2.a** : Lire des fichiers shape "seuls"
|
|
|
|
Travailler avec des vrais fichiers de champs et des shapes
|
|
|
|
|
|
Dans le code, on trouve :
|
|
Dans le code, on trouve :
|
|
|
|
|
... | | ... | |