Jak zrobić kilka wykresów na jednej stronie za pomocą matplotlib?


92

Napisałem kod, który otwiera jednocześnie 16 cyfr. Obecnie wszystkie otwierają się jako oddzielne wykresy. Chciałbym, żeby otwierały się wszystkie na tej samej stronie. To nie ten sam wykres. Chcę mieć 16 oddzielnych wykresów na jednej stronie / oknie. Z jakiegoś powodu format numbins i defaultreallimits nie jest taki sam jak na rysunku 1. Czy muszę używać polecenia subplot? Nie rozumiem, dlaczego miałbym to robić, ale nie wiem, co jeszcze bym zrobił?

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

Odpowiedzi:


17

Aby odpowiedzieć na główne pytanie, chcesz użyć polecenia subplot . Myślę, że zmiana plt.figure(i)na plt.subplot(4,4,i+1)powinna działać.


202

Odpowiedź z las3rjock , która w jakiś sposób jest odpowiedzią zaakceptowaną przez OP, jest niepoprawna - kod nie działa, ani nie jest to poprawna składnia matplotlib; ta odpowiedź nie zawiera żadnego wykonywalnego kodu i nie zawiera żadnych informacji ani sugestii, które OP mógłby uznać za przydatne do napisania własnego kodu w celu rozwiązania problemu w PO.

Biorąc pod uwagę, że jest to przyjęta odpowiedź i otrzymała już kilka pozytywnych głosów, przypuszczam, że konieczna jest mała dekonstrukcja.

Po pierwsze, nazywając subplot ma nie daje wiele działek; subplot jest wywoływana w celu utworzenia pojedynczego działki, jak również utworzenia wielu działek. Ponadto „zmiana plt.figure (i)” nie jest poprawna.

plt.figure () (w którym plt lub PLT to zwykle biblioteka pyplot matplotlib zaimportowana i odbijana jako zmienna globalna, plt lub czasami PLT, na przykład:

from matplotlib import pyplot as PLT

fig = PLT.figure()

linia tuż powyżej tworzy instancję figury matplotlib; metoda add_subplot tego obiektu jest następnie wywoływana dla każdego okna kreślenia (nieformalnie pomyśl o osi x & y zawierającej pojedynczy wykres podrzędny ). Ty tworzysz (czy to tylko jedną, czy kilka na stronie), tak

fig.add_subplot(111)

ta składnia jest równoważna

fig.add_subplot(1,1,1)

wybierz ten, który ma dla Ciebie sens.

Poniżej wymieniłem kod do wykreślenia dwóch wykresów na stronie, jedna nad drugą. Formatowanie odbywa się za pośrednictwem argumentu przekazanego do add_subplot . Zauważ, że argumentem jest ( 211 ) dla pierwszego wykresu i ( 212 ) dla drugiego.

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

Każdy z tych dwóch argumentów stanowi pełną specyfikację prawidłowego umieszczenia odpowiednich okien wykresów na stronie.

211 (co znowu można zapisać w postaci trzech krotek, jako (2,1,1) oznacza dwa wiersze i jedną kolumnę okien wykresu; trzecia cyfra określa kolejność tego konkretnego okna wykresu cząstkowego względem innych okien wykresu cząstkowego - -w tym przypadku jest to pierwszy wykres (który umieszcza go w rzędzie 1), stąd wykres nr 1, wiersz 1, kolumna 1.

Argument przekazany do drugiego wywołania add_subplot różni się od pierwszego jedynie końcową cyfrą (2 zamiast 1, ponieważ ten wykres jest drugim wykresem (wiersz 2, kolumna 1).

Przykład z większą liczbą wykresów: jeśli zamiast tego chcesz mieć cztery wykresy na stronie, w konfiguracji macierzy 2x2, wywołałbyś metodę add_subplot cztery razy, przekazując te cztery argumenty (221), (222), (223) i ( 224), aby utworzyć cztery wykresy na stronie odpowiednio o godzinie 10, 2, 8 i 4 iw tej kolejności.

Zauważ, że każdy z czterech argumentów zawiera dwa wyprowadzenia 2 - które kodują konfigurację 2 x 2, tj. Dwa wiersze i dwie kolumny.

Trzecia (najbardziej po prawej) cyfra w każdym z czterech argumentów koduje kolejność tego konkretnego okna wykresu w macierzy 2 x 2 - tj. Wiersz 1 kol 1 (1), wiersz 1 kol 2 (2), wiersz 2 kol 1 (3), wiersz 2 kol. 2 (4).


1
add_subplot może przyjmować pojedynczy argument będący liczbą całkowitą dla małej liczby wykresów podrzędnych, ale gdy potrzebujesz więcej niż 9 wykresów podrzędnych, powinieneś użyć wersji z innych odpowiedzi, która przyjmuje 3 oddzielne argumenty całkowite.
user1244215

1
czy mogę użyć fig.add_axes(rect)zamiast add_subplot?
Alcott,

16
PLT? Nigdy wcześniej tego nie widziałem
Darshan Chaudhary

3
Twój pierwszy akapit jest ewidentnie nieprawdziwy, ponieważ możesz to sprawdzić, uruchamiając for i in range(16): plt.subplot(4, 4, i+1)i nie obserwując błędu składniowego. Odpowiedź została przyjęta, ponieważ prawdopodobnie zrobiła to, czego chciał PO.
chthonicdaemon

3
To fajne rozwiązanie. Ale jeśli chcę użyć jednej zmiennej do zapętlenia, jak to zrobić?
Pengju Zhao

83

Ponieważ to pytanie jest sprzed 4 lat, wprowadzono nowe rzeczy, a wśród nich jest nowa funkcja, plt.subplotsktóra jest bardzo wygodna :

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

gdzie axesjest a numpy.ndarrayz obiektów AxesSubplot, dzięki czemu bardzo wygodnie jest przechodzić przez różne wykresy podrzędne, używając tylko indeksów tablicowych [i,j].


Czy to działa również w przypadkach, w których muszę używać tylko API matplotlib (z powodu niedostępności wyświetlacza i innych zabawnych rzeczy)?
eudoxos

2
@eudoxos tak, powinno, możesz utworzyć takie podploty, aby wydrukować wiele grafik na jednej stronie, na przykład bez konieczności pokazywania, co się dzieje
Saullo GP Castro

12

Działa to również:

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

Przedstawia łącznie 19 wykresów na jednej stronie. Format to 5 w dół i 4 w poprzek.


4

Odpowiedź @doug & FS. to bardzo dobre rozwiązania. Chcę udostępnić rozwiązanie do iteracji na 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()

Jeśli ramka danych ma nazwane kolumny, musisz użyć czegoś takiego jakfor i,col in enumerate(df.columns):
drevicko
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.