Python >> Tutoriel Python >  >> Python Tag >> Matplotlib

Comment personnaliser plusieurs sous-parcelles dans Matplotlib

Cet article couvrira un problème spécifique que la plupart des utilisateurs de Python rencontrent lors de l'utilisation de Matplotlib pour tracer leurs graphiques. Je parle de définir plusieurs sous-parcelles et de pouvoir accéder et modifier leurs propriétés individuellement.

Dans les sections suivantes, nous verrons comment utiliser le Matplotlib fonction .subplots() pour générer plusieurs sous-parcelles et comment définir des propriétés telles que les étiquettes des axes, le titre et la grille de chacune d'elles séparément et simultanément.

J'ai expliqué cet article dans le tutoriel vidéo suivant :

Importer des bibliothèques

Puisque nous allons simplement créer quelques sous-parcelles et modifier certaines de leurs propriétés, la seule bibliothèque qui sera utilisée tout au long de l'exemple est Matplotlib ; plus précisément, nous importons le Matplotlib.pyplot package pour pouvoir tracer et modifier nos fenêtres de tracé.

import matplotlib.pyplot as plt

Création de la fenêtre de traçage et définition des sous-parcelles

Le premier pas vers la création d'un Matplotlib plot est la définition d'une fenêtre de tracé, c'est-à-dire la fenêtre qui s'affichera après l'exécution du code et qui contiendra tous les tracés définis ultérieurement. Pour ce faire, nous utilisons le matplotlib fonction .figure() et on affecte sa valeur à la variable "fig ”. Nous ne spécifions aucun paramètre d'entrée ; cependant, il est possible de modifier la taille de la figure, sa couleur et quelques autres propriétés; vous pouvez trouver la documentation officielle sur ce lien.

fig = plt.figure()

Une fois la fenêtre de traçage créée, nous devons définir les sous-parcelles ; cela peut être fait en utilisant la fonction .subplots() , appliqué au chiffre défini précédemment (c'est-à-dire la variable "fig ”). Si nous ne transmettons aucun paramètre d'entrée, cette fonction générera une seule sous-parcelle tandis que si nous voulons qu'elle affiche plusieurs sous-parcelles, nous devons spécifier le nombre de lignes et de colonnes dans lesquelles nous voulons diviser la fenêtre de traçage. Ces paramètres d'entrée sont appelés "nrows ” et ”ncols ”; cependant, nous pouvons les adresser directement en tapant simplement les deux numéros respectifs.

Les autres paramètres utiles sont sharex et sharey , si nous les mettons égaux à True, les sous-parcelles générées partageront le x et/ou le y axes. Pour cet exemple, nous définissons quatre sous-parcelles, affichées sur deux lignes et deux colonnes ; et nous les affectons à la variable "ax ”. La ligne de code suivante décrit la procédure. On utilise aussi la fonction .subplots_adjust() pour changer la séparation entre les quatre sous-parcelles, notamment en mettant à 0,5 la valeur des paramètres hspace et wspace (correspondant respectivement à la séparation verticale et horizontale).

ax = fig.subplots(2, 2)
fig.subplots_adjust(hspace=0.5, wspace=0.5)

Le résultat obtenu est affiché dans la figure 1, qui montre les quatre sous-parcelles initialisées dans une grille 2x2 à l'intérieur de la fenêtre matplotlib.

Illustration 1 : Initialisation de quatre sous-parcelles, distribuées dans une grille 2x2 dans le matplotlib fenêtre.

Modifier les propriétés des sous-parcelles individuelles

Maintenant que nous avons créé nos quatre sous-parcelles, nous allons plus loin et modifions certaines des propriétés des parcelles individuelles. C'est une tâche vraiment facile; en effet, grâce à la stratégie que nous avons adoptée pour la définition des sous-parcelles, maintenant la variable « ax ” est un tableau 2x2 et permet donc d'accéder à chacun de ses éléments (chaque sous-parcelle) par simple indexation.

Dans notre cas, la sous-parcelle dans le coin supérieur gauche est l'élément [0, 0] , celui en haut à droite le [0, 1] , en bas à gauche nous avons le [1, 0] et en bas à droite le [1, 1] . Nous pouvons maintenant essayer d'ajouter un titre à la sous-parcelle dans le coin inférieur gauche, cela peut être fait en appliquant la méthode .set_title() à l'élément ax[1, 0] et en passant en chaîne le titre que l'on veut ajouter :

ax[1, 0].set_title('Plot n° 3')

Le résultat final est affiché sur la figure 2; comme vous pouvez le voir, nous avons ajouté un titre uniquement à la sous-parcelle en bas à gauche, alors que les autres en manquent toujours.

Illustration 2 : En appliquant la méthode .set_title() au [1, 0] élément du ax tableau, nous avons ajouté un titre uniquement à la sous-parcelle dans le coin inférieur gauche.

De manière analogue, nous pouvons accéder et modifier les propriétés de toutes les autres sous-parcelles individuelles qui composent notre figure. À cette fin, certaines des méthodes les plus fréquemment utilisées sont :

  • .grid() pour activer la grille sur votre tracé et pour modifier ses propriétés (comme la couleur et la largeur de ligne)
  • .set_xlabel ou set_ylabel() pour définir le titre du x et y axes, respectivement
  • .set_facecolor() pour changer la couleur de fond de chaque sous-parcelle

Définir automatiquement les propriétés de toutes les sous-parcelles

Supposons maintenant que nous voulions initialiser certaines des propriétés précédemment répertoriées pour toutes les sous-parcelles présentes dans notre fenêtre. Même si ce n'était pas une tâche difficile, répéter cette étape pour plusieurs propriétés et pour plusieurs parcelles pourrait être répétitif et prendre du temps (ainsi qu'ennuyeux).

