... | ... | @@ -4,14 +4,14 @@ |
|
|
|
|
|
Objectif : connaître la méthode **scatter** et en particulier :
|
|
|
|
|
|
1) faire varier les symboles : les différentes manières d'utiliser les codes couleur (une couleur, liste de couleurs fixées par l'utilisateur, code couleur selon une colormap...)
|
|
|
idem avec les tailles : taille fixe, taille selon liste ou taille selon une colonne
|
|
|
|
|
|
1) faire varier les symboles : les différentes manières d'utiliser les codes couleur (une couleur, liste de couleurs fixées par l'utilisateur, code couleur selon une colormap...) idem avec les tailles : taille fixe, taille selon liste ou taille selon une colonne
|
|
|
2) pistes pour créer une légende détaillée (faisant figurer le code couleur et/ou la taille des symboles)
|
|
|
3) les méthodes pour updater une courbe de type scatter (set_data, set_facecolors...)
|
|
|
|
|
|
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)
|
|
|
|
|
|
**Cette partie utilise la manière "simple mais pas recommandée" de définir des graphiques, avec plt.plot et plt.scatter puis "plt" pour appeler toutes les méthodes. Vous pouvez vous exercer à remplacer les instructions par une syntaxe plus pythonesque : nommer figure et Axes, puis appliquer les méthodes sur les bons objets.**
|
|
|
|
|
|
## Introduction : Présentation et comparaison avec la méthode plot
|
|
|
|
|
|
Comme d'habitude, la référence la plus complète et la plus fiable car régulièrement mise à jour est [la doc officielle](https://matplotlib.org/devdocs/api/_as_gen/matplotlib.axes.Axes.scatter.html?highlight=scatter#matplotlib.axes.Axes.scatter)
|
... | ... | @@ -50,7 +50,7 @@ plt.scatter(dates, liste_mois, c='blue', s=20) # marker par défaut = cercle |
|
|
plt.show()
|
|
|
```
|
|
|
| introduction : couleur et taille unique | partie 1 : on fait varier tailles et couleurs |
|
|
|
|------------------------------------|----------------------------------------------|
|
|
|
|-----------------------------------------|-----------------------------------------------|
|
|
|
| ![scatter_1](uploads/283a2242bf835e48b439c84056d2a5f4/scatter_1.png) | ![test_scatter_2](uploads/17c13b803970c2e3873f1e7d81cb47f2/test_scatter_2.png) |
|
|
|
| markers bleus, taille 20 | taille dépend de l'année, numéro du mois selon code couleur (cmap) |
|
|
|
|
... | ... | @@ -62,7 +62,9 @@ a) au plus simple, on désigne juste un vecteur dont les valeurs vont être trad |
|
|
|
|
|
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 \*\*
|
|
|
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 \*\*
|
|
|
|
|
|
```python
|
|
|
plt.plot(dates, liste_mois, c='grey')
|
... | ... | @@ -78,7 +80,7 @@ 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.
|
|
|
<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.
|
|
|
|
|
|
En fait, ici c'est **BoundaryNorm** qui paraît faire tout le travail :
|
|
|
|
... | ... | @@ -127,3 +129,33 @@ for mois in range(1,13): |
|
|
plt.title("test 4")
|
|
|
plt.show()
|
|
|
```
|
|
|
|
|
|
### définir la liste de couleurs item par item, légende customisée (cf Atelier C)
|
|
|
|
|
|
Variante : au lieu d'utiliser une colorbar, on peut aussi écrire une fonction pour affecter les couleurs élément par élément, s'il y a par exemple des conditions à vérifier. Ici on boucle sur les dates, et on ajoute à la liste des couleurs la valeur du dictionnaire DICO_COULEURS_MOIS qui correspond à la clé **date_month**
|
|
|
|
|
|
![test_scatter_5](uploads/6406ab387e48e826a1703dbb10bf3e7f/test_scatter_5.png)
|
|
|
|
|
|
Si vous voulez détailler votre code couleur. vous avez la possibilité de tracer la légende des couleurs (colorbar, utilisée ci-dessus) ou de tracer une légende "customisée".
|
|
|
|
|
|
```python
|
|
|
from matplotlib.lines import Line2D
|
|
|
|
|
|
DICO_NOM_MOIS = {1: 'janv', 2: 'févr', 3: 'mars', 4: 'avr', 5: 'mai', 6: 'juin', 7: 'juil', 8: 'août', 9: 'sept', 10: 'oct', 11: 'nov', 12: 'déc'}
|
|
|
|
|
|
fig, (ax, ax_legende_coul_a_la_main) = plt.subplots( nrows=2)
|
|
|
fig.suptitle("Code couleur \n des mois")
|
|
|
|
|
|
liste_couleurs_mois = [DICO_COULEURS_MOIS[date.month] for date in dates]
|
|
|
|
|
|
points = ax.scatter(dates, liste_mois, c=liste_couleurs_mois, s=[4 * (date.year - 1990) for date in dates], edgecolor='none', label='des dates')
|
|
|
ax.legend()
|
|
|
ax.legend(title="légende standard pour voir")
|
|
|
|
|
|
ax_legende_coul_a_la_main.axis('off')
|
|
|
|
|
|
handles = [Line2D([0], [0], marker='o', color="b", label=DICO_NOM_MOIS[mois],
|
|
|
markerfacecolor=DICO_COULEURS_MOIS[mois], markersize=15) for mois in range(1, 13)]
|
|
|
ax_legende_coul_a_la_main.legend(handles=handles, ncol=6, fontsize=8, title_fontsize=10,
|
|
|
labelspacing=1.5)
|
|
|
``` |
|
|
\ No newline at end of file |