Dalam Matplotlib, apa arti argumen di fig.add_subplot (111)?

472

Terkadang saya menemukan kode seperti ini:

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

Yang menghasilkan:

Contoh plot dihasilkan oleh kode yang disertakan

Saya sudah membaca dokumentasi seperti gila tapi saya tidak dapat menemukan penjelasan untuk 111. terkadang saya melihat a 212.

Apa arti argumen fig.add_subplot()itu?

senang di bawah
sumber

Jawaban:

470

Ini adalah parameter grid subplot yang dikodekan sebagai integer tunggal. Misalnya, "111" berarti "grid 1x1, subplot pertama" dan "234" berarti "grid 2x3, subplot ke-4".

Bentuk alternatif untuk add_subplot(111)is add_subplot(1, 1, 1).

Konstantin
sumber
18
Apakah ada dokumentasi terperinci tentang ini? Apa perbedaan antara kisi 1x1 dan kisi 2x3 dalam konteks ini?
donatello
19
1x1 kisi = 1 baris, 1 kolom. Kotak 2x3 = 2 baris, 3 kolom. Angka ketiga dimulai dari 1 dan menambah baris-pertama. Lihat dokumentasi subplot () untuk info lebih lanjut.
Christian Alis
18
Seperti yang dijelaskan orang lain (lebih dari dua tahun lalu), ini adalah warisan dari matlab. Tetapi demi pembaca masa depan, Anda harus tahu bahwa ada alternatif yang lebih baik, dalam bentuk subplots()metode.
jarondl
26
Dokumentasi warisan subplot()adalah di sini dan subplots()adalah di sini .
crayzeewulf
511

Saya pikir ini akan dijelaskan oleh gambar berikut:

masukkan deskripsi gambar di sini

Untuk menginisialisasi di atas, orang akan mengetik:

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
sumber
19
Saya pikir versi dengan koma jauh lebih intuitif dan mudah dibaca daripada versi dengan angka 3 digit
endolith
Ini bagus karena menunjukkan bagaimana "memposisikan subplot dalam kisi" menjadi kisi 2x2 seperti contoh ilustrasi di atas atau kisi grafik 4x4 dll. Tetapi bisakah seseorang tolong jelaskan apa yang menentukan ukuran grafik tersebut yang ditampilkan. Default untuk (2,2,1) saya temukan sangat kecil, saya ingin itu mungkin dua kali lipat atau lebih.
yoshiserry
7
Ini cukup membantu. Gambar ini akan sedikit lebih bagus jika tidak persegi (2x2) tetapi sangat membantu.
TravisJ
@ TravisJ Wow, kebetulan sekali! Saya memikirkan hal yang persis sama sekitar satu jam sebelum Anda menulis itu! Saya akan segera mengubahnya :)
SaiyanGirl
7
Jawaban yang sangat membantu! Padahal saya pikir hasil editnya tidak akurat. Perilaku untuk merentangkan subplot dengan pernyataan seperti 1: 2 atau [1 3] tidak didukung oleh Matplotlib (setidaknya tidak dalam 1.5.0), dan tampaknya hanya Matlab. (Perhatikan ada opsi lain di Matplotlib untuk mencapai perilaku ini, misalnya gridspec )
lab
39

Jawaban dari Konstantin sangat tepat tetapi untuk latar belakang yang lebih banyak perilaku ini diwarisi dari Matlab.

Perilaku Matlab dijelaskan dalam Pengaturan Gambar - Menampilkan Banyak Plot per bagian Gambar dari dokumentasi Matlab.

subplot (m, n, i) memecah jendela gambar menjadi matriks m-by-n dari subplot kecil dan memilihnya untuk subplot untuk plot saat ini. Plot diberi nomor di sepanjang baris atas jendela gambar, lalu baris kedua, dan sebagainya.

DaveTM
sumber
2
Ini matplotlib, bukan matlab.
dom0
45
Banyak perilaku matplotlibs diwarisi dari Matlab. Karena dokumentasi Matlab lebih baik saya pikir mungkin membantu menjelaskan bagaimana perilaku fungsi panggilan ini. Ya, Anda benar, (pertanyaan) ini berkenaan dengan matplotlib. The dokumentasi matplotlib subplot kurang jelas menurut saya.
DaveTM
7
Dokumentasi MATLAB telah pindah .
dotancohen
20

Solusi saya adalah

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

Kotak 2x2 dengan gabungan 1 dan 3

yoonghm
sumber
15

masukkan deskripsi gambar di sini

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)

Kode pertama membuat subplot pertama dalam tata letak yang memiliki 3 baris dan 2 kolom.

Tiga grafik di kolom pertama menunjukkan 3 baris. Plot kedua datang tepat di bawah plot pertama di kolom yang sama dan seterusnya.

Dua plot terakhir memiliki argumen yang (2, 2)menunjukkan bahwa kolom kedua hanya memiliki dua baris, parameter posisi bergerak dengan bijaksana.

Pritz
sumber
10

fig.add_subplot(ROW,COLUMN,POSITION)

  • ROW = jumlah baris
  • COLUMN = jumlah kolom
  • POSISI = posisi grafik yang Anda rencanakan

Contohnya

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

Ada total 2 baris, sehingga 1 kolom dapat disusun 2 subgraph. Lokasinya adalah 1. Ada total 2 baris, sehingga 1 kolom dapat dituliskan 2 subgraph. Lokasinya 2

Rameez Ahmad Dar
sumber
2

Metode add_subplot () memiliki beberapa tanda tangan panggilan:

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

Panggilan 1 dan 2:

Panggilan 1 dan 2 mencapai hal yang sama satu sama lain (hingga batas, dijelaskan di bawah). Pikirkan mereka sebagai yang pertama menentukan tata letak kotak dengan 2 angka pertama mereka (2x2, 1x8, 3x4, dll), misalnya:

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

Keduanya menghasilkan susunan subplot (3 x 4 = 12) subplot dalam 3 baris dan 4 kolom. Angka ketiga dalam setiap panggilan menunjukkan objek sumbu mana yang akan kembali, mulai dari 1 di kiri atas, meningkat ke kanan .

Kode ini menggambarkan batasan penggunaan panggilan 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()

subplot

Anda dapat melihat dengan panggilan 1 pada LHS Anda dapat mengembalikan objek sumbu apa pun, namun dengan panggilan 2 pada RHS Anda hanya dapat kembali ke indeks = 9 rendering subplot j), k), dan l) tidak dapat diakses menggunakan panggilan ini.

Yaitu menggambarkan hal ini dari dokumentasi:

pos adalah bilangan bulat tiga digit, di mana digit pertama adalah jumlah baris, yang kedua jumlah kolom, dan yang ketiga indeks subplot. yaitu fig.add_subplot (235) sama dengan fig.add_subplot (2, 3, 5). Perhatikan bahwa semua bilangan bulat harus kurang dari 10 agar formulir ini berfungsi .


Panggil 3

Dalam keadaan yang jarang terjadi, add_subplot dapat dipanggil dengan argumen tunggal, turunan sumbu subplot sudah dibuat pada gambar saat ini tetapi tidak dalam daftar sumbu gambar.


Panggilan 4 (sejak 3.1.0):

Jika tidak ada argumen posisi yang dilewatkan, default ke (1, 1, 1).

yaitu mereproduksi panggilan fig.add_subplot(111)dalam pertanyaan.

perusahaan
sumber