Matplotlib kullanarak tek bir sayfada birden fazla grafik nasıl yapılır?


92

Aynı anda 16 rakam açan bir kod yazdım. Şu anda hepsi ayrı grafikler olarak açılıyor. Hepsini aynı sayfada açmalarını istiyorum. Aynı grafik değil. Tek bir sayfada / pencerede 16 ayrı grafik istiyorum. Ayrıca bazı nedenlerden ötürü, numbinlerin ve defaultreallimits'in formatı, önceki şekil 1'i tutmuyor. Subplot komutunu kullanmam gerekir mi? Neden mecbur olduğumu anlamıyorum ama başka ne yapacağımı anlayamıyorum?

import csv
import scipy.stats
import numpy
import matplotlib.pyplot as plt

for i in range(16):
    plt.figure(i)
    filename= easygui.fileopenbox(msg='Pdf distance 90m contour', title='select file', filetypes=['*.csv'], default='X:\\herring_schools\\')
    alt_file=open(filename)    
    a=[]
    for row in csv.DictReader(alt_file):
        a.append(row['Dist_90m(nmi)'])
    y= numpy.array(a, float)    
    relpdf=scipy.stats.relfreq(y, numbins=7, defaultreallimits=(-10,60))
    bins = numpy.arange(-10,60,10)
    print numpy.sum(relpdf[0])
    print bins
    patches=plt.bar(bins,relpdf[0], width=10, facecolor='black')
    titlename= easygui.enterbox(msg='write graph title', title='', default='', strip=True, image=None, root=None)
    plt.title(titlename)
    plt.ylabel('Probability Density Function')
    plt.xlabel('Distance from 90m Contour Line(nm)')
    plt.ylim([0,1])

plt.show()

Yanıtlar:


17

Ana sorunuzu cevaplamak için, subplot komutunu kullanmak istiyorsunuz . Ben değişiyor düşünüyorum plt.figure(i)için plt.subplot(4,4,i+1)çalışmalıdır.


202

Bir şekilde OP tarafından kabul edilen cevap olan las3rjock'un cevabı yanlış - kod çalışmıyor ve matplotlib sözdizimi geçerli değil; bu cevap çalıştırılabilir bir kod sağlamaz ve OP'nin OP'deki sorunu çözmek için kendi kodunu yazarken faydalı bulabileceği herhangi bir bilgi veya öneriden yoksundur.

Bunun kabul edilen yanıt olduğu ve şimdiden birkaç olumlu oy aldığı göz önüne alındığında, sanırım biraz yapısöküm yapılması gerekiyor.

İlk olarak, çağıran subplot yok değil size birden araziler vermek; alt plan, tek bir arsa oluşturmanın yanı sıra birden çok arsa oluşturmak için çağrılır. Ayrıca, "plt.figure (i) 'yi değiştirmek" doğru değildir.

