Dans Matplotlib, que signifie l'argument dans fig.add_subplot (111)?

472

Parfois, je rencontre du code comme celui-ci:

import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
fig = plt.figure()
fig.add_subplot(111)
plt.scatter(x, y)
plt.show()

Ce qui produit:

Exemple de tracé produit par le code inclus

J'ai lu la documentation comme un fou, mais je ne trouve pas d'explication pour le 111. parfois je vois un 212.

Que signifie l'argument de fig.add_subplot()?

happyontbelong
la source

Réponses:

470

Ce sont des paramètres de grille de sous-parcelles codés comme un seul entier. Par exemple, «111» signifie «grille 1x1, première sous-parcelle» et «234» signifie «grille 2x3, 4e sous-parcelle».

Forme alternative pour add_subplot(111)is add_subplot(1, 1, 1).

Constantin
la source
18
Existe-t-il une documentation détaillée à ce sujet? Quelle est la différence entre une grille 1x1 et une grille 2x3 dans ce contexte?
donatello
19
Grille 1x1 = 1 ligne, 1 colonne. Grille 2x3 = 2 lignes, 3 colonnes. Le troisième nombre commence à partir de 1 et incrémente la ligne en premier. Voir la documentation de subplot () pour plus d'informations.
Christian Alis
18
Comme d'autres l'ont expliqué (il y a plus de deux ans), il s'agit d'un héritage de matlab. Mais pour le plaisir des futurs lecteurs, vous devez savoir qu'il existe une meilleure alternative, sous la forme de la subplots()méthode.
jarondl du
26
La documentation de l'héritage subplot()est ici et subplots()est ici .
crayzeewulf
511

Je pense que cela serait mieux expliqué par l'image suivante:

entrez la description de l'image ici

Pour initialiser ce qui précède, on devrait taper:

import matplotlib.pyplot as plt
fig = plt.figure()
fig.add_subplot(221)   #top left
fig.add_subplot(222)   #top right
fig.add_subplot(223)   #bottom left
fig.add_subplot(224)   #bottom right 
plt.show()
SaiyanGirl
la source
19
Je pense que la version avec virgules est beaucoup plus intuitive et lisible que la version avec des nombres à 3 chiffres
endolith
C'est génial, cela montre comment "positionner des sous-parcelles dans une grille", que ce soit une grille 2x2 comme l'exemple illustré ci-dessus ou une grille de graphiques 4x4, etc. Mais quelqu'un peut-il expliquer ce qui détermine la taille de ces graphiques qui sont affichés. Les valeurs par défaut pour (2,2,1) que je trouve assez petites, je voudrais que ce soit le double de cette taille ou plus.
yoshiserry
7
C'est assez utile. Cette photo serait un peu plus jolie si elle n'était pas carrée (2x2) mais sinon très utile.
TravisJ
@TravisJ Wow, quelle coïncidence! Je pensais exactement la même chose environ une heure avant d'écrire ça! Je vais le changer bientôt :)
SaiyanGirl
7
Réponse très utile! Bien que je pense que la modification est inexacte. Le comportement pour couvrir les sous-tracés avec des instructions comme 1: 2 ou [1 3] n'est pas pris en charge par Matplotlib (du moins pas dans 1.5.0), et semble être uniquement Matlab. (Notez qu'il existe d'autres options dans Matplotlib pour obtenir ce comportement, par exemple gridspec )
lab
39

La réponse de Constantin est parfaite, mais pour plus d'informations, ce comportement est hérité de Matlab.

Le comportement de Matlab est expliqué dans la section Configuration de la figure - Affichage de plusieurs tracés par figure de la documentation de Matlab.

sous-intrigue (m, n, i) divise la fenêtre de la figure en une matrice m-par-n de petites sous-intrigues et sélectionne l'ithe sous-intrigue pour le tracé actuel. Les tracés sont numérotés le long de la ligne supérieure de la fenêtre de figure, puis de la deuxième ligne, etc.

DaveTM
la source
2
C'est matplotlib, pas matlab.
dom0
45
Une grande partie du comportement de matplotlibs est héritée de Matlab. Comme la documentation Matlab était meilleure, j'ai pensé que cela pourrait aider à expliquer comment cet appel de fonction spécifique se comporte. Oui, vous avez raison, cette (question) concerne le matplotlib. La documentation du sous-complot matplotlib est moins claire à mon avis.
DaveTM
7
La documentation MATLAB a été déplacée .
dotancohen
20

Ma solution est

fig = plt.figure()
fig.add_subplot(1, 2, 1)   #top and bottom left
fig.add_subplot(2, 2, 2)   #top right
fig.add_subplot(2, 2, 4)   #bottom right 
plt.show()

