Was bedeutet das Argument in Matplotlib in fig.add_subplot (111)?


472

Manchmal stoße ich auf Code wie diesen:

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

Welches produziert:

Beispielplot, der mit dem enthaltenen Code erstellt wurde

Ich habe die Dokumentation wie verrückt gelesen, aber ich kann keine Erklärung dafür finden 111. manchmal sehe ich a 212.

Was bedeutet das Argument von fig.add_subplot()?

Antworten:


470

Dies sind Teilplot-Gitterparameter, die als einzelne Ganzzahl codiert sind. Zum Beispiel bedeutet "111" "1x1 Gitter, erste Unterzeichnung" und "234" bedeutet "2x3 Gitter, 4. Unterzeichnung".

Alternative Form für add_subplot(111)ist add_subplot(1, 1, 1).


18
Gibt es dazu eine detaillierte Dokumentation? Was ist in diesem Zusammenhang der Unterschied zwischen einem 1x1-Raster und einem 2x3-Raster?
Donatello

19
1x1 Gitter = 1 Zeile, 1 Spalte. 2x3 Gitter = 2 Zeilen, 3 Spalten. Die dritte Zahl beginnt bei 1 und erhöht die Zeile zuerst. Weitere Informationen finden Sie in der Dokumentation zu subplot ().
Christian Alis

18
Wie andere erklärten (vor mehr als zwei Jahren), ist dies ein Vermächtnis von matlab. Für zukünftige Leser sollten Sie jedoch wissen, dass es eine bessere Alternative in Form der subplots()Methode gibt.
Jarondl

26
Die Dokumentation des Erbes subplot()ist hier und subplots()ist hier .
Crayzeewulf

511

Ich denke, dies lässt sich am besten anhand des folgenden Bildes erklären:

Geben Sie hier die Bildbeschreibung ein

Um das Obige zu initialisieren, würde man Folgendes eingeben:

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

19
Ich denke, die Version mit Kommas ist viel intuitiver und lesbarer als die Version mit dreistelligen Zahlen
Endolith

Das ist großartig, es zeigt, wie man "Unterzeichnungen in einem Raster positioniert", sei es ein 2x2-Raster wie das oben abgebildete Beispiel oder ein Raster aus 4x4-Diagrammen usw. Aber kann jemand bitte erklären, was die Größe der angezeigten Diagramme bestimmt. Die Standardeinstellungen für (2,2,1) finde ich ziemlich klein. Ich möchte, dass es vielleicht doppelt so groß oder größer ist.
Yoshiserry

7
Das ist sehr hilfreich. Dieses Bild wäre etwas schöner, wenn es nicht quadratisch (2x2) wäre, aber ansonsten sehr hilfreich.
TravisJ

@TravisJ Wow, was für ein Zufall! Ich habe ungefähr eine Stunde vor dem Schreiben genau dasselbe gedacht! Ich werde es bald ändern :)
SaiyanGirl

7
Sehr hilfreiche Antwort! Obwohl ich denke, dass die Bearbeitung ungenau ist. Das Verhalten, Teilplots mit Anweisungen wie 1: 2 oder [1 3] zu überspannen, wird von Matplotlib nicht unterstützt (zumindest nicht in 1.5.0) und scheint nur Matlab zu sein. (Beachten Sie, dass es in Matplotlib andere Optionen gibt, um dieses Verhalten zu erreichen, z. B. gridspec )
Labor

39

Die Antwort von Constantin ist genau richtig, aber für mehr Hintergrundinformationen wird dieses Verhalten von Matlab geerbt.

Das Matlab-Verhalten wird im Abschnitt Abbildung einrichten - Anzeigen mehrerer Diagramme pro Abbildung in der Matlab-Dokumentation erläutert .

Unterzeichnung (m, n, i) unterteilt das Figurenfenster in eine m-mal-n-Matrix aus kleinen Unterzeichnungen und wählt die i-te Unterzeichnung für die aktuelle Darstellung aus. Die Diagramme sind in der oberen Reihe des Figurenfensters, dann in der zweiten Reihe usw. nummeriert.


