... | ... | @@ -77,13 +77,34 @@ cax = plt.scatter(dates, liste_mois, c=liste_mois, s=[4 * (date.year - 1990) for |
|
|
plt.colorbar(cax)
|
|
|
```
|
|
|
|
|
|
\###discrétiser la colorbar continue Ici, plutôt qu'une légende de couleurs continue, on voudrait marquer la correspondance valeur/classe. On va donc définir des limites de classe avec **bounds** et **norms** En première intention, on pensera sans doute à définir des limites commençant aux valeurs entières : \[1,2,3,...,12\] ; soit en Python range(1,13). Cependant, pour avoir une légende avec des classes centrées sur les valeurs entières, on propose de décaler les limites des classes d'un demi, en écrivant par exemple np.arange(0.5, 13, 1). On a choisi la colormap **rainbow**, vous pouvez en tester d'autres.
|
|
|
|
|
|
En fait, ici c'est **BoundaryNorm** qui paraît faire tout le travail :
|
|
|
|
|
|
- on ne discrétise pas la colormap directement, on ne sait même pas combien elle a de classes : on utilisera juste l'argument cmap.N dont BoundaryNorm a besoin
|
|
|
- la liste des limites de classes, notée habituellement **bounds** est ici simplement passée comme argument à BoundaryNorm, et ce sont ces limites qui vont déterminer le nombre de classes ; on peut passer par une variable intermédiaire pour être plus lisible
|
|
|
- BoundaryNorm renvoie une "norme" qu'il faut ensuite passer comme argument à scatter, avec la colormap
|
|
|
|
|
|
```python
|
|
|
from matplotlib import colors
|
|
|
cmap = plt.cm.rainbow
|
|
|
|
|
|
# norm = colors.BoundaryNorm(np.arange(1, 13, 1), cmap.N) # testez pour comparer
|
|
|
norm = colors.BoundaryNorm(np.arange(0.5, 13, 1), cmap.N) # ici les classes sont centrées sur les valeurs entières
|
|
|
|
|
|
plt.scatter(dates, liste_mois, c=liste_mois, cmap=cmap, norm=norm, s=[4 * (date.year - 1990) for date in dates], edgecolor='none')
|
|
|
plt.colorbar(ticks=range(1,13))
|
|
|
plt.title("test 3 : cmap discrète à partir de 'rainbow'")
|
|
|
plt.show()
|
|
|
```
|
|
|
|
|
|
### 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...
|
|
|
| Colormap continue discrétisée | ListedColorMap : colormap discrète définie par une liste |
|
|
|
|--------|----------------------------------------------------------|
|
|
|
| cell | ![test_scatter_4](uploads/cf3e97051da614bed3e2e4b93f88062d/test_scatter_4.png)|
|
|
|
| cell | on a en plus customisé la colorbar pour comprendre|
|
|
|
|-------------------------------|----------------------------------------------------------|
|
|
|
| ![test_scatter_3](uploads/26181233c98a12ef4a8b0b955d238c17/test_scatter_3.png) | ![test_scatter_4](uploads/cf3e97051da614bed3e2e4b93f88062d/test_scatter_4.png) |
|
|
|
| on a défini les limites de classes avec BoundaryNorm | on a en plus customisé la colorbar pour comprendre |
|
|
|
|
|
|
```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'}
|
... | ... | @@ -104,5 +125,4 @@ 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()
|
|
|
```
|
|
|
|
|
|
``` |
|
|
\ No newline at end of file |