webentwicklung-frage-antwort-db.com.de

Fügen Sie in matplotlib dynamisch Unterpläne hinzu

Ich möchte ein Diagramm erstellen, das aus mehreren Teilplots mit gemeinsamen x/y-Achsen besteht. Es sollte in der Dokumentation so aussehen (obwohl meine Subplots Scatterblots sein werden): (hier Code)

3 subplots sharing x and y axis

Aber ich möchte die Subplots dynamisch erstellen!

Die Anzahl der Subplots hängt also von der Ausgabe einer vorherigen Funktion ab. (Abhängig von der Eingabe meines Skripts sind dies wahrscheinlich etwa 3 bis 15 Subplots pro Diagramm, die jeweils aus einem anderen Datensatz stammen.)

Kann mir jemand sagen, wie ich das schaffen soll? 

30
CodingCat
import matplotlib.pyplot as plt
from pylab import *
import numpy as np

x = np.linspace(0, 2*np.pi, 400)
y = np.sin(x**2)

subplots_adjust(hspace=0.000)
number_of_subplots=3

for i,v in enumerate(xrange(number_of_subplots)):
    v = v+1
    ax1 = subplot(number_of_subplots,1,v)
    ax1.plot(x,y)

plt.show()

Dieser Code funktioniert, aber Sie müssen die Achsen korrigieren. Ich habe subplot verwendet, um 3 Diagramme in derselben Spalte zu zeichnen. Alles, was Sie tun müssen, ist, der number_of_plots-Variablen eine ganze Zahl zuzuweisen. Wenn die X- und Y-Werte für jedes Diagramm unterschiedlich sind, müssen Sie sie für jedes Diagramm zuweisen.

subplot funktioniert wie folgt, wenn ich beispielsweise einen Unterplotwert von 3,1,1 hatte. Dadurch wird ein 3x1-Raster erstellt und der Plot an die erste Position platziert. Wenn meine subplot-Werte in der nächsten Interation 3,1,2 waren, wird erneut ein 3x1-Gitter erstellt, der Plot wird jedoch an der 2. Position platziert und so weiter. 

19
Harpal

Basierend auf diesem Beitrag möchten Sie Folgendes tun:

import matplotlib.pyplot as plt

# Start with one
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot([1,2,3])

# Now later you get a new subplot; change the geometry of the existing
n = len(fig.axes)
for i in range(n):
    fig.axes[i].change_geometry(n+1, 1, i+1)

# Add the new
ax = fig.add_subplot(n+1, 1, n+1)
ax.plot([4,5,6])

plt.show() 

Paul H s answer zeigt jedoch auf das Submodul namens gridspec , was das oben genannte erleichtern könnte. Ich lasse das als Übung für den Leser.

14
Sardathrion

Angenommen, Sie kennen Summe der Teilflächen und Summe der Spalten Sie möchten Folgendes verwenden:

import matlab.pyplot as plt

# Subplots are organized in a Rows x Cols Grid
# Tot and Cols are known

Tot = number_of_subplots
Cols = number_of_columns

# Compute Rows required

Rows = Tot // Cols 
Rows += Tot % Cols

# Create a Position index

Position = range(1,Tot + 1)

Die erste Instanz von Rows Accounts gilt nur für Zeilen, die vollständig mit Subplots gefüllt sind. Dann wird eine weitere Zeile hinzugefügt, wenn 1 oder 2 oder ... Cols - 1 Subplots benötigen noch eine Position.

Erstellen Sie dann figure und fügen Sie Teilbilder hinzu mit einer für Schleife .

# Create main figure

fig = plt.figure(1)
for k in range(Tot):

  # add every single subplot to the figure with a for loop

  ax = fig.add_subplot(Rows,Cols,Position[k])
  ax.plot(x,y)      # Or whatever you want in the subplot

plt.show()

Bitte beachten Sie, dass Sie den Bereich Position benötigen, um die Subplots an die richtige Stelle zu verschieben.

12
Matteo Scarponi

Anstatt Ihre eigene Anzahl von Zeilen und Spalten zu zählen, fiel es mir leichter, zuerst die Unterpläne mit plt.subplots zu erstellen und dann das Achsenobjekt zu durchlaufen, um Plots hinzuzufügen.

import matplotlib.pyplot as plt
import numpy as np

fig, axes = plt.subplots(nrows=3, ncols=2, figsize=(12, 8))
x_array = np.random.randn(6, 10)
y_array = np.random.randn(6, 10)

i = 0
for row in axes:
    for ax in row:
        x = x_array[i] 
        y = y_array[i]
        ax.scatter(x, y)
        ax.set_title("Plot " + str(i))
        i += 1
plt.tight_layout()
plt.show()

Hier verwende ich i, um durch Elemente von x_array und y_array zu iterieren, aber Sie können auch leicht durch Funktionen oder Spalten von Dataframes iterieren, um Diagramme dynamisch zu generieren.

0
charleslow