> Modules non standards > Matplotlib > Disposition et graphes multiples
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