Apa perbedaan antara menggambar plot menggunakan plot, sumbu atau gambar di matplotlib?

106

Saya agak bingung apa yang terjadi di backend ketika saya menggambar plot di matplotlib, tbh, saya tidak jelas dengan hierarki plot, sumbu dan gambar. Saya membaca dokumentasinya dan itu membantu tetapi saya masih bingung ...

Kode di bawah ini menggambar plot yang sama dengan tiga cara berbeda -

#creating the arrays for testing
x = np.arange(1, 100)
y = np.sqrt(x)
#1st way
plt.plot(x, y)
#2nd way
ax = plt.subplot()
ax.plot(x, y)
#3rd way
figure = plt.figure()
new_plot = figure.add_subplot(111)
new_plot.plot(x, y)

Sekarang pertanyaan saya adalah -

  1. Apa perbedaan antara ketiganya, maksud saya apa yang terjadi di balik terpal ketika salah satu dari 3 metode dipanggil?

  2. Metode mana yang harus digunakan kapan dan apa pro dan kontra dari penggunaannya?

hashcode55
sumber
8
Saya sudah membacanya tetapi saya tidak menemukan jawabannya sama sekali. Ini menjelaskan hierarki, tetapi juga menimbulkan kebingungan mengapa tidak ada cara konvensional, mengapa objek gambar malah diekspos?
kode
Saya tidak yakin apakah Anda merujuk dokumentasi yang tepat ini matplotlib.org/users/artists.html . Ini menjawab pertanyaan Anda tentang mengapa angka terekspos. Secara pribadi, ini adalah penjelasan matplotlib terbaik yang saya temukan. Objek gambar memungkinkan Anda untuk menambahkan Artis Anda sendiri secara langsung tanpa sumbu meskipun ini jarang digunakan kecuali Anda ingin mengubah "patch" dari gambar itu sendiri, dll. Perhatikan bahwa gambar adalah wadah induk dan host sumbu & artis.
Sandeep

Jawaban:

58

Metode 1

plt.plot(x, y)

Ini memungkinkan Anda memplot hanya satu gambar dengan koordinat (x, y). Jika Anda hanya ingin mendapatkan satu grafik, Anda bisa menggunakan cara ini.

Metode 2

ax = plt.subplot()
ax.plot(x, y)

Ini memungkinkan Anda memplot satu atau beberapa gambar di jendela yang sama. Saat Anda menulisnya, Anda hanya akan menggambar satu gambar, tetapi Anda dapat membuat sesuatu seperti ini:

fig1, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)

Anda akan memplot 4 gambar yang diberi nama ax1, ax2, ax3 dan ax4 masing-masing tetapi pada jendela yang sama. Jendela ini hanya akan dibagi menjadi 4 bagian dengan contoh saya.

Metode 3

fig = plt.figure()
new_plot = fig.add_subplot(111)
new_plot.plot(x, y)

Saya tidak menggunakannya, tetapi Anda dapat menemukan dokumentasi.

Contoh:

import numpy as np
import matplotlib.pyplot as plt

# Method 1 #

x = np.random.rand(10)
y = np.random.rand(10)

figure1 = plt.plot(x,y)

# Method 2 #

x1 = np.random.rand(10)
x2 = np.random.rand(10)
x3 = np.random.rand(10)
x4 = np.random.rand(10)
y1 = np.random.rand(10)
y2 = np.random.rand(10)
y3 = np.random.rand(10)
y4 = np.random.rand(10)

figure2, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
ax1.plot(x1,y1)
ax2.plot(x2,y2)
ax3.plot(x3,y3)
ax4.plot(x4,y4)

plt.show()

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Contoh lainnya:

masukkan deskripsi gambar di sini

Essex
sumber
@ hashcode55 setiap angka adalah independen. Saya akan menunjukkan sebuah contoh
Essex
1
@ hashcode55 Saya akan mengedit dengan sebuah contoh (hanya gambar dari penelitian saya di Astrofisika, skrip terlalu panjang (1300 baris));) Setiap gambar independen;)
Essex
3
Saya tahu ini rewel, tapi saya melakukannya karena matplotlibbahasa membingungkan saya, dan pertanyaan ini muncul saat menelusuri tentang "sumbu vs. gambar di matplotlib". Untuk noobs lain, pertanyaan ini membantu menjawabnya. Saya pikir kata-kata di sini bisa lebih jelas yang subplots()akan mengembalikan Axesobjek pada satu figure.
Hendy
40

Nama-nama benda

Matplotlib sangat berorientasi pada objek dan objek utamanya adalah gambar dan sumbu (menurut saya namanya axesagak menyesatkan, tapi mungkin hanya saya).

Anda dapat menganggap gambar sebagai kanvas , yang biasanya Anda tentukan dimensinya dan mungkin misalnya, warna latar belakang dll. Anda menggunakan kanvas, gambar tersebut , pada dasarnya dalam dua cara, menempatkan objek lain di atasnya (kebanyakan sumbu , tetapi juga label teks dll) dan menyimpan isinya dengan savefig.

