Mengapa banyak contoh menggunakan `fig, ax = plt.subplots ()` di Matplotlib / pyplot / python

267

Saya belajar menggunakan matplotlibdengan mempelajari contoh-contoh, dan banyak contoh tampaknya menyertakan garis seperti berikut sebelum membuat plot tunggal ...

fig, ax = plt.subplots()

Berikut ini beberapa contoh ...

Saya melihat fungsi ini banyak digunakan, meskipun contohnya hanya berusaha membuat grafik tunggal. Apakah ada keuntungan lain? Demo resmi untuk subplots()juga digunakan f, ax = subplotssaat membuat grafik tunggal, dan itu hanya referensi kapak setelah itu. Ini adalah kode yang mereka gunakan.

# Just a figure and one subplot
f, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('Simple plot')
neelshiv
sumber
11
baik, pendek, ringkas dan Anda mendapatkan referensi dua angka dan poros dalam satu langkah. Ini pythonic, karena itu indah :)
cel

Jawaban:

325

plt.subplots()adalah fungsi yang mengembalikan tupel yang berisi gambar dan objek sumbu. Jadi saat menggunakan fig, ax = plt.subplots()Anda membongkar tuple ini ke dalam variabel figdan ax. Memiliki figberguna jika Anda ingin mengubah atribut tingkat gambar atau menyimpan gambar sebagai file gambar nanti (misalnya dengan fig.savefig('yourfilename.png')). Anda tentu tidak harus menggunakan objek gambar yang dikembalikan tetapi banyak orang yang menggunakannya nanti jadi itu biasa dilihat. Juga, semua objek sumbu (objek yang memiliki metode merencanakan), tetap memiliki objek figur induk, dengan demikian:

fig, ax = plt.subplots()

lebih ringkas dari ini:

fig = plt.figure()
ax = fig.add_subplot(111)
Jonchar
sumber
8
Penjelasan yang sangat bagus. Berikut adalah dokumen di atasnya - matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.subplots
bretcj7
2
Mengapa kita selalu menggunakan 111 sebagai parameter di subplot?
Priyansh
@Priyansh karena diwarisi dari sintaks Matlab
pcko1
@ Pryansh Tidak selalu. Jika Anda ingin 4 grafik, Anda bisa ax11, ax12, ax21, ax22menggunakan fig.add_subplot(221)masing-masing (atau 222, 223, 224).
Guimoute
49

Hanya suplemen di sini.

Pertanyaan berikut adalah bagaimana jika saya ingin lebih banyak subplot dalam gambar?

Seperti yang disebutkan dalam Doc, kita dapat menggunakan fig = plt.subplots(nrows=2, ncols=2)untuk mengatur sekelompok subplot dengan kisi (2,2) dalam satu objek gambar.

Kemudian seperti yang kita ketahui, fig, ax = plt.subplots()mengembalikan tuple, mari kita coba fig, ax1, ax2, ax3, ax4 = plt.subplots(nrows=2, ncols=2)dulu.

ValueError: not enough values to unpack (expected 4, got 2)

Ini memunculkan kesalahan, tetapi tidak perlu khawatir, karena kita sekarang melihat bahwa plt.subplots()sebenarnya mengembalikan tupel dengan dua elemen. Yang pertama harus berupa objek gambar, dan yang lainnya harus berupa sekelompok objek subplot.

Jadi mari kita coba ini lagi:

fig, [[ax1, ax2], [ax3, ax4]] = plt.subplots(nrows=2, ncols=2)

dan periksa jenisnya:

type(fig) #<class 'matplotlib.figure.Figure'>
type(ax1) #<class 'matplotlib.axes._subplots.AxesSubplot'>

Tentu saja, jika Anda menggunakan parameter as (nrows = 1, ncols = 4), maka formatnya harus:

fig, [ax1, ax2, ax3, ax4] = plt.subplots(nrows=1, ncols=4)

Jadi ingatlah untuk menjaga konstruksi daftar tetap sama dengan kisi-kisi subplot yang kita atur pada gambar.

Semoga ini bisa membantu Anda.

Duskash
sumber
2
jangan lupa untuk menambahkan plt.tight_layout () jika subplot Anda memiliki judul
gota
12
Bagaimana jika Anda memiliki banyak subplot? Lebih mudah melakukannya dengan cara ini: fig, axes = plt.subplots(nrows=10, ncols=3)dan axes = axes.flatten(). Sekarang Anda dapat merujuk ke masing-masing petak dengan indeks: axes[0], axes[1], ...
Guillaume
Bagaimana jika saya ingin salah satu subplot tersebut menjangkau beberapa col atau baris? apakah bisa dilakukan dengan perintah subplot?
gota
1
@ BallpointBen Saya tidak yakin itu berfungsi jika nrows=1, saat itu axesdikembalikan datar dengan panjang sama denganncols
Ben
1
@BallpointBen Baru sadar Anda dapat memperbaikinya dengan melakukan:fig, axes = plt.subplots(nrows=1, ncols=3, squeeze=False)
Ben
15

Sebagai tambahan untuk pertanyaan dan jawaban di atas ada juga perbedaan penting antara plt.subplots()dan plt.subplot(), perhatikan yang hilang 's'di akhir.

Satu dapat digunakan plt.subplots()untuk membuat semua subplot mereka sekaligus dan mengembalikan gambar dan sumbu (jamak sumbu) dari subplot sebagai tuple. Sosok dapat dipahami sebagai kanvas tempat Anda melukis sketsa Anda.

# create a subplot with 2 rows and 1 columns
fig, ax = plt.subplots(2,1)

Sedangkan, Anda dapat menggunakan plt.subplot()jika Anda ingin menambahkan subplot secara terpisah. Hanya mengembalikan sumbu dari satu subplot.

fig = plt.figure() # create the canvas for plotting
ax1 = plt.subplot(2,1,1) 
# (2,1,1) indicates total number of rows, columns, and figure number respectively
ax2 = plt.subplot(2,1,2)

Namun, plt.subplots()lebih disukai karena memberi Anda pilihan lebih mudah untuk langsung menyesuaikan seluruh gambar Anda

# for example, sharing x-axis, y-axis for all subplots can be specified at once
fig, ax = plt.subplots(2,2, sharex=True, sharey=True)

Sumbu bersama sedangkan, dengan plt.subplot(), kita harus menentukan secara individual untuk setiap sumbu yang dapat menjadi rumit.

Light_B
sumber
1
baris kode Anda ax3 = plt.subplot(2,1,3) tidak akan berfungsi karena 2 per 1, yang hanya memiliki 2 grafik.
Cloud Cho
1
terima kasih, perbaiki. Ada perubahan lain yang diperlukan di blok kode terakhir.
Light_B
3

Selain jawaban di atas, Anda dapat memeriksa jenis objek menggunakan type(plt.subplots())yang mengembalikan tuple, di sisi lain, type(plt.subplot())mengembalikan matplotlib.axes._subplots.AxesSubplotyang Anda tidak bisa membongkar.

John T
sumber
4
Selamat Datang di Stack Overflow! Ini benar-benar komentar, bukan jawaban. Dengan sedikit rep, Anda dapat memposting komentar . Terima kasih!
Miroslav Glamuzina