Skip to content
GitLab
Projects Groups Topics Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Register
  • Sign in
  • PYTHON - Atelier MatPlotLib PYTHON - Atelier MatPlotLib
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributor statistics
    • Graph
    • Compare revisions
  • Issues 0
    • Issues 0
    • List
    • Boards
    • Service Desk
    • Milestones
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Terraform modules
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar

La forge institutionnelle d'INRAE étant en production depuis le 10 juin 2025, nous vous recommandons d'y créer tous vos nouveaux projets.

  • Poulard Christine
  • PYTHON - Atelier MatPlotLibPYTHON - Atelier MatPlotLib
  • Wiki
  • Atelier_D_carte

Atelier_D_carte · Changes

Page history
Update Atelier_D_carte authored Apr 19, 2021 by Poulard Christine's avatar Poulard Christine
Show whitespace changes
Inline Side-by-side
Atelier_D_carte.md 0 → 100644
View page @ 34a51df9
## **(:warning: en construction ! :construction: :construction_worker: ) **
## Premier contact avec *plt.matshow*, sur une matrice simple
Un premier contact avec la méthode plt.imshow ou plt.matshow, où on passe juste une matrice (ici, une liste de listes).
```python
from matplotlib import pyplot as plt
plt.matshow([[1, 2, 30, 50, 120], [21, 2, 50, 50, 90], [-1, 2, -30, 50, -120], [41, 42, 80, 50, 50], [9, 29, 39, 590, 10]])
plt.show()
```
Quelques remarques :
* valeurs centrées sur les points de la grille => on préfèrerait 1 carré = 1 pixel
* voir l'échelle colorimétrique ?
* comment customiser l’échelle ?
* changer l’échelle pour des coordonnées géoréférencées ? (par ex. Lambert)
On va d'abord s'occuper de l'échelle colorimétrique.
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
from matplotlib import pyplot as plt
from matplotlib.patches import Rectangle
fig = plt.figure("D'une matrice à une carte de champ")
ax = fig.add_subplot(111)
ax.set_title("défaut : centres des pixels \n sur les points de grille")
cax = ax.matshow([[1, 2, 30, 50, 120], [21, 2, 50, 50, 90], [-1, 2, -30, 50, -120], [41, 42, 80, 50, 50], [9, 29, 39, 590, 10]])
case_en_haut_a_gauche = Rectangle((0, 0), width=1, height=1, lw=2, edgecolor='orange',
facecolor='None')
ax.add_patch(case_en_haut_a_gauche)
#deux instructions pour définir la représentation de l'échelle colorimétrique et son titre
cbar = fig.colorbar(cax, ax=ax, extend='both')
cbar.set_label('colorbar par défaut ' )
plt.tick_params(labeltop=False, labelbottom=True)
fig.show()
```
Ensuite, on utilise tout simplement l'argument *extent* pour définir des coordonnées
```python
fig = plt.figure("D'une matrice à une carte de champ")
ax = fig.add_subplot(111)
ax.set_title("avec extent : on définit les coordoonnées extrêmes")
left, right, bottom, top = 0, 5, 0, 5
cax = ax.matshow([[1, 2, 30, 50, 120], [21, 2, 50, 50, 90], [-1, 2, -30, 50, -120], [41, 42, 80, 50, 50], [9, 29, 39, 590, 10]], extent=(left, right, bottom, top))
ax.add_patch(Rectangle((0, 0), width=1, height=1, lw=2, edgecolor='orange',
facecolor='None'))
cbar = fig.colorbar(cax, ax=ax, extend='both')
cbar.set_label('colorbar par défaut ' )
plt.tick_params(labeltop=False, labelbottom=True)
fig.show()
```
## Personnaliser l'échelle colorimétrique
Avec une liste de couleurs définies par l'utilisateur, objet ListedColorMaps.
Je choisis aussi les limites de classe avec bounds.
```python
from matplotlib.colors import ListedColormap as mpl_colors_ListedColormap
cmap = mpl_colors_ListedColormap(
['white', 'greenyellow', 'limegreen', 'aquamarine', 'cyan', 'blue', 'purple'])
cmap.set_under('gray')
cmap.set_over('red')
cbounds = [-200, -50, -5, 0, 5, 50, 200, 500]
norm = mpl.colors.BoundaryNorm(cbounds, cmap.N)
fig = plt.figure("")
ax = fig.add_subplot(111)
ax.set_title("colorbar = 7 couleurs nommées, plus over et under")
cax = ax.matshow([[1, 2, 30, 50, 120], [21, 2, 50, 50, 90], [-1, 2, -30, 50, -120], [41, 42, 80, 50, 50], [9, 29, 39, 590, 10]], extent=(0, 5, 0, 5), cmap=cmap,norm=norm)
cbar = fig.colorbar(cax, ax=ax, extend='both')
cbar.set_label('colorbar définie par ListedColorMap ' )
plt.tick_params(labeltop=False, labelbottom=True)
fig.show()
```
En m'appuyant sur une colormap continue, dont je peux aussi comme précédemment forcer le découpage avec bounds (mais je ne maîtrise pas les nuances de couleurs dans chaque classe)
définies par l'utilisateur, objet ListedColorMaps.
Je choisis aussi les limites de classe avec bounds.
https://matplotlib.org/3.1.1/gallery/color/colormap_reference.html
```python
from matplotlib.colors import ListedColormap as mpl_colors_ListedColormap
import numpy as np
from matplotlib import cm # colormap
nb_couleurs = 7 # en combien de parties je découpe mon échelle colorimétrique
viridis = cm.get_cmap('viridis_r', nb_couleurs) # _r signifie que je prends l'échelle dans l'ordre inverse, ici clair vers sombre
echelle_colorimetrique = viridis(
np.linspace(0, 1, nb_couleurs)) # j'extrais des couleurs discrètes
vecteur_blanc = np.array([1, 1, 1, 1])
echelle_colorimetrique[:1,:] = vecteur_blanc # je remplace la première couleur par du blanc (défini en RGB) : 0 ou 1 ?...
cmap = mpl_colors_ListedColormap(
echelle_colorimetrique) # je crée la colormap à partir de l'échelle colorimétrique
cmap.set_under('gray') # en dessous de la limite min : gris
cmap.set_over('red') #
cbounds = [-200, -50, -5, 0, 5, 50, 200, 500]
norm = mpl.colors.BoundaryNorm(cbounds, cmap.N)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_title("Echelle discrète créée à partir de la cmap viridis-reverse")
cax = ax.matshow([[1, 2, 30, 50, 120], [21, 2, 50, 50, 90], [-1, 2, -30, 50, -120], [41, 42, 80, 50, 50], [9, 29, 39, 590, 10]], extent=(0, 5, 0, 5), cmap=cmap,norm=norm)
cbar = fig.colorbar(cax, ax=ax, extend='both')
cbar.set_label('colorbar définie par ListedColorMap plus under et over' )
plt.tick_params(labeltop=False, labelbottom=True)
fig.show()
```
## Lire un fichier grid et le tracer
## Lire un fichier de champ binaire et le tracer
## Lire des fichiers shape et les tracer : classe "ObjetsShape"
## Inclure sur une même figure des champs et des polygones issus de fichiers shape
Clone repository
  • AtelierB1_Graphiques_simples
  • AtelierB2_Lire_un_fichier
  • AtelierC
  • Atelier_D_carte
  • Atelier_D_carte_a_partir_de_fichiers_binaires
  • Atelier_E_longues_series
  • Atelier_G_widgets
  • Atelier_clic_afficher
  • Atelier_clics
  • Cartes focus sur le redimensionnement
  • GUI avec QT
  • La doc avec Sphinx
  • Lexique
  • Point Théorie Subplots
  • Pour les contributeurs
View All Pages