Neden birçok örnek Matplotlib / pyplot / python'da `fig, ax = plt.subplots () 'kullanıyor?


267

matplotlibÖrnekleri inceleyerek kullanmayı öğreniyorum ve birçok örnek tek bir arsa oluşturmadan önce aşağıdaki gibi bir çizgi içeriyor gibi görünüyor ...

fig, ax = plt.subplots()

İşte bazı örnekler ...

Örnek sadece tek bir grafik oluşturmaya çalışsa bile bu işlevin çok kullanıldığını görüyorum. Başka bir avantajı var mı? Resmi demo, tek bir grafik oluştururken subplots()de kullanılır f, ax = subplotsve bundan sonra baltaya referans verir. Kullandıkları kod bu.

# Just a figure and one subplot
f, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('Simple plot')

11
kısa, özlü ve tek bir adımda hem şekil hem de eksen referans iki olsun. Pythonic, çünkü güzel :)
cel

Yanıtlar:


325

plt.subplots(), şekil ve eksen nesnelerini içeren bir demet döndüren bir işlevdir. Böylece kullanırken fig, ax = plt.subplots()bu tuple değişkenleri açmak figve ax. figŞekil düzeyindeki öznitelikleri değiştirmek veya daha sonra figürü bir görüntü dosyası olarak kaydetmek istiyorsanız (örneğin fig.savefig('yourfilename.png')) sahip olmak yararlıdır . Kesinlikle döndürülen şekil nesnesini kullanmak zorunda değilsiniz, ancak birçok kişi bunu daha sonra kullanıyor, bu yüzden görmek yaygın. Ayrıca, tüm eksen nesneleri (çizim yöntemlerine sahip nesneler), yine de bir üst şekil nesnesine sahiptir, bu nedenle:

fig, ax = plt.subplots()

bundan daha özlü:

fig = plt.figure()
ax = fig.add_subplot(111)

8
Çok iyi bir açıklama. İşte doktor - matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.subplots
bretcj7

2
Neden her zaman alt grafikte parametre olarak 111 kullanıyoruz?
Priyansh

@Priyansh çünkü Matlab sözdiziminden devralındı
pcko1

@Priyansh Her zaman değil. 4 grafik istiyorsanız (veya sırasıyla 222, 223, 224) ax11, ax12, ax21, ax22kullanarak sahip olabilirsiniz fig.add_subplot(221).
Guimoute

49

Sadece bir ek.

Aşağıdaki soru, şekilde daha fazla alt grafik istersem ne olur?

Doküman'da belirtildiği gibi, fig = plt.subplots(nrows=2, ncols=2)bir şekil nesnesindeki ızgaralı (2,2) bir grup alt grafik ayarlamak için kullanabiliriz .

Sonra bildiğimiz gibi, fig, ax = plt.subplots()bir demet döndürür, fig, ax1, ax2, ax3, ax4 = plt.subplots(nrows=2, ncols=2)ilk önce deneyelim .

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

Bu bir hata yaratır, ancak endişelenmeyin, çünkü şimdi plt.subplots()aslında iki öğeli bir demet döndürdüğünü görüyoruz . Birincisi bir şekil nesnesi, diğeri bir grup alt grafik nesnesi olmalıdır.

Şimdi tekrar deneyelim:

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

ve türü kontrol edin:

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

Elbette, parametreleri (nrows = 1, ncols = 4) olarak kullanırsanız, biçim şu şekilde olmalıdır:

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

Bu nedenle, listenin yapısını şekilde ayarladığımız alt grafikler ızgarasıyla aynı tutmayı unutmayın.

Umarım bu sizin için yararlı olur.


2
alt grafiklerinizin başlıkları varsa plt.tight_layout () eklemeyi unutmayın
gota

12
Çok fazla alt alanınız varsa ne olur? Bu şekilde yapmak daha kolaydır: fig, axes = plt.subplots(nrows=10, ncols=3)ve axes = axes.flatten(). Şimdi onun dizine göre her subplot başvurabilirsiniz: axes[0], axes[1], ...
Guillaume

Bu alt grafiklerden birinin birden çok sütun veya satıra yayılmasını istersem ne olur? subplots komutu ile yapılabilir mi?
gota

1
@BallpointBen O nrows=1zamanki gibi axesdüz olarak döndürülürse işe yarayacağından emin değilimncols
Ben

1
@BallpointBen Yaparak bunu düzeltebileceğinizi fark ettim:fig, axes = plt.subplots(nrows=1, ncols=3, squeeze=False)
Ben

15

Sorusuna cevap yukarıda ek olarak ayrıca arasında önemli bir fark vardır plt.subplots()ve plt.subplot()eksik Bildirimi 's'sonunda.

plt.subplots()Tüm alt grafiklerini bir kerede yapmak için kullanılabilir ve alt grafiklerin şeklini ve eksenlerini (eksenin çoğunu) bir demet olarak döndürür. Bir şekil, çiziminizi boyadığınız bir tuval olarak anlaşılabilir.

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

Oysa, plt.subplot()alt grafikleri ayrı ayrı eklemek istiyorsanız kullanabilirsiniz. Yalnızca bir alt grafiğin eksenini döndürür.

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)

Ancak, plt.subplots()tüm figürünüzü doğrudan özelleştirmek için daha kolay seçenekler sağladığı için tercih edilir

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

Paylaşılan eksenler oysa, plt.subplot()hantal olabilen her eksen için ayrı ayrı belirtmek gerekecektir.


1
kod satırınız ax3 = plt.subplot(2,1,3) çalışmaz, çünkü yalnızca 2 grafiği olan 2'ye 1'dir.
Cloud Cho

1
teşekkürler, düzelttim. Son kod bloğunda başka bir değişiklik yapılması gerekiyordu.
Light_B

3

Yukarıdaki cevaplara ek olarak, type(plt.subplots())bir demet döndüren nesneyi kontrol edebilirsiniz , diğer taraftan açamadığınız type(plt.subplot())döndürür matplotlib.axes._subplots.AxesSubplot.


4
Stack Overflow'a hoş geldiniz! Bu gerçekten bir yorum, cevap değil. Biraz daha rep ile yorum gönderebileceksiniz . Teşekkürler!
Miroslav Glamuzina
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.