Grille 2x2 avec fusion 1 et 3

yoonghm
la source
15

entrez la description de l'image ici

import matplotlib.pyplot as plt
plt.figure(figsize=(8,8))
plt.subplot(3,2,1)
plt.subplot(3,2,3)
plt.subplot(3,2,5)
plt.subplot(2,2,2)
plt.subplot(2,2,4)

Le premier code crée le premier sous-tracé dans une présentation qui comporte 3 lignes et 2 colonnes.

Les trois graphiques de la première colonne désignent les 3 lignes. Le deuxième tracé vient juste en dessous du premier tracé dans la même colonne et ainsi de suite.

Les deux derniers tracés ont des arguments (2, 2)indiquant que la deuxième colonne n'a que deux lignes, les paramètres de position se déplacent par ligne.

Pritz
la source
10

fig.add_subplot(ROW,COLUMN,POSITION)

  • ROW = nombre de lignes
  • COLUMN = nombre de colonnes
  • POSITION = position du graphique que vous tracez

Exemples

`fig.add_subplot(111)` #There is only one subplot or graph  
`fig.add_subplot(211)`  *and*  `fig.add_subplot(212)` 

Il y a un total de 2 lignes, 1 colonne, donc 2 sous-graphiques peuvent être tracés. Son emplacement est le 1er. Il y a un total de 2 lignes, 1 colonne, donc 2 sous-graphiques peuvent être tracés.

Rameez Ahmad Dar
la source
2

La méthode add_subplot () a plusieurs signatures d'appel:

  1. add_subplot(nrows, ncols, index, **kwargs)
  2. add_subplot(pos, **kwargs)
  3. add_subplot(ax)
  4. add_subplot() <- depuis 3.1.0

Appels 1 et 2:

Les appels 1 et 2 réalisent la même chose l'un l'autre (jusqu'à une limite, expliquée ci-dessous). Considérez-les comme spécifiant d'abord la disposition de la grille avec leurs 2 premiers nombres (2x2, 1x8, 3x4, etc.), par exemple:

f.add_subplot(3,4,1) 
# is equivalent to:
f.add_subplot(341)

Les deux produisent un arrangement de sous-parcelles de (3 x 4 = 12) sous-parcelles en 3 lignes et 4 colonnes. Le troisième numéro de chaque appel indique quel objet d'axe retourner, à partir de 1 en haut à gauche, en augmentant vers la droite .

Ce code illustre les limites de l'utilisation de l'appel 2:

#!/usr/bin/env python3
import matplotlib.pyplot as plt

def plot_and_text(axis, text):
  '''Simple function to add a straight line
  and text to an axis object'''
  axis.plot([0,1],[0,1])
  axis.text(0.02, 0.9, text)

f = plt.figure()
f2 = plt.figure()

_max = 12
for i in range(_max):
  axis = f.add_subplot(3,4,i+1, fc=(0,0,0,i/(_max*2)), xticks=[], yticks=[])
  plot_and_text(axis,chr(i+97) + ') ' + '3,4,' +str(i+1))

  # If this check isn't in place, a 
  # ValueError: num must be 1 <= num <= 15, not 0 is raised
  if i < 9:
    axis = f2.add_subplot(341+i, fc=(0,0,0,i/(_max*2)), xticks=[], yticks=[])
    plot_and_text(axis,chr(i+97) + ') ' + str(341+i))

f.tight_layout()
f2.tight_layout()
plt.show()

sous-parcelles

Vous pouvez voir avec l' appel 1 sur le LHS que vous pouvez renvoyer n'importe quel objet d'axe, cependant avec l' appel 2 sur le RHS vous ne pouvez renvoyer jusqu'à index = 9 que les sous-tracés de rendu j), k) et l) inaccessibles à l'aide de cet appel.

C'est à dire qu'il illustre ce point de la documentation:

pos est un entier à trois chiffres, où le premier chiffre est le nombre de lignes, le second le nombre de colonnes et le troisième l'indice du sous-tracé. c'est-à-dire fig.add_subplot (235) est le même que fig.add_subplot (2, 3, 5). Notez que tous les entiers doivent être inférieurs à 10 pour que ce formulaire fonctionne .


Appelez 3

Dans de rares circonstances, add_subplot peut être appelé avec un seul argument, une instance d'axes de sous-intrigue déjà créée dans la figure actuelle mais pas dans la liste des axes de la figure.


Appelez 4 (depuis 3.1.0):

Si aucun argument positionnel n'est transmis, la valeur par défaut est (1, 1, 1).

c'est-à-dire, reproduire l'appel fig.add_subplot(111)dans la question.

compuphys
la source