Matplotlib'de arsa, eksen veya şekil kullanarak çizim çizimleri arasındaki fark nedir?


101

Matplotlib, tbh'de grafikler çizdiğimde arka planda neler olup bittiğini biraz karıştırdım, arsa, eksenler ve figür hiyerarşisi konusunda net değilim. Belgeleri okudum ve yardımcı oldu ama hala kafam karıştı ...

Aşağıdaki kod aynı grafiği üç farklı şekilde çizer -

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

Şimdi sorum şu -

  1. Üçü arasındaki fark nedir, yani 3 yöntemden herhangi biri çağrıldığında kaputun altına ne oluyor?

  2. Bunları kullanmanın artıları ve eksileri ne zaman ve ne zaman kullanılmalıdır?


8
Bunu zaten okudum ama cevabı hiç tatmin edici bulmadım. Hiyerarşiyi açıklıyor, ama aynı zamanda kafa karışıklığını da artırıyor, neden geleneksel bir yol yok, figür nesnesi neden açığa çıktı?
hashcode55

Bu belgeye matplotlib.org/users/artists.html tam olarak atıfta bulunup bulunmadığınızdan emin değilim . Bu, figürün neden ortaya çıktığı sorunuzu yanıtlıyor. Şahsen bu, bulduğum matplotlib'in en iyi açıklaması. Şekil nesnesi, kendi Sanatçılarınızı eksenler olmadan doğrudan eklemenizi sağlar, ancak bu, figürün kendisinin "yaması" nı değiştirmek istemediğiniz sürece nadiren kullanılır. Figürün ana kap olduğunu ve eksenleri ve sanatçıları barındırdığını unutmayın.
Sandeep

Yanıtlar:


55

Yöntem 1

plt.plot(x, y)

Bu, (x, y) koordinatlarına sahip tek bir rakamı çizmenizi sağlar. Sadece bir grafik almak istiyorsanız, bu şekilde kullanabilirsiniz.

Yöntem 2

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

Bu, aynı pencerede bir veya birkaç şekli çizmenize olanak tanır. Yazarken, sadece bir figür çizeceksiniz, ancak şöyle bir şey yapabilirsiniz:

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

Ax1, ax2, ax3 ve ax4 isimli 4 figürü aynı pencerede çizeceksiniz. Bu pencere benim örneğimle 4 kısma bölünecek.

Yöntem 3

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

Ben kullanmadım ama belgeleri bulabilirsiniz.

Misal:

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

görüntü açıklamasını buraya girin görüntü açıklamasını buraya girin

Diğer örnek:

görüntü açıklamasını buraya girin


@ hashcode55 her şekil bağımsızdır. Size bir örnek göstereceğim
Essex

1
@ hashcode55 Bir örnekle düzenleme yapacağım (sadece Astrofizik araştırmalarımdan elde ettiğim rakam, senaryo çok uzun (1300 satır);) Her rakam bağımsız;)
Essex

3
Bunun çok titiz olduğunu biliyorum, ama bunu matplotlibdil kafamı karıştırdığı için yapıyorum ve bu soru "matplotlib'de eksenlere karşı şekil" hakkında arama yaparken ortaya çıkıyor. Diğer çaylaklar için bu soru buna cevap vermeye yardımcı oldu. Sanırım buradaki ifadeler subplots(), Axesnesneleri tek seferde döndürecek şekilde daha net olabilir figure.
Hendy

35

Nesnelerin isimleri

Matplotlib güçlü bir şekilde nesne yönelimli ve ana nesneleri şekil ve eksenlerdir (adı axesbiraz yanıltıcı buluyorum , ama muhtemelen sadece benim).

Figürü , tipik olarak boyutlarını ve muhtemelen örneğin arka plan rengini vb. Belirlediğiniz bir tuval olarak düşünebilirsiniz. Tuvali, şekli esasen iki şekilde, üzerine diğer nesneleri yerleştirerek (çoğunlukla eksenler , ancak ayrıca metin etiketleri vb.) ve içeriğini kaydetme savefig.

Bir düşünebiliriz eksenleri İsviçre çakısı bir tür, bu teklif bir araç (örneğin kullanışlı nesne olarak .plot, .scatter, .histher şey için vs), çoğunlukla. Birçok farklı yöntemden birini kullanarak bir şeklin içine bir , iki, ... birçok eksen yerleştirebilirsiniz .

