Co w Matplotlib oznacza ten argument na rys. Add_subplot (111)?


472

Czasami natrafiam na kod taki jak ten:

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

Który produkuje:

Przykładowy wykres utworzony przez dołączony kod

Czytałem dokumentację jak szalony, ale nie mogę znaleźć wyjaśnienia 111. czasami widzę 212.

Co oznacza argument fig.add_subplot()?

Odpowiedzi:


470

Są to parametry siatki podplotu zakodowane jako jedna liczba całkowita. Na przykład „111” oznacza „siatkę 1x1, pierwszy podplot”, a „234” oznacza „siatkę 2x3, czwarty podplot”.

Alternatywną formą add_subplot(111)jest add_subplot(1, 1, 1).


18
Czy istnieje szczegółowa dokumentacja na ten temat? Jaka jest różnica między siatką 1x1 a siatką 2x3 w tym kontekście?
donatello

19
Siatka 1x1 = 1 wiersz, 1 kolumna. Siatka 2x3 = 2 rzędy, 3 kolumny. Trzecia liczba zaczyna się od 1 i zwiększa od pierwszego wiersza. Aby uzyskać więcej informacji, zobacz dokumentację subplot ().
Christian Alis,

18
Jak wyjaśnili inni (ponad dwa lata temu), jest to spuścizna po matlabie. Ale ze względu na przyszłych czytelników powinieneś wiedzieć, że istnieje lepsza alternatywa, w postaci subplots()metody.
jarondl

26
Dokumentacja spuścizny subplot()jest tutaj i subplots()jest tutaj .
crayzeewulf

511

Myślę, że najlepiej to wyjaśnić następującym obrazem:

wprowadź opis zdjęcia tutaj

Aby zainicjować powyższe, należy wpisać:

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
Myślę, że wersja z przecinkami jest o wiele bardziej intuicyjna i czytelna niż wersja z trzycyfrowymi liczbami
endolith

Jest to świetne, ponieważ pokazuje, jak „pozycjonować wykresy podrzędne w siatce”, tak aby siatka 2x2 jak na powyższym zilustrowanym przykładzie lub siatka wykresów 4x4 itp. Ale czy ktoś może wyjaśnić, co determinuje wielkość wyświetlanych wykresów. Domyślne wartości dla (2,2,1) uważam za dość małe. Chciałbym, żeby to było dwukrotnie więcej lub więcej.
yoshiserry

7
To jest bardzo pomocne. To zdjęcie byłoby trochę ładniejsze, gdyby nie było kwadratowe (2x2), ale poza tym bardzo pomocne.
TravisJ,

@TravisJ Wow, co za zbieg okoliczności! Dokładnie tak samo myślałem o godzinie, zanim to napisałeś! Niedługo to zmienię :)
SaiyanGirl

7
Bardzo pomocna odpowiedź! Chociaż myślę, że edycja jest niedokładna. Zachowanie rozpinania podplotów za pomocą instrukcji takich jak 1: 2 lub [1 3] nie jest obsługiwane przez Matplotlib (przynajmniej nie w 1.5.0) i wydaje się, że jest to tylko Matlab. (Uwaga: Matplotlib ma inne możliwości osiągnięcia tego zachowania, np. Gridspec )
laboratorium

39

Odpowiedź Constantina jest na miejscu, ale dla większego tła to zachowanie jest dziedziczone z Matlaba.

Zachowanie Matlaba wyjaśniono w rozdziale Konfiguracja rysunku - Wyświetlanie wielu wykresów na rysunek w dokumentacji Matlaba.

podplot (m, n, i) rozbija okno figury na macierz m-by-n małych podplotów i wybiera tę podplot dla bieżącego wykresu. Wykresy są ponumerowane wzdłuż górnego rzędu okna figury, następnie drugiego rzędu i tak dalej.


2
To jest matplotlib, a nie matlab.
dom0

45
Wiele zachowań matplotlibs jest dziedziczonych z Matlaba. Ponieważ dokumentacja Matlaba była lepsza, pomyślałem, że może pomóc wyjaśnić, jak zachowuje się to wywołanie funkcji. Tak, masz rację, to (pytanie) dotyczy matplotlib. Dokumentacja podplotu matplotlib jest moim zdaniem mniej przejrzysta.
DaveTM

7
Dokumentacja MATLAB została przeniesiona .
dotancohen

20

Moje rozwiązanie to

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

Siatka 2x2 z połączeniem 1 i 3


15

wprowadź opis zdjęcia tutaj

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)

Pierwszy kod tworzy pierwszą podplot w układzie, który ma 3 wiersze i 2 kolumny.

Trzy wykresy w pierwszej kolumnie oznaczają 3 rzędy. Drugi wykres znajduje się tuż poniżej pierwszego wykresu w tej samej kolumnie i tak dalej.

Ostatnie dwa wykresy mają argumenty (2, 2)wskazujące, że druga kolumna ma tylko dwa rzędy, parametry pozycji przesuwają się w rzędzie.


10

fig.add_subplot(ROW,COLUMN,POSITION)

  • ROW = liczba rzędów
  • KOLUMNA = liczba kolumn
  • POSITION = pozycja wykreślanego wykresu

Przykłady

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

Łącznie są 2 wiersze, 1 kolumna, dlatego można wykreślić 2 wykresy podrzędne. Jego lokalizacja jest 1.. Łącznie są 2 wiersze, 1 kolumna, dlatego można wykreślić 2 wykresy podrzędne. Jego lokalizacja to 2. miejsce


2

Metoda add_subplot () ma kilka podpisów wywołania:

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

Połączenia 1 i 2:

Połączenia 1 i 2 osiągają to samo co inne (do limitu wyjaśnionego poniżej). Pomyśl o nich jako o pierwszym określeniu układu siatki za pomocą pierwszych 2 liczb (2x2, 1x8, 3x4 itd.), Np .:

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

Oba tworzą układ podplotów (3 x 4 = 12) podplotów w 3 rzędach i 4 kolumnach. Trzecia liczba każdego wywołania, który wskazuje powrót do osi przedmiotu, od 1 u góry na lewo, zwiększając w prawo .

Ten kod ilustruje ograniczenia korzystania z połączenia 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()

podploty

Możesz zobaczyć z wywołaniem 1 na LHS , możesz zwrócić dowolny obiekt osi, jednak przy wywołaniu 2 na RHS możesz powrócić tylko do indeksu = 9 renderujących podploty j), k) i l) niedostępne przy użyciu tego wywołania.

To znaczy ilustruje ten punkt z dokumentacji:

pos jest trzycyfrową liczbą całkowitą, gdzie pierwsza cyfra to liczba wierszy, druga liczba kolumn, a trzecia indeks wykresu cząstkowego. tj. rys. add_subplot (235) jest taki sam jak rys. add_subplot (2, 3, 5). Pamiętaj, że wszystkie liczby całkowite muszą być mniejsze niż 10, aby ten formularz działał .


Zadzwoń 3

W rzadkich przypadkach add_subplot można wywołać za pomocą pojedynczego argumentu, instancji osi podplotu już utworzonej na bieżącej figurze, ale nie na liście osi figury.


Zadzwoń 4 (od 3.1.0):

Jeśli nie zostaną przekazane argumenty pozycyjne, domyślnie jest to (1, 1, 1).

tj. odtworzenie połączenia fig.add_subplot(111)w pytaniu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.