web-dev-qa-db-fra.com

Changer la taille/la position de la sous-parcelle matplotlib après la création des axes

Est-il possible de définir la taille/la position d'une sous-parcelle matplotlib après la création des axes? Je sais que je peux faire:

import matplotlib.pyplot as plt

ax = plt.subplot(111)
ax.change_geometry(3,1,1)

mettre les axes sur la rangée supérieure de trois. Mais je veux que les axes couvrent les deux premières lignes. J'ai essayé ceci:

import matplotlib.gridspec as gridspec

ax = plt.subplot(111)
gs = gridspec.GridSpec(3,1)
ax.set_subplotspec(gs[0:2])

mais les axes remplissent encore toute la fenêtre.

Mettre à jour pour plus de clarté Je souhaite modifier la position d'une instance d'axes existante plutôt que de la définir lors de sa création. En effet, l'étendue des axes sera modifiée à chaque fois que j'ajouterai des données (données de tracé sur une carte à l'aide de cartopy). La carte peut être haute ou étroite, ou courte et large (ou entre les deux). La décision sur la disposition de la grille sera donc prise après la fonction de traçage.

15
RuthC

Grâce à Molly qui me dirige dans la bonne direction, j'ai une solution:

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

fig = plt.figure()

ax = fig.add_subplot(111)

gs = gridspec.GridSpec(3,1)
ax.set_position(gs[0:2].get_position(fig))
ax.set_subplotspec(gs[0:2])              # only necessary if using tight_layout()

fig.add_subplot(gs[2])

fig.tight_layout()                       # not strictly part of the question

plt.show()
9
RuthC

Vous pouvez créer une figure avec une sous-parcelle s'étendant sur deux lignes et une sous-parcelle sur une ligne à l'aide de l'argument rowspan de subplot2grid :

import matplotlib.pyplot as plt

fig = plt.figure()
ax1 = plt.subplot2grid((3,1), (0,0), rowspan=2)
ax2 = plt.subplot2grid((3,1), (2,0))
plt.show()

enter image description here

Si vous souhaitez modifier la taille et la position de la sous-parcelle après sa création, vous pouvez utiliser la méthode set_position

ax1.set_position([0.1,0.1, 0.5, 0.5])

Mais vous n’avez pas besoin de cela pour créer la figure que vous avez décrite.

4
Molly

Vous pouvez éviter ax.set_position() en utilisant plutôt fig.tight_layout() qui recalcule le nouveau gridspec:

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

# create the first axes without knowing of further subplot creation
fig, ax = plt.subplots()
ax.plot(range(5), 'o-')

# now update the existing gridspec ...
gs = gridspec.GridSpec(3, 1)
ax.set_subplotspec(gs[0:2])
# ... and recalculate the positions
fig.tight_layout()

# add a new subplot
fig.add_subplot(gs[2])
fig.tight_layout()
plt.show()
1
fhgd