Bagaimana cara membuat beberapa plot dalam satu halaman menggunakan matplotlib?

92

Saya telah menulis kode yang membuka 16 angka sekaligus. Saat ini semuanya terbuka sebagai grafik terpisah. Saya ingin mereka membuka semua di halaman yang sama. Bukan grafik yang sama. Saya ingin 16 grafik terpisah pada satu halaman / jendela. Juga untuk beberapa alasan format dari numbins dan defaultreallimits tidak sesuai dengan gambar 1. Apakah saya perlu menggunakan perintah subplot? Saya tidak mengerti mengapa saya harus tetapi tidak tahu apa lagi yang akan saya lakukan?

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()
FS.
sumber

Jawaban:

17

Untuk menjawab pertanyaan utama Anda, Anda ingin menggunakan perintah subplot . Saya pikir mengubah plt.figure(i)menjadi plt.subplot(4,4,i+1)harus berhasil.

las3rjock.dll
sumber
202

Jawaban dari las3rjock , yang entah bagaimana merupakan jawaban yang diterima oleh OP, salah - kode tidak berjalan, juga bukan sintaks matplotlib yang valid; jawaban itu tidak memberikan kode yang dapat dijalankan dan tidak memiliki informasi atau saran yang mungkin berguna bagi OP dalam menulis kode mereka sendiri untuk menyelesaikan masalah di OP.

Mengingat bahwa itu adalah jawaban yang diterima dan telah menerima beberapa suara positif, saya kira sedikit dekonstruksi sudah beres.

Pertama, memanggil subplot tidak tidak memberikan beberapa plot; subplot dipanggil untuk membuat plot tunggal, sekaligus membuat banyak plot. Selain itu, "mengubah plt.figure (i)" tidak benar.

plt.figure () (di mana plt atau PLT biasanya pustaka pyplot matplotlib diimpor dan dipantulkan sebagai variabel global, plt atau kadang-kadang PLT, seperti:

from matplotlib import pyplot as PLT

fig = PLT.figure()

baris tepat di atas membuat instance gambar matplotlib; ini objek add_subplot metode kemudian disebut untuk setiap jendela plotting (informal memikirkan x & y sumbu yang terdiri subplot tunggal). Anda membuat (apakah hanya satu atau beberapa di halaman), seperti itu

fig.add_subplot(111)

sintaks ini setara dengan

fig.add_subplot(1,1,1)

pilih salah satu yang masuk akal bagi Anda.

Di bawah ini saya telah membuat daftar kode untuk memplot dua plot pada satu halaman, satu di atas yang lain. Pemformatan dilakukan melalui argumen yang diteruskan ke add_subplot . Perhatikan argumennya adalah ( 211 ) untuk plot pertama dan ( 212 ) untuk plot kedua.

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

Masing-masing dari dua argumen ini adalah spesifikasi lengkap untuk menempatkan jendela plot masing-masing dengan benar pada halaman.

211 (yang juga dapat ditulis dalam bentuk 3-tupel karena (2,1,1) berarti dua baris dan satu kolom jendela plot; digit ketiga menentukan urutan jendela subplot tertentu relatif terhadap jendela subplot lainnya- -dalam hal ini, ini adalah plot pertama (yang menempatkannya pada baris 1) maka plot nomor 1, baris 1 col 1.

Argumen yang diteruskan ke panggilan kedua ke add_subplot , berbeda dari yang pertama hanya dengan digit di belakangnya (a 2 bukan 1, karena plot ini adalah plot kedua (baris 2, kolom 1).

Contoh dengan lebih banyak plot: jika sebaliknya Anda menginginkan empat plot pada halaman, dalam konfigurasi matriks 2x2, Anda akan memanggil metode add_subplot empat kali, meneruskan empat argumen ini (221), (222), (223), dan ( 224), untuk membuat empat plot pada halaman pada pukul 10, 2, 8, dan 4, masing-masing dan dalam urutan ini.

Perhatikan bahwa masing-masing dari empat argumen berisi dua lead 2 - yang mengkodekan konfigurasi 2 x 2, yaitu dua baris dan dua kolom.

Digit ketiga (paling kanan) di masing-masing dari empat argumen mengkodekan urutan jendela plot tertentu dalam matriks 2 x 2 - yaitu, baris 1 kolom 1 (1), baris 1 kolom 2 (2), baris 2 col 1 (3), baris 2 col 2 (4).

doug
sumber
1
add_subplot dapat menggunakan argumen integer tunggal untuk sejumlah kecil subplot, tetapi setelah Anda membutuhkan lebih dari 9 subplot, Anda harus menggunakan versi dari jawaban lain yang mengambil 3 argumen integer terpisah.
pengguna1244215
1
dapatkah saya gunakan fig.add_axes(rect)sebagai pengganti add_subplot?
Alcott
16
PLT? Belum pernah terlihat itu digunakan sebelumnya
Darshan Chaudhary
3
Paragraf pertama Anda di sini jelas tidak benar, karena Anda dapat memverifikasi dengan menjalankan for i in range(16): plt.subplot(4, 4, i+1)dan mengamati tidak ada kesalahan sintaks. Jawabannya diterima karena mungkin melakukan apa yang diinginkan OP.
chthonicdaemon
3
Ini solusi yang bagus. Tetapi jika saya ingin menggunakan satu variabel untuk melakukan perulangan, gimana caranya?
Pengju Zhao
83

Karena pertanyaan ini dari 4 tahun yang lalu, hal-hal baru telah diterapkan dan di antaranya ada fungsi baru plt.subplotsyang sangat nyaman :

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

di mana axesadalah salah numpy.ndarraysatu objek AxesSubplot, membuatnya sangat nyaman untuk menelusuri subplot yang berbeda hanya dengan menggunakan indeks larik [i,j].

Saullo GP Castro
sumber
Apakah ini juga berfungsi untuk kasus di mana saya hanya perlu menggunakan API matplotlib (karena tampilan tidak tersedia dan hal-hal lucu lainnya)?
eudoxos
2
@eudoxos ya, seharusnya, Anda dapat membuat subplot seperti ini untuk mencetak banyak grafik dalam satu halaman, misalnya, tanpa perlu menunjukkan apa yang sedang dilakukan
Saullo GP Castro
12

Ini juga berfungsi:

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

Ini memplot 19 grafik total pada satu halaman. Formatnya adalah 5 kebawah dan 4 melintang ..

FS.
sumber
4

Jawaban @doug & FS.adalah solusi yang sangat bagus. Saya ingin berbagi solusi untuk iterasi pada pandas.dataframe.

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()
Pengju Zhao
sumber
Jika bingkai data Anda memiliki kolom bernama, Anda harus menggunakan sesuatu sepertifor i,col in enumerate(df.columns):
drevicko