plt.figure () (burada plt veya PLT genellikle matplotlib'in pyplot kitaplığıdır ve global bir değişken, plt veya bazen PLT olarak içe aktarılır ve geri döner :

from matplotlib import pyplot as PLT

fig = PLT.figure()

hemen üstündeki çizgi bir matplotlib şekil örneği oluşturur; bu nesnenin add_subplot yöntemi daha sonra her çizim penceresi için çağrılır (gayri resmi olarak tek bir alt grafik içeren bir x & y eksenini düşünün). Oluşturursunuz (bir sayfada bir veya birkaç sayfa için), bunun gibi

fig.add_subplot(111)

bu sözdizimi eşdeğerdir

fig.add_subplot(1,1,1)

sizin için mantıklı olanı seçin.

Aşağıda, bir sayfada biri diğerinin üzerinde iki arsa çizmek için kodu listeledim. Biçimlendirme, add_subplot'a iletilen bağımsız değişken aracılığıyla yapılır . Argümanın ilk olay örgüsü için ( 211 ) ve ikincisi için ( 212 ) olduğuna dikkat edin .

from matplotlib import pyplot as PLT

fig = PLT.figure()

ax1 = fig.add_subplot(211)
ax1.plot([(1, 2), (3, 4)], [(4, 3), (2, 3)])

ax2 = fig.add_subplot(212)
ax2.plot([(7, 2), (5, 3)], [(1, 6), (9, 5)])

PLT.show()

Bu iki bağımsız değişkenin her biri, ilgili çizim pencerelerini sayfaya doğru şekilde yerleştirmek için eksiksiz bir özelliktir.

211 (yine, (2,1,1) iki satır ve bir sütun anlamına geldiği için 3-tuple biçiminde de yazılabilir çizim penceresi ; üçüncü hane, o belirli alt çizim penceresinin diğer alt grafik pencerelerine göre belirtir. -bu durumda, bu ilk arsa (onu 1. sıraya yerleştirir) dolayısıyla 1. sıra, 1. sıra sütun 1.

Add_subplot için ikinci çağrıya geçirilen argüman yalnızca sondaki rakamla farklılık gösterir (1 yerine 2, çünkü bu grafik ikinci çizimdir (satır 2, sütun 1).

Daha fazla konuya sahip bir örnek: Bunun yerine dört tane istersen grafik bir sayfada 2x2'lik bir matris yapılandırmasında çizim istiyorsanız, add_subplot yöntemini dört kez çağırır ve bu dört bağımsız değişkeni (221), (222), (223) ve ( 224), bir sayfada saat 10, 2, 8 ve 4'te sırasıyla ve bu sırada dört grafik oluşturmak için.

Dört bağımsız değişkenin her birinin, 2 x 2 yapılandırmasını kodlayan, yani iki satır ve iki sütun olmak üzere iki öncü 2 içerdiğine dikkat edin.

Dört bağımsız değişkenin her birindeki üçüncü (en sağdaki) rakam, 2 x 2 matristeki söz konusu çizim penceresinin sırasını kodlar - yani satır 1 sütun 1 (1), satır 1 sütun 2 (2), satır 2 sütun 1 (3), sıra 2 sütun 2 (4).


1
add_subplot, küçük sayıdaki alt noktalar için tek bir tamsayı argümanı alabilir, ancak 9'dan fazla alt noktaya ihtiyacınız olduğunda, diğer yanıtların 3 ayrı tamsayı argümanı alan versiyonunu kullanmalısınız.
user1244215

1
fig.add_axes(rect)yerine kullanabilir miyim add_subplot?
Alcott

16
PLT? Bunun daha önce kullanıldığını hiç görmedim
Darshan Chaudhary

3
Buradaki ilk paragrafınız açık bir şekilde yanlıştır, çünkü çalıştırarak doğrulayabileceğiniz for i in range(16): plt.subplot(4, 4, i+1)ve sözdizimi hatası gözlemlemeyebilirsiniz. Cevap kabul edildi çünkü muhtemelen OP'nin istediğini yaptı.
chthonicdaemon

3
Bu güzel bir çözüm. Ama döngü için bir değişken kullanmak istersem, nasıl yapılır?
Pengju Zhao

83

Bu soru 4 yıl öncesinden geldiğinden, yeni şeyler uygulandı ve bunların arasında çok uygun olan yeni bir işlev plt.subplotsvar :

fig, axes = plot.subplots(nrows=2, ncols=3, sharex=True, sharey=True)

nerede axesbir olan numpy.ndarrayAxesSubplot nesnelerin çok uygun sadece dizi indeksleri kullanarak farklı subplots geçmesi için yapım [i,j].


Bu, yalnızca matplotlib API'yi kullanmam gereken durumlarda da işe yarıyor mu (ekranın mevcut olmaması ve diğer komik şeyler nedeniyle)?
eudoxos

2
evet @eudoxos, o size ne yapıldığını göstermek gerek kalmadan, örneğin, tek sayfaya birden çok grafik yazdırmak için böyle subplots oluşturabilir olmalıdır
Saullo GP Castro

12

Bu aynı zamanda çalışır:

for i in range(19):
    plt.subplot(5,4,i+1) 

Bir sayfada toplam 19 grafik çizer. Biçim 5 aşağı ve 4 çaprazdır ..


4

@doug & FS.'nin cevabı çok iyi çözümler. Yineleme çözümünü pandas.dataframe üzerinde paylaşmak istiyorum.

import pandas as pd
df=pd.DataFrame([[1, 2], [3, 4], [4, 3], [2, 3]])
fig = plt.figure(figsize=(14,8))
for i in df.columns:
    ax=plt.subplot(2,1,i+1) 
    df[[i]].plot(ax=ax)
    print(i)
plt.show()

Veri çerçevenizde adlandırılmış sütunlar varsa, şu gibi bir şey kullanmanız gerekirfor i,col in enumerate(df.columns):
drevicko
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.