2010-08-27 17 views
333

Parfois, je vous rencontriez un code comme celui-ci:Dans Matplotlib, que signifie l'argument dans fig.add_subplot (111)?

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() 

qui produit:

Example plot produced by the included code

J'ai lu la documentation comme un fou, mais je ne peux pas trouver une explication à la 111 . parfois, je vois un 212.

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

Répondre

325

Ce sont des paramètres de grille de sous-tracé codés sous la forme d'un entier unique. Par exemple, "111" signifie "grille 1x1, première sous-parcelle" et "234" signifie "grille 2x3, quatrième sous-parcelle". La forme de remplacement pour add_subplot(111) est add_subplot(1, 1, 1).

+14

Y at-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

+14

Grille 1x1 = 1 rang, 1 colonne. 2x3 grille = 2 lignes, 3 colonnes. Le troisième chiffre commence à partir de 1 et incrémente la première rangée. Voir la documentation de subplot() pour plus d'informations. – ianalis

+13

Comme d'autres l'ont expliqué (il y a plus de deux ans), c'est un héritage de matlab. Mais dans l'intérêt des futurs lecteurs, vous devriez savoir qu'il existe une meilleure alternative, sous la forme de la méthode 'subplots()'. – jarondl

30

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

Le comportement de Matlab est expliqué dans la section Figure Setup - Displaying Multiple Plots per Figure de la documentation Matlab.

subplot (m, n, i) rompt la fenêtre de la figure dans une matrice m par n de petites parcelles et sélectionne le sous-parcelle de ithe pour le tracé en cours. Les tracés sont numérotés le long de la rangée supérieure de la fenêtre graphique, puis la seconde rangée , et ainsi de suite.

+2

Ceci est matplotlib, pas matlab. – dom0

+40

Une grande partie du comportement de matplotlibs est héritée de Matlab. Comme la documentation de Matlab était meilleure, j'ai pensé que cela pourrait aider à expliquer le comportement de cet appel de fonction spécifique. Oui, vous avez raison, cette question concerne le matplotlib. La [documentation du sous-répertoire matplotlib] (http://matplotlib.sourceforge.net/api/axes_api.html?highlight=axessubplot#matplotlib.axes.SubplotBase) est moins claire à mon avis. – DaveTM

+3

Point pris :-) – dom0

384

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

enter image description here

Pour initialiser ci-dessus, on taperait:

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() 

EDIT: Quelques informations supplémentaires

Le suivre Les combinaisons ing produisent des arrangements asymétriques de sous-placettes.

subplot(2,2,[1 3]) 
subplot(2,2,2) 
subplot(2,2,4) 

Example 2

Vous pouvez également utiliser l'opérateur de deux points pour spécifier plusieurs emplacements si elles sont dans l'ordre.

subplot(2,2,1:2) 
subplot(2,2,3) 
subplot(2,2,4) 

enter image description here

Référence here

+12

Je pense que la version avec des virgules est beaucoup plus intuitive et lisible que la version avec des nombres à 3 chiffres – endolith

+0

Cela est génial de montrer comment "positionner des sous-tracés dans une grille" soit une grille 2x2 comme l'exemple 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) Je trouve assez petit, je voudrais peut-être doubler cette taille ou plus. – yoshiserry

+0

S'il vous plaît quelqu'un d'ajouter cette réponse à la documentation officielle, gee ... – alwbtc

3

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() 

2x2 grid with 1 and 3 merge