... | ... | @@ -9,8 +9,7 @@ Objectif : connaître la méthode **scatter** et en particulier : |
|
|
- les méthodes pour updater une courbe de type scatter (set_data, set_facecolors...)
|
|
|
- pistes pour créer une légende détaillée (faisant figurer le code couleur et/ou la taille des symboles)
|
|
|
|
|
|
Objectif secondaire : point sur les *colormaps* et sur les *colorbars*
|
|
|
[voir ce tuto de la doc pour customiser une colormap](https://matplotlib.org/stable/tutorials/colors/colorbar_only.html)
|
|
|
Objectif secondaire : point sur les _colormaps_ et sur les _colorbars_ [voir ce tuto de la doc pour customiser une colormap](https://matplotlib.org/stable/tutorials/colors/colorbar_only.html)
|
|
|
|
|
|
### Présentation et comparaison avec la méthode plot
|
|
|
|
... | ... | @@ -58,25 +57,53 @@ plt.show() |
|
|
|
|
|
On va créer un code couleur de plusieurs façons ; on va en détailler 2 :
|
|
|
|
|
|
a) au plus simple, on désigne juste un vecteur dont les valeurs vont être traduites en couleurs selon une colormap : code ci-dessous.
|
|
|
b) comme dans l'atelier B, on va définir par un dictionnaire une correspondance numéro de mois => couleur
|
|
|
a) au plus simple, on désigne juste un vecteur dont les valeurs vont être traduites en couleurs selon une colormap : code ci-dessous. b) comme dans l'atelier B, on va définir par un dictionnaire une correspondance numéro de mois => couleur
|
|
|
|
|
|
On en profite pour faire varier également la taille ; on définit le vecteur des tailles par une opération sur l'année. Grâce à l'argument **year** on peut facilement récupérer le numéro d'année d'un vecteur de dates
|
|
|
|
|
|
** Code de l'exemple 2.a **
|
|
|
\*\* Code de l'exemple 2.a \*\*
|
|
|
|
|
|
```python
|
|
|
plt.plot(dates, liste_mois, c='grey')
|
|
|
plt.scatter(dates, liste_mois, c=liste_mois, s=[4*(date.year - 1990) for date in dates], cmap='viridis')
|
|
|
|
|
|
plt.show()
|
|
|
```
|
|
|
... et pour ajouter une colorbar continue ;
|
|
|
|
|
|
### ajouter une colorbar continue :
|
|
|
|
|
|
```python
|
|
|
cax = plt.scatter(dates, liste_mois, c=liste_mois, s=[4 * (date.year - 1990) for date in dates], cmap='viridis')
|
|
|
plt.colorbar(cax)
|
|
|
```python
|
|
|
```
|
|
|
|
|
|
### ajouter une colorbar discrète définie par un dictionnaire
|
|
|
|
|
|
On suppose ici que l'on va choisir a priori une correspondance entre valeurs et couleurs. Attention, ce n'est pas forcément une "bonne pratique" pour représenter des valeurs continues, mais cela peut se défendre si on a des catégories qui peuvent être liées à des couleurs. Ici on décide que l'hiver c'est gris, le printemps vert, l'été orange et l'automne bleu. Ca reste subjectif. On va donc d'abord créer un dictionnaire, en fait on reprend celui de l'atelier C, puis on transforme les valeurs en liste de couleurs. Ensuite, il faudra préciser dans la variable "bounds" que les "fourchettes" de valeurs sont centrées sur les entiers. En fait, le problème des limites est toujours de savoir laquelle est "incluse" et laquelle est "exclue". Avec des entiers, on peut se permettre de définir les limites entre les valeurs entières pour lever les ambiguités. Mais vous pouvez jouer avec les valeurs pour voir...
|
|
|
| header | ListedColorMap : colormap discrète définie par une liste |
|
|
|
|--------|----------------------------------------------------------|
|
|
|
| cell | cell |
|
|
|
| cell | cell |
|
|
|
|
|
|
```python
|
|
|
DICO_COULEURS_MOIS = {1: "dimgrey", 2: "black", 3: "palegreen", 4: 'mediumspringgreen', 5: 'forestgreen', 6: 'gold', 7: 'orange',
|
|
|
8:'orangered', 9:'deepskyblue', 10:'royalblue', 11:'navy', 12:'silver'}
|
|
|
DICO_COULEURS_MOIS = {1: "dimgrey", 2: "black", 3: "palegreen", 4: 'mediumspringgreen', 5: 'forestgreen', 6: 'gold', 7: 'orange', 8:'orangered', 9:'deepskyblue', 10:'royalblue', 11:'navy', 12:'silver'}
|
|
|
|
|
|
# on place les valeurs du dictionnaire dans une liste de couleurs
|
|
|
cmap = colors.ListedColormap(list(DICO_COULEURS_MOIS.values()))
|
|
|
# on définit les limites de classe ; ici pour être sûr du résultat on place les limites entre les entiers et en plus ça permettra de bien tracer l'échelle ;
|
|
|
# avec np.arange on crée un vecteur de 0.5 inclus à 13 exclu par pas de 1:
|
|
|
bounds =np.arange(0.5,13,1)
|
|
|
norm = colors.BoundaryNorm(bounds, cmap.N) # cmap.N = nb de couleurs de cmap
|
|
|
plt.scatter(dates, liste_mois, c=liste_mois, cmap=cmap, norm=norm, s=[4 * (date.year - 1990) for date in dates], edgecolor='none')
|
|
|
|
|
|
# on place les ticks de 1 à 12 (13 exclus) ; les limites de classe sont issues de bounds
|
|
|
cbar = plt.colorbar(ticks=range(1,13), label="code couleur des mois")
|
|
|
|
|
|
# facultatif : autre moyen d'écrire une légende customisée, en définissant la localisation du texte (= les 5 premières lettres de la couleur)
|
|
|
for mois in range(1,13):
|
|
|
cbar.ax.text(1.5, mois, f"{DICO_COULEURS_MOIS[mois][0:5]}", ha='center', va='center')
|
|
|
plt.title("test 4")
|
|
|
plt.show()
|
|
|
```
|
|
|
|
|
|
![test_scatter_4](uploads/cf3e97051da614bed3e2e4b93f88062d/test_scatter_4.png) |
|
|
\ No newline at end of file |