Anda dapat memikirkan sebuah kapak sebagai semacam pisau Swiss Army, benda berguna yang menawarkan alat (misalnya .plot, .scatter, .histdll) untuk segala sesuatu, sebagian besar. Anda dapat menempatkan satu, dua, ... banyak sumbu di dalam gambar menggunakan salah satu dari banyak metode berbeda.

The pltantarmuka

The plt antarmuka prosedural pada awalnya dikembangkan untuk meniru MATLAB ™ antarmuka tetapi tidak benar-benar berbeda dari antarmuka berorientasi objek, bahkan jika Anda tidak membuat referensi langsung ke objek utama (yaitu, tokoh dan sumbu ) benda-benda yang secara otomatis dipakai dan setiap metode plt , pada dasarnya, diterjemahkan ke panggilan salah satu metode objek fundamental yang mendasarinya: misalnya, a plt.plot()adalah a hidden_axes.plotdan a plt.savefigadalah a hidden_figure.savefig.

Setiap saat Anda dapat menangani objek-objek tersembunyi ini dengan menggunakan plt.gcfdan plt.gca, dan ini kadang-kadang diperlukan ketika salah satu metode objek belum dipindahkan ke metode di namespace plt .

Saya ingin menambahkan bahwa namespace plt juga berisi sejumlah metode praktis untuk membuat instance, dengan cara yang berbeda, gambar dan sumbu .

Contoh Anda

Cara pertama

plt.plot(x, y)

Di sini Anda hanya menggunakan antarmuka plt , Anda hanya dapat menggunakan satu sumbu di setiap gambar , tetapi inilah yang Anda inginkan saat melakukan eksplorasi data Anda, resep cepat yang menyelesaikan pekerjaan ...

Cara kedua

ax = plt.subplot()
ax.plot(x, y)

Di sini Anda menggunakan metode praktis di namespace plt untuk memberi nama (dan pegangan) ke objek sumbu Anda , tetapi btw juga ada gambar tersembunyi . Anda nantinya dapat menggunakan objek sumbu untuk membuat plot, membuat histogram, dll., Semua hal yang dapat Anda lakukan dengan antarmuka plt , tetapi Anda juga dapat mengakses semua atributnya dan memodifikasinya dengan kebebasan yang lebih besar.

Cara ke-3

figure = plt.figure()
new_plot = figure.add_subplot(111)
new_plot.plot(x, y)

Di sini Anda mulai membuat instance gambar menggunakan metode praktis di namespace plt dan kemudian Anda hanya menggunakan antarmuka berorientasi objek.

Dimungkinkan untuk melewati metode kenyamanan plt ( matplotlib.figure.Figure) tetapi Anda kemudian harus menyesuaikan gambar untuk pengalaman interaktif yang lebih baik (bagaimanapun, ini adalah metode kenyamanan ).

Rekomendasi pribadi

Saya sarankan telanjang plt.plot, plt.scatterdalam konteks sesi interaktif, mungkin menggunakan IPython dengan %matplotlibperintah ajaibnya, dan juga dalam konteks notebook Jupyter eksplorasi.

Di sisi lain pendekatan berorientasi objek, ditambah beberapa plt metode kemudahan, adalah cara yang harus ditempuh

  • jika Anda memiliki masalah permanen untuk diselesaikan sekali untuk semua dengan pengaturan subplot yang disesuaikan dengan baik,
  • jika Anda ingin menanamkan Matplotlib di UI program yang Anda tulis.

Ada area abu-abu besar di antara kedua ekstrem ini dan jika Anda bertanya kepada saya apa yang harus dilakukan, saya hanya akan mengatakan "Tergantung" ...

gboffi.dll
sumber
2
"Menurutku nama sumbu agak menyesatkan, tapi mungkin itu hanya aku" - tidak, ini aku juga. Tidak bisa diubah.
Laring Decidua
1
Hal lain yang saya tidak mengerti mengapa orang menggunakan fig, ax = plt.subplot()idiom ketika mereka tidak menginginkan subplot. Dalam kasus seperti itu saya menemukan gaya "prosedural" lebih mudah. "Tapi mungkin hanya aku ..." :-)
Laryx Decidua
@LaryxDecidua Saya bisa langsung melihat dua alasan bagus ① "Eksplisit lebih baik daripada implisit" ② Anda ingin menggunakan metode Gambar atau Sumbu yang tidak tersedia dalam API prosedural - tetapi mungkin ada
alasan
Ya, saya berlangganan sepenuhnya 1). Re 2): sebagian besar waktu API prosedural sudah cukup. Pada akhirnya, saya pikir itu bermuara pada preferensi pribadi - sesuatu yang tidak boleh diperdebatkan :-)
Laryx Decidua