pltarayüzey

Plt prosedürel arayüz başlangıçta MATLAB ™ arayüzü taklit için geliştirilmiştir ancak ana nesnelere doğrudan başvuru yapmazlar bile, nesne yönelimli arayüzünden gerçekten farklı değildir (yani, bir figür ve bir eksenler ) bu nesnelerdir otomatik olarak somutlaştırılır ve her plt yöntemi, esasen, temeldeki temel nesnelerin yöntemlerinden birinin bir çağrısına çevrilir: örneğin, a plt.plot(), a'dır hidden_axes.plotve a plt.savefig, a'dır hidden_figure.savefig.

Her an kullanmakta bu gizli nesneler üzerinde bir kolu olabilir plt.gcfve plt.gcave nesne yöntemlerinden biri bir yönteme taşınmadıysa bu bazen gereklidir plt ad.

Plt ad alanının ayrıca farklı şekillerde, şekil ve eksenlerde somutlaştırmak için bir dizi kolaylık yöntemi içerdiğini eklemek isterim .

Örnekleriniz

1. yol

plt.plot(x, y)

Burada sadece kullanmak plt arayüzü, yalnızca tek bir kullanabilir eksenlerini her figür , ancak verilerin keşif, yapılan işi alır hızlı bir tarifi yapıyoruz bu ne istediğiniz değil ...

2. yol

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

Burada , axes nesnenize bir ad (ve tutamaç) vermek için plt ad alanında bir kolaylık yöntemi kullanırsınız , ancak btw'de gizli bir şekil de vardır . Daha sonra , plt arayüzüyle yapabileceğiniz her şeyi çizmek, histogram oluşturmak vb . İçin axes nesnesini kullanabilirsiniz , ancak aynı zamanda tüm özelliklerine erişebilir ve daha fazla özgürce değiştirebilirsiniz.

3. yol

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

Burada , plt ad alanında bir kolaylık yöntemini kullanarak bir şekil başlatmaya başlarsınız ve daha sonra yalnızca nesne yönelimli arabirimi kullanırsınız.

Plt uygunluk yöntemini ( matplotlib.figure.Figure) atlamak mümkündür, ancak daha sonra daha iyi bir etkileşimli deneyim için rakamı ayarlamanız gerekir (sonuçta bu bir kolaylık yöntemidir).

Kişisel tavsiyeler

Ben çıplak önermek plt.plot, plt.scattermuhtemelen kullanarak, interaktif oturumda bağlamında IPython onun ile %matplotlibbir keşif Jupyter dizüstü bağlamında da sihirli komuta ve.

Öte yandan, nesne yönelimli yaklaşım artı birkaç plt kolaylık yöntemi, gidilecek yoldur

  • ince ayarlanmış alt parçaların özelleştirilmiş bir düzenlemesiyle bir kez çözmeniz gereken kalıcı bir sorununuz varsa,
  • Matplotlib'i yazdığınız bir programın UI'sına gömmek istiyorsanız.

Bu uç noktalar arasında büyük bir gri alan var ve ne yapmam gerektiğini sorarsan, "Duruma göre değişir" derim ...


2
"İsim eksenlerini biraz yanıltıcı buluyorum, ama muhtemelen sadece benim" - hayır, o da benim. Yine de değiştirilemez.
Laryx Desidua

1
İnsanlar kullanmamın nedeni başka şey sadece anlayamıyorum fig, ax = plt.subplot()onlar ne zaman deyim yok subplots istiyorum. Bu tür durumlarda "prosedürel" tarzı daha kolay buldum. "Ama muhtemelen sadece benim ..." :-)
Laryx Decidua

@LaryxDecidua Hemen iki iyi neden görebiliyorum ① "Açıkça örtük olmaktan iyidir" ② Yöntemsel API'de bulunmayan Figure veya Axes yöntemlerini kullanmak istiyorsunuz - ancak muhtemelen başkaları da var…
gboffi

Evet, 1) 'e tamamen abone oluyorum. Re 2): Çoğu zaman prosedürel API yeterlidir. Günün sonunda, kişisel tercihlere bağlı olduğunu düşünüyorum - tartışılmaması gereken bir şey :-)
Laryx Decidua
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.