Mis a jour le 2025-04-14, 12:10

Disposition et graphes multiples

Il y a 2 notions :
  • notion de figure qui peut regrouper plusieurs graphes, modélisé par un objet Figure. Pour créer une figure, on fait par exemple pyplot.figure(2) (voir ci-dessous).
  • notion de graphe dans cette figure, modélisé par un objet Axes. Pour créer un graphe, on fait par exemple pyplot.subplot(212) (voir ci-dessous).
Taille d'une figure :
  • figure = pyplot.figure(figsize = (10, 10)) : pour fixer la taille de la figure largeur puis hauteur (en pouces).
  • figure.get_size_inches() : pour avoir la taille de la figure (tuple renvoyé).
Fixation des marges :
  • pyplot.margins() : renvoie les marges x et y (sous forme x, y)
  • pyplot.margins(x = 0.1, y = 0.1) : positionne les marges.
  • pour avoir des marges minimales : pyplot.tight_layout() : permet d'ajuster automatiquement les marges si certaines étiquettes sont particulièrement longues (c'est matplotlib qui calcule).
  • pyplot.tight_layout(rect = [0, 0, 1, 0.9]) : indique le rectangle sur lequel mettre les graphes, ce qui permet de laisser de la place pour le suptitle par exemple. Le défaut est [0, 0, 1, 1].
  • si plusieurs graphes, on peut même ajuster les marges supplémentaires avec pyplot.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.0)
