|
|
|
## **(: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
|
|
|
|
|
|
|
|
|