... | @@ -60,13 +60,10 @@ plt.show() |
... | @@ -60,13 +60,10 @@ plt.show() |
|
|
|
|
|
## 1. Faire varier les couleurs et les tailles
|
|
## 1. Faire varier les couleurs et les tailles
|
|
|
|
|
|
On va créer un code couleur de plusieurs façons ; on va en détailler 2 :
|
|
On va créer un code couleur de plusieurs façons ; on va en détailler 2.
|
|
|
|
On en profite pour faire varier également la taille ; on définit le vecteur des tailles par une opération sur l'année (vous reconnaîtrez une _comprehension list_). Grâce à l'argument **year** on peut facilement récupérer le numéro d'année d'un vecteur de dates.
|
|
|
|
|
|
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 choisie dans une liste ; ici on a opté pour "viridis".
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
Attention ; vous pouvez utiliser plt.legend() pour faire apparaître une légende (à condition d'avoir pensé à affecter un nom à l'argument label du scatter...). Vous verrez un symbole unique, donc avec l'une des couleurs et l'une des tailles possibles. Quand vous avez des couleurs variables, il faut donc soit afficher la colorbar si vous utiliser une colormap, soit trouver un moyen d'afficher un symbole par classe. La [doc fournit un tuto intéressant, mais qui ne donne pas forcément toutes les clés si on a beaucoup de catégories ou un lien indirect entre la valeur et la taille...](https://matplotlib.org/stable/gallery/lines_bars_and_markers/scatter_with_legend.html)
|
|
|
|
|
|
|
|
\*\* Code de l'exemple 1.a \*\*
|
|
\*\* Code de l'exemple 1.a \*\*
|
|
|
|
|
... | @@ -77,14 +74,20 @@ plt.scatter(dates, liste_mois, c=liste_mois, s=[4*(date.year - 1990) for date in |
... | @@ -77,14 +74,20 @@ plt.scatter(dates, liste_mois, c=liste_mois, s=[4*(date.year - 1990) for date in |
|
plt.show()
|
|
plt.show()
|
|
```
|
|
```
|
|
|
|
|
|
### ajouter une colorbar continue :
|
|
**Comment faire apparaître une légende ?**
|
|
|
|
En regardant la figure, on devine qu'il y a un code couleur, mais le graphique ne donne aucune indication sur une éventuelle correspondance valeur/couleur.
|
|
|
|
On peut imaginer que **plt.legend()** fera le boulot. Vous pouvez essayer, si possible en affectant un nom à l'argument **label** du scatter. Hélas, vous verrez un symbole unique, donc avec l'une des couleurs et l'une des tailles possibles.
|
|
|
|
Pour montrer l'échelle de couleur d'une **colormap**, il suffit d'appeler la **colorbar** correspondante, que l'on peut 'personnaliser' (customize pour les recherches anglophones).
|
|
|
|
|
|
|
|
### ajouter une colorbar continue à une courbe nommée
|
|
|
|
|
|
```python
|
|
```python
|
|
cax = plt.scatter(dates, liste_mois, c=liste_mois, s=[4 * (date.year - 1990) for date in dates], cmap='viridis')
|
|
cax = plt.scatter(dates, liste_mois, c=liste_mois, s=[4 * (date.year - 1990) for date in dates], cmap='viridis')
|
|
plt.colorbar(cax)
|
|
plt.colorbar(cax)
|
|
```
|
|
```
|
|
|
|
|
|
<span dir="">#</span>##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.
|
|
### ajouter une colorbar discrétisée à partir de la colorbar continue
|
|
|
|
Ici, on a certes utilisé une colorbar continue, mais on a des valeurs discrètes, et on préfère marquer la correspondance valeur/couleur. On va donc **discrétiser la colormap** en définissant 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 changé, cette fois on utilise la colormap **rainbow**, vous pouvez en tester d'autres.
|
|
|
|
|
|
En fait, ici c'est **BoundaryNorm** qui paraît faire tout le travail :
|
|
En fait, ici c'est **BoundaryNorm** qui paraît faire tout le travail :
|
|
|
|
|
... | @@ -105,8 +108,6 @@ plt.title("test 3 : cmap discrète à partir de 'rainbow'") |
... | @@ -105,8 +108,6 @@ plt.title("test 3 : cmap discrète à partir de 'rainbow'") |
|
plt.show()
|
|
plt.show()
|
|
```
|
|
```
|
|
|
|
|
|
La [doc nous indique un moyen plus simple d'obtenir une légende quand il y a un nombre raisonnable de valeurs différentes](https://matplotlib.org/stable/gallery/lines_bars_and_markers/scatter_with_legend.html)
|
|
|
|
|
|
|
|
```python
|
|
```python
|
|
# méthode quand c est un vecteur de valeurs, et que scatter se débrouille pour utiliser une cmap par défaut
|
|
# méthode quand c est un vecteur de valeurs, et que scatter se débrouille pour utiliser une cmap par défaut
|
|
points = plt.scatter(dates, liste_mois, c=liste_mois, cmap=cmap, norm=norm, s=[4 * (date.year - 1990) for date in dates], edgecolor='none')
|
|
points = plt.scatter(dates, liste_mois, c=liste_mois, cmap=cmap, norm=norm, s=[4 * (date.year - 1990) for date in dates], edgecolor='none')
|
... | @@ -186,4 +187,11 @@ ax_legende_coul_a_la_main.legend(handles=handles, ncol=6, fontsize=8, title_font |
... | @@ -186,4 +187,11 @@ ax_legende_coul_a_la_main.legend(handles=handles, ncol=6, fontsize=8, title_font |
|
labelspacing=1.5)
|
|
labelspacing=1.5)
|
|
```
|
|
```
|
|
|
|
|
|
## updater une courbe de type scatter (set_data, set_facecolors...) |
|
## updater une courbe de type scatter (set_data, set_facecolors...)
|
|
\ No newline at end of file |
|
|
|
|
|
### autres méthodes
|
|
|
|
|
|
|
|
La [doc nous indique un moyen plus simple d'obtenir une légende quand il y a un nombre raisonnable de valeurs différentes](https://matplotlib.org/stable/gallery/lines_bars_and_markers/scatter_with_legend.html)
|
|
|
|
|
|
|
|
|
|
|
|
Il existe d'autres moyens d'afficher un symbole par classe sous forme d'une légende classique. La [doc fournit un tuto intéressant, mais qui ne donne pas forcément toutes les clés si on a beaucoup de catégories ou un lien indirect entre la valeur et la taille...](https://matplotlib.org/stable/gallery/lines_bars_and_markers/scatter_with_legend.html) |
|
|
|
\ No newline at end of file |