2
Dies ist Matplotlib, nicht Matlab.
Dom0

45
Ein Großteil des Verhaltens von matplotlibs wird von Matlab geerbt. Da die Matlab-Dokumentation besser war, dachte ich, es könnte helfen, zu erklären, wie sich dieser spezielle Funktionsaufruf verhält. Ja, Sie haben Recht, dies (Frage) betrifft Matplotlib. Die Matplotlib-Subplot-Dokumentation ist meiner Meinung nach weniger klar.
DaveTM

7
Die MATLAB-Dokumentation wurde verschoben .
Dotancohen

20

Meine Lösung ist

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 Gitter mit 1 und 3 zusammenführen


15

Geben Sie hier die Bildbeschreibung ein

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)

Der erste Code erstellt die erste Unterzeichnung in einem Layout mit 3 Zeilen und 2 Spalten.

Die drei Diagramme in der ersten Spalte bezeichnen die drei Zeilen. Das zweite Diagramm befindet sich direkt unter dem ersten Diagramm in derselben Spalte und so weiter.

Die letzten beiden Diagramme enthalten Argumente dafür (2, 2), dass die zweite Spalte nur zwei Zeilen enthält. Die Positionsparameter verschieben sich zeilenweise.


10

fig.add_subplot(ROW,COLUMN,POSITION)

  • REIHE = Anzahl der Zeilen
  • SPALTE = Anzahl der Spalten
  • POSITION = Position des Diagramms, das Sie zeichnen

Beispiele

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

Es gibt insgesamt 2 Zeilen, 1 Spalte, daher können 2 Untergraphen gezeichnet werden. Sein Standort ist 1 .. Es gibt insgesamt 2 Zeilen, 1 Spalte, daher können 2 Untergraphen gezeichnet werden. Seine Position ist die 2 ..


2

Die Methode add_subplot () verfügt über mehrere Aufrufsignaturen :

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

Anrufe 1 und 2:

Die Anrufe 1 und 2 erreichen dasselbe (bis zu einem unten erläuterten Limit). Stellen Sie sich vor, Sie geben zuerst das Rasterlayout mit den ersten beiden Zahlen (2x2, 1x8, 3x4 usw.) an, z.

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

Beide erzeugen eine Unterplotanordnung von (3 x 4 = 12) Unterplots in 3 Zeilen und 4 Spalten. Die dritte Zahl in jedem Aufruf gibt an, welches Achsenobjekt zurückgegeben werden soll, beginnend mit 1 oben links und nach rechts erhöht .

Dieser Code veranschaulicht die Einschränkungen bei der Verwendung von Aufruf 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()

Nebenhandlungen

Sie können sehen, dass Sie mit Aufruf 1 auf der LHS jedes Achsenobjekt zurückgeben können. Mit Aufruf 2 auf der RHS können Sie jedoch nur bis zu Index = 9 zurückkehren, wodurch die Unterzeichnungen j), k) und l) mit diesem Aufruf nicht mehr zugänglich sind.

Dh es veranschaulicht diesen Punkt aus der Dokumentation:

pos ist eine dreistellige Ganzzahl, wobei die erste Ziffer die Anzahl der Zeilen, die zweite die Anzahl der Spalten und die dritte der Index des Unterplots ist. dh fig.add_subplot (235) ist dasselbe wie fig.add_subplot (2, 3, 5). Beachten Sie, dass alle Ganzzahlen kleiner als 10 sein müssen, damit dieses Formular funktioniert .


Rufen Sie 3 an

In seltenen Fällen kann add_subplot mit einem einzigen Argument aufgerufen werden, einer Instanz von Unterplotachsen, die bereits in der vorliegenden Abbildung erstellt wurde, jedoch nicht in der Achsenliste der Abbildung.


Anruf 4 (seit 3.1.0):

Wenn keine Positionsargumente übergeben werden, wird standardmäßig (1, 1, 1) verwendet.

dh den Anruf fig.add_subplot(111)in der Frage reproduzieren .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.