web-dev-qa-db-fra.com

Comment faire pour qu'un axe occupe plusieurs sous-parcelles avec pyplot (Python)

J'aimerais avoir trois parcelles en une seule figure. La figure doit avoir une disposition de sous-parcelles de deux par deux, où le premier tracé doit occuper les deux premières cellules de sous-tracé (c'est-à-dire toute la première rangée de cellules de tracé) et les autres tracés doivent être positionnés sous le premier dans les cellules 3 et 4. Je sais que matlab permet cela en utilisant la commande subplot comme ça

subplot(2,2,[1,2]) % the plot will span subplots 1 and 2

Est-il également possible dans pyplot d'avoir un seul axe occupant plus d'une sous-intrigue? La docstring de pyplot.subplot n'en parle pas.

Quelqu'un a une solution simple? Merci d'avance

38
Sven

Vous pouvez simplement faire:

x = numpy.arange(0, 7, 0.01)

subplot(2, 1, 1)
plot(x, sin(x))

subplot(2, 2, 3)
plot(x, cos(x))

subplot(2, 2, 4)
plot(x, sin(x)*cos(x))

c'est-à-dire que le premier tracé est en réalité un tracé dans la moitié supérieure (la figure n'est divisée qu'en 2 * 1 = 2 cellules), et les deux parcelles plus petites suivantes sont réalisées dans une grille 2 * 2 = 4 cellules. Le troisième argument de subplot() est la position du tracé à l'intérieur de la grille: par exemple dans le deuxième sous-tracé (subplot(2, 2, 3)), les axes iront à la troisième section du 2 * 2 matrice c.-à-d. dans le coin inférieur gauche.

46
Eric O Lebigot

Pour occuper plusieurs sous-tracés avec un axe, vous pouvez simplement faire:

from matplotlib import pyplot as plt
import numpy as np

b=np.linspace(-np.pi, np.pi, 100)

a1=np.sin(b)

a2=np.cos(b)

a3=a1*a2

plt.subplot(221)
plt.plot(b, a1)
plt.title('sin(x)')

plt.subplot(222)
plt.plot(b, a2)
plt.title('cos(x)')

plt.subplot(212)
plt.plot(b, a3)
plt.title('sin(x)*cos(x)')

plt.show()

enter image description here

Une autre façon est

plt.subplot(222)
plt.plot(b, a1)
plt.title('sin(x)')

plt.subplot(224)
plt.plot(b, a2)
plt.title('cos(x)')

plt.subplot(121)
plt.plot(b, a3)
plt.title('sin(x)*cos(x)')

plt.show()

enter image description here

34
Hooshmand zandi

Pour un contrôle plus fin, vous pouvez utiliser le subplot2grid module de matplotlib.pyplot.

http://matplotlib.org/users/gridspec.html

12
A.Wan

tilisation de Gridspec pour créer des dispositions de sous-intrigue multi-colonnes/lignes montre un moyen de le faire avec GridSpec. Une version simplifiée de l'exemple avec 3 sous-tracés ressemblerait à

import matplotlib.pyplot as plt

fig = plt.figure()

gs = fig.add_gridspec(2,2)
ax1 = fig.add_subplot(gs[0, 0])
ax2 = fig.add_subplot(gs[0, 1])
ax3 = fig.add_subplot(gs[1, :])

plt.show()

enter image description here

Il y a trois options principales dans matplotlib pour faire des tracés séparés dans une figure:

  1. subplot : accéder au tableau des axes et ajouter des sous-tracés
  2. gridspec : contrôle les propriétés géométriques de la figure sous-jacente ( démo )
  3. subplots : encapsule les deux premiers dans une api pratique ( démo )

Jusqu'à présent, les postes ont abordé les deux premières options, mais ils n'ont pas mentionné la troisième, qui est l'approche la plus moderne et basée sur les deux premières options. Voir les documents spécifiques Combinaison de deux sous-tracés en utilisant des sous-tracés et GridSpec .

0
pylang