Pour résoudre ce problème, il est possible d'exploiter les boucles for pour définir et/ou modifier automatiquement et rapidement certaines des propriétés de toutes les sous-parcelles. En effet, puisque la variable ax a été initialisé comme un tableau 2x2, nous pouvons donc utiliser deux boucles for imbriquées pour accéder à chaque sous-parcelle une par une et modifier toutes ses propriétés de manière itérative. Dans les lignes de code suivantes, nous utiliserons deux boucles for imbriquées pour accéder à chacune des sous-parcelles et modifier les propriétés comme le titre, la grille, la couleur de fond et les étiquettes des axes.

Avant d'entrer dans les boucles for, on définit les variables "rows ” et “cols ” qui indique le nombre total de lignes et de colonnes dans lesquelles la fenêtre est divisée ; elles serviront alors de valeur d'échappement pour stopper les itérations à l'intérieur des boucles. On définit également un index "n ”, qui servira à attribuer le numéro à chaque titre de parcelle.

rows, cols = 2, 2
n = 1
for i in range(rows):
    for j in range(cols):
        ax[i, j].grid(color='w', linewidth=1)
        ax[i, j].set_ylabel('Y axis')
        ax[i, j].set_xlabel('X axis')
        ax[i, j].set_facecolor("grey")
        ax[i, j].set_title('Plot n° ' + str(n))
        n += 1
plt.show()

Comme vous pouvez le voir sur les lignes de code, chacune des sous-parcelles aura une grille blanche, deux étiquettes pour les axes y et x, respectivement, un fond gris et un titre indiquant "N° de parcelle (numéro de la parcelle)", où le numéro de la parcelle est dicté par la valeur de l'indice « n ». Le résultat final est affiché dans la figure 3.

Illustration 3 : Utiliser deux boucles for imbriquées nous avons pu modifier automatiquement les propriétés des quatre sous-parcelles, sans avoir à répéter toutes les étapes pour chacune d'elles.

Code complet

Voici le code complet de ce tutoriel :

import matplotlib.pyplot as plt

fig = plt.figure()
rows, cols = 2, 2
ax = fig.subplots(nrows=rows, ncols=cols)
fig.subplots_adjust(hspace=0.5, wspace=0.5)
# adding a title to an individual subplot
ax[1, 0].set_title('Plot n° 3')
# automatically set the properties for all the subplots
n = 1
for i in range(rows):
    for j in range(cols):
        ax[i, j].grid(color='w', linewidth=1)
        ax[i, j].set_ylabel('Y axis')
        ax[i, j].set_xlabel('X axis')
        ax[i, j].set_facecolor('grey')
        ax[i, j].set_title('Plot n° ' + str(n))
        n += 1
plt.show()

Conclusion

Dans cet article, nous avons vu comment accéder à chaque sous-parcelle présente dans une fenêtre matplotlib ; dans la première partie, nous avons ajouté manuellement un titre à une seule des quatre sous-parcelles, dans la deuxième partie, nous avons exploité deux boucles for imbriquées pour parcourir toutes les sous-parcelles et modifier toutes leurs propriétés simultanément et automatiquement.