Traçage de graphes multiples sur la même figure :
  • pyplot.figure(1) : ouvre la figure numéro 1 (appel implicite à la figure numéro 1 si pas d'appel à figure()).
  • pyplot.subplot(2,1,1) : partage la figure en 2 x 1 emplacements de graphes (2 lignes et 1 colonne) et sélectionne le 1er emplacement pour les instructions graphiques suivantes. Les numéros des graphes sont comptés par ligne.
  • pyplot.subplot(211) : c'est une alternative à pyplot.subplot(2,1,1), dans le cas ou les dimensions et le numéro de graphe sont tous inférieurs à 10 !
  • si on ne fait pas d'appel à subplot, par défaut, il y a un appel pyplot.subplot(111) (1 emplacement).
  • pyplot.close() : ferme la figure courante. Le close est nécessaire pour libérer toutes les ressources occupées, même si la figure n'est plus visible.
  • pyplot.close(2) : ferme la figure 2.
  • pyplot.close('all') : ferme toutes les figures.
  • chercher GridSpec pour des graphes multiples de tailles différentes.
subplots :
  • myfig, (ax1, ax2) = pyplot.subplots(nrows = 2, ncols = 3) : permet de définir à l'avance des graphes, pour les remplir après.
  • pyplot.gcf().get_axes() : retourne la liste des graphes présents sur la figure courante.
  • squeeze = True : si un seul graphe, un seul axis retourné, si une seule colonne ou un seule ligne, array 1d retournée, sinon array 2d. C'est le défaut. Si squeeze = False, c'est toujours une array 2d qui est retournée.
  • on peut boucler simplement sur les axis en mettant à plat l'array des axis : myfig, axes = pyplot.subplots(nrows = 5, ncols = 4); axes = axes.ravel()
  • sharex :
    • sharex = False ou sharex = 'none' : les graduations de l'axe des x sont indépendantes entre les graphes. C'est le défaut.
    • sharex = True ou sharex = 'all' : tous les graphes utilisent les mêmes graduations de l'axe des x.
    • sharex = 'row' : tous les graphes d'une même ligne utilisent les mêmes graduations de l'axe des x.
    • sharex = 'col' : tous les graphes d'une même colonne utilisent les mêmes graduations de l'axe des x.
  • sharey : comme sharex, mais pour l'axe des y
Exemple de figure avec des graphes multiples : pyplot.figure(1) pyplot.subplot(1, 2, 1) pyplot.scatter(range(5), [x ** 2 for x in range(5)], color = 'blue') pyplot.subplot(2, 2, 2) pyplot.plot(range(5), color = 'red') pyplot.subplot(2, 2, 4) pyplot.bar(range(5), range(5), color = 'green')
On peut aussi positionner un graphe "en insert" où l'on veut en donnant la position x et y du point en bas à gauche de ce graphe, avec des valeurs entre 0 et 1, et les dimensions largeur et hauteur, entre 0 et 1, et en utilisant la méthode add_axes de Figure : figure = pyplot.figure() axes = figure.add_subplot(111) # Renvoie un objet AxesSubplot, sous classe de Axes axes.scatter(range(5), [x ** 2 for x in range(5)]) axes.set_xlim(0, 4) axes.set_xlabel('axe des x') axes2 = figure.add_axes([0.3, 0.5, 0.3, 0.3]) # renvoie un objet Axes axes2.patch.set_color('lightyellow') axes2.plot(range(5), range(5))
Réglage des marges (aussi bien si un seul graphe que si plusieurs graphes) :
  • pyplot.gcf().subplots_adjust(left = 0.2, bottom = 0.2, right = 0.9, top = 0.9, wspace = 0, hspace = 0) : permet de régler toutes les marges.
  • left et bottom : valeurs entre 0 et 1 qui indiquent où commencent les graphes par rapport à la figure.
  • right et top : valeurs entre 0 et 1 supérieures à left et bottom respectivement qui indiquent où finissent les graphes par rapport à la figure.
  • wspace et hspace : espace horizontal et vertical respectivement entre graphes, mais cette fois-ci en pouces (valeurs peuvent être supérieures à 1).
  • les valeurs par défaut sont left = 0.125, bottom = 0.1, right = 0.9, top = 0.9, wspace = 0.2 et hspace = 0.2
  • on peut très bien modifier seulement certaines de ces valeurs, par exemple pyplot.gcf().subplots_adjust(hspace = 2)
Exemple avec des petites marges : figure = pyplot.figure(figsize = (10, 10)) pyplot.gcf().subplots_adjust(left = 0.1, bottom = 0.1, right = 0.9, top = 0.9, wspace = 0, hspace = 0.1) axes = figure.add_subplot(2, 1, 1) axes.set_xlabel('axe des x') axes.set_ylabel('axe des y') axes.set_title('titre du graphe 1') axes.scatter(range(5), [x ** 2 for x in range(5)], s = 50, color = 'blue') axes = figure.add_subplot(2, 1, 2) axes.set_xlabel('axe des x') axes.set_ylabel('axe des y') axes.set_title('titre du graphe 2') axes.scatter(range(5), [x ** 2 for x in range(5)], s = 50, color = 'red')
Exemple avec des grandes marges : figure = pyplot.figure(figsize = (10, 10)) pyplot.gcf().subplots_adjust(left = 0.3, bottom = 0.3, right = 0.7, top = 0.7, wspace = 0, hspace = 2) axes = figure.add_subplot(2, 1, 1) axes.set_xlabel('axe des x') axes.set_ylabel('axe des y') axes.set_title('titre du graphe 1') axes.scatter(range(5), [x ** 2 for x in range(5)], s = 50, color = 'blue') axes = figure.add_subplot(2, 1, 2) axes.set_xlabel('axe des x') axes.set_ylabel('axe des y') axes.set_title('titre du graphe 2') axes.scatter(range(5), [x ** 2 for x in range(5)], s = 50, color = 'red')
Pour avoir la position d'un graphe dans une figure : pyplot.gca().get_position().get_points() : renvoie une array du type [[x0,y0],[x1,y1]] avec (x0, y0) coordonnées du point en bas à gauche et (x1, y1) coordonnées du point en haut à droite.
Pour créer des subplots a priori et ensuite les remplir avec des figures :
  • myfig, (ax1, ax2) = pyplot.subplots(nrows = 2, ncols = 1) : renvoie la Figure et une array (1d ou 2d en fonction des dimensions) de AxesSubplot
  • on peut alors remplir ax1 et ax2 en les passant à une fonction qui prend cet argument (par exemple celles dans seaborn)
  • après avoir rempli les axes, il faut souvent indiquer la taille de la figure (le paramètre figsize semble être écrasé) : pyplot.gcf().set_size_inches(8, 8)

Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert