Skip to content
GitLab
Projects Groups Topics Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Register
  • Sign in
  • PYTHON - Atelier MatPlotLib PYTHON - Atelier MatPlotLib
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributor statistics
    • Graph
    • Compare revisions
  • Issues 0
    • Issues 0
    • List
    • Boards
    • Service Desk
    • Milestones
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Terraform modules
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar

La forge institutionnelle d'INRAE étant en production depuis le 10 juin 2025, nous vous invitons à y créer vos nouveaux projets.

  • Poulard Christine
  • PYTHON - Atelier MatPlotLibPYTHON - Atelier MatPlotLib
  • Wiki
  • focus_scatter

focus_scatter · Changes

Page history
Update focus_scatter authored Oct 26, 2021 by Poulard Christine's avatar Poulard Christine
Show whitespace changes
Inline Side-by-side
focus_scatter.md
View page @ 0d261f75
...@@ -4,14 +4,14 @@ ...@@ -4,14 +4,14 @@
Objectif : connaître la méthode **scatter** et en particulier : 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...) 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
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) 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...) 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) 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 ## 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) 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 ...@@ -50,7 +50,7 @@ plt.scatter(dates, liste_mois, c='blue', s=20) # marker par défaut = cercle
plt.show() plt.show()
``` ```
| introduction : couleur et taille unique | partie 1 : on fait varier tailles et couleurs | | 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) | | ![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) | | 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 ...@@ -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 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 ```python
plt.plot(dates, liste_mois, c='grey') 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 ...@@ -78,7 +80,7 @@ cax = plt.scatter(dates, liste_mois, c=liste_mois, s=[4 * (date.year - 1990) for
plt.colorbar(cax) 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 : En fait, ici c'est **BoundaryNorm** qui paraît faire tout le travail :
...@@ -127,3 +129,33 @@ for mois in range(1,13): ...@@ -127,3 +129,33 @@ for mois in range(1,13):
plt.title("test 4") plt.title("test 4")
plt.show() 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
Clone repository
  • AtelierB1_Graphiques_simples
  • AtelierB2_Lire_un_fichier
  • AtelierC
  • Atelier_D_carte
  • Atelier_D_carte_a_partir_de_fichiers_binaires
  • Atelier_E_longues_series
  • Atelier_G_widgets
  • Atelier_clic_afficher
  • Atelier_clics
  • Cartes focus sur le redimensionnement
  • GUI avec QT
  • La doc avec Sphinx
  • Lexique
  • Point Théorie Subplots
  • Pour les contributeurs
View All Pages