Wie erstelle ich mit matplotlib mehrere Diagramme auf einer Seite?

88

Ich habe Code geschrieben, der 16 Ziffern gleichzeitig öffnet. Derzeit werden sie alle als separate Diagramme geöffnet. Ich möchte, dass sie alle auf derselben Seite öffnen. Nicht das gleiche Diagramm. Ich möchte 16 separate Grafiken auf einer Seite / einem Fenster. Aus irgendeinem Grund entspricht das Format der Numbins und Standardreallimits nicht mehr als in Abbildung 1. Muss ich den Befehl subplot verwenden? Ich verstehe nicht, warum ich müsste, kann aber nicht herausfinden, was ich sonst noch tun würde?

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.
quelle

Antworten:

15

Um Ihre Hauptfrage zu beantworten, möchten Sie den Befehl subplot verwenden . Ich denke, ein Wechsel plt.figure(i)zu plt.subplot(4,4,i+1)sollte funktionieren.

las3rjock
quelle
199

Die Antwort von las3rjock , die irgendwie die vom OP akzeptierte Antwort ist, ist falsch - der Code wird weder ausgeführt noch ist die Matplotlib-Syntax gültig. Diese Antwort enthält keinen ausführbaren Code und enthält keine Informationen oder Vorschläge, die das OP beim Schreiben eines eigenen Codes zur Lösung des Problems im OP als nützlich erachten könnte.

Angesichts der Tatsache, dass dies die akzeptierte Antwort ist und bereits mehrere positive Stimmen erhalten hat, denke ich, dass eine kleine Dekonstruktion angebracht ist.

Zuerst ruft subplot ist nicht geben Ihnen mehrere Plots; Unterplot wird aufgerufen, um ein einzelnes Plot sowie mehrere Plots zu erstellen. Außerdem ist "Ändern von plt.figure (i)" nicht korrekt.

plt.figure () (in dem plt oder PLT normalerweise die Pyplot-Bibliothek von matplotlib ist, die als globale Variable, plt oder manchmal PLT, importiert und zurückgebunden wird, wie folgt:

from matplotlib import pyplot as PLT

fig = PLT.figure()

Die Zeile direkt darüber erstellt eine Matplotlib-Figureninstanz. Die add_subplot- Methode dieses Objekts wird dann für jedes Plotfenster aufgerufen (denken Sie informell an eine x & y-Achse, die ein einzelnes Subplot umfasst). Sie erstellen (ob nur eine oder mehrere auf einer Seite) wie folgt

fig.add_subplot(111)

Diese Syntax entspricht

fig.add_subplot(1,1,1)

Wählen Sie diejenige, die für Sie Sinn macht.

Unten habe ich den Code aufgelistet, um zwei Diagramme auf einer Seite übereinander zu zeichnen. Die Formatierung erfolgt über das an add_subplot übergebene Argument . Beachten Sie, dass das Argument ( 211 ) für den ersten Plot und ( 212 ) für den zweiten ist.

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

Jedes dieser beiden Argumente ist eine vollständige Spezifikation für die korrekte Platzierung der jeweiligen Plotfenster auf der Seite.

211 (was wiederum auch in 3-Tupel-Form geschrieben werden könnte, da (2,1,1) zwei Zeilen und eine Spalte vonPlotfenstern bedeutet; die dritte Ziffer gibt die Reihenfolge dieses bestimmten Unterplotfensters relativ zu den anderen Unterplotfenstern an. -In diesem Fall ist dies das erste Diagramm (das es in Zeile 1 platziert), daher Diagramm Nummer 1, Zeile 1, Spalte 1.

Das an den zweiten Aufruf von add_subplot übergebene Argument unterscheidet sich vom ersten nur durch die nachfolgende Ziffer (eine 2 anstelle einer 1, da dieses Diagramm das zweite Diagramm ist (Zeile 2, Spalte 1).

Ein Beispiel mit mehr Plots: Wenn Sie stattdessen vier Plots auf einer Seite in einer 2x2-Matrixkonfiguration wünschen, rufen Sie die Methode add_subplot viermal auf und übergeben diese vier Argumente (221), (222), (223) und ( 224), um vier Diagramme auf einer Seite um 10, 2, 8 bzw. 4 Uhr und in dieser Reihenfolge zu erstellen.

Beachten Sie, dass jedes der vier Argumente zwei führende 2 enthält - die die 2 x 2-Konfiguration codieren, dh zwei Zeilen und zwei Spalten.

Die dritte (am weitesten rechts stehende) Ziffer in jedem der vier Argumente codiert die Reihenfolge dieses bestimmten Plotfensters in der 2 x 2-Matrix - dh Zeile 1 Spalte 1 (1), Zeile 1 Spalte 2 (2), Zeile 2 Spalte 1 (3), Zeile 2 Spalte 2 (4).

Doug
quelle
1
add_subplot kann ein einzelnes Integer-Argument für eine kleine Anzahl von Subplots verwenden. Wenn Sie jedoch mehr als 9 Subplots benötigen, sollten Sie die Version aus den anderen Antworten verwenden, die 3 separate Integer-Argumente enthält.
user1244215
1
kann ich fig.add_axes(rect)anstelle von verwenden add_subplot?
Alcott
15
PLT? Nie zuvor gesehen, dass es benutzt wird
Darshan Chaudhary
3
Ihr erster Absatz hier ist offensichtlich falsch, da Sie dies überprüfen können, indem Sie ausführen for i in range(16): plt.subplot(4, 4, i+1)und keinen Syntaxfehler feststellen . Die Antwort wird akzeptiert, weil sie wahrscheinlich das getan hat, was das OP wollte.
Chthonicdaemon
2
Dies ist eine schöne Lösung. Aber wenn ich eine Variable zum Schleifen verwenden möchte, wie geht das?
Pengju Zhao
82

Da diese Frage von vor 4 Jahren stammt, wurden neue Dinge implementiert und unter ihnen gibt es eine neue Funktion, plt.subplotsdie sehr praktisch ist :

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

Wo axesist ein numpy.ndarrayAxesSubplot-Objekt, was es sehr bequem macht, die verschiedenen Unterplots nur mit Array-Indizes durchzugehen [i,j].

Saullo GP Castro
quelle
Funktioniert dies auch in Fällen, in denen ich nur die matplotlib-API verwenden muss (weil die Anzeige nicht verfügbar ist und andere lustige Dinge)?
Eudoxos
2
@eudoxos ja, es sollte, Sie können die Unterzeichnungen wie diese erstellen, um beispielsweise mehrere Grafiken auf einer Seite zu drucken, ohne zeigen zu müssen, was getan wird
Saullo GP Castro
12

Das funktioniert auch:

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

Es werden insgesamt 19 Grafiken auf einer Seite dargestellt. Das Format ist 5 nach unten und 4 über ..

FS.
quelle
4

Die Antwort von @doug & FS. sind sehr gute Lösungen. Ich möchte die Lösung für die Iteration auf pandas.dataframe freigeben.

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
quelle
Wenn Ihr for i,col in enumerate(df.columns):
Datenrahmen