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 -
Apa perbedaan antara ketiganya, maksud saya apa yang terjadi di balik terpal ketika salah satu dari 3 metode dipanggil?
Metode mana yang harus digunakan kapan dan apa pro dan kontra dari penggunaannya?
python
matplotlib
hashcode55
sumber
sumber
Jawaban:
Metode 1
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
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()
Contoh lainnya:
sumber
matplotlib
bahasa 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 yangsubplots()
akan mengembalikanAxes
objek pada satufigure
.Nama-nama benda
Matplotlib sangat berorientasi pada objek dan objek utamanya adalah gambar dan sumbu (menurut saya namanya
axes
agak 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
,.hist
dll) untuk segala sesuatu, sebagian besar. Anda dapat menempatkan satu, dua, ... banyak sumbu di dalam gambar menggunakan salah satu dari banyak metode berbeda.The
plt
antarmukaThe 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 ahidden_axes.plot
dan aplt.savefig
adalah ahidden_figure.savefig
.Setiap saat Anda dapat menangani objek-objek tersembunyi ini dengan menggunakan
plt.gcf
danplt.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
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 ...
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.
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.scatter
dalam konteks sesi interaktif, mungkin menggunakan IPython dengan%matplotlib
perintah ajaibnya, dan juga dalam konteks notebook Jupyter eksplorasi.Di sisi lain pendekatan berorientasi objek, ditambah beberapa
plt
metode kemudahan, adalah cara yang harus ditempuhAda area abu-abu besar di antara kedua ekstrem ini dan jika Anda bertanya kepada saya apa yang harus dilakukan, saya hanya akan mengatakan "Tergantung" ...
sumber
fig, ax = plt.subplot()
idiom ketika mereka tidak menginginkan subplot. Dalam kasus seperti itu saya menemukan gaya "prosedural" lebih mudah. "Tapi mungkin hanya aku ..." :-)