Matplotlib-Tutorial: Mehrfache Plots und Doppelachsen

multiple plots WEBOFF

In den bisherigen Kapiteln des Matplotlib-Tutorials haben wir in zahlreichen Beispiele gezeigt, wie wir Diagramme und Graphen erzeugen können. Ein häufig gestellte Frage ist, wie man mehrere Plots in einem Diagramm unterbringen kann.

Im einfachsten Fall heißt das, dass wir eine Kurve haben, und wir eine weitere Kurve darüber legen. Der interessantere Fall ist jedoch, wenn zwei Plots in einem Fenster gewünscht werden. In einem Fenster bedeutet, dass es zwei Unterdiagramme geben soll, d.h. dass diese nicht übereinander gezeichnet werden. Die Idee ist, mehr als einen Graphen in einem Fenster zu haben, und jeder Graph erscheint in seinem eigenen Unterdiagramm.

Wir stellen zwei verschiedene Wege vor, wie dies erreicht werden kann:

Wir sind der Meinung, dass gridspec die beste Option ist, weil es einfacher in der Anwendung ist, wenn das Layout komplexer wird.



Mehrere Abbildungen und Achsen


Die Funktion subplot hat folgende Parameter:

subplot(nrows, ncols, plot_number)

Wenn ein Unterdiagramm auf eine Abbildung angewendet wird, so wird die Abbildung theoretisch aufgeteilt in nrows * ncols Unterachsen. Der Parameter plot_number bezeichnet den Subplot, den der Funktionsaufruf erstellen muss. plot_number kann einen Wert zwischen 1 und dem Maximum von nrows * ncols annehmen.

Wenn der Wert der drei Parameter kleiner als 10 ist, kann die Funktion mit einem Integer Wert aufgerufen werden, wobei die Hunderter nrows, die Zehner ncols und die Einheiten plot_number repräsentieren. Das bedeutet: Statt subplot(2, 3, 4) kann subplot(234) geschrieben werden.


Im folgenden Beispiel "aktivieren" wir zwei Unterplots in einem "theoretischen" 2x2-Gitter:

import matplotlib.pyplot as plt
python_course_green = "#476042"
plt.figure(figsize=(6, 4))
plt.subplot(221) # äquivalent zu: plt.subplot(2, 2, 1)
plt.text(0.5, # x-Koordinate, 0 ganz links, 1 ganz rechts
         0.5, # y-Koordinate, 0 ganz oben, 1 ganz unten
         'subplot(2,2,1)', # der Text der ausgegeben wird
         horizontalalignment='center', # abgekürzt 'ha' 
         verticalalignment='center', # abgekürzt 'va'
         fontsize=20, # kann auch  'font' genannt werden
         alpha=.5 # float (0.0 tranparent bis 1.0 undurchsichtig)
         )
plt.subplot(224, facecolor=python_course_green)
plt.text(0.5, 0.5, 
         'subplot(2,2,4)', 
         ha='center', va='center',
         fontsize=20, 
         color="y")
plt.show()

Für unsere Absichten benötigen wir keine Ticks auf den Achsen. Wir können sie loswerden, indem wir ein leeres Tupel setzen und folgenden Code ergänzen:

plt.xticks(())
plt.yticks(())

Das gesamte Programm sieht dann wie folgt aus:

import matplotlib.pyplot as plt
python_course_green = "#476042"
# figsize werden wir erst später erklären:
plt.figure(figsize=(6, 4)) # Größe des Plots
plt.subplot(221) # öquivalent zu: plt.subplot(2, 2, 1)
plt.xticks(())
plt.yticks(())
plt.text(0.5, 
         0.5, 
         'subplot(2,2,1)', 
         horizontalalignment='center', 
         verticalalignment='center',
         fontsize=20, 
         alpha=.5 
         )
plt.subplot(224, facecolor=python_course_green)
plt.xticks(())
plt.yticks(())
plt.text(0.5, 0.5, 
         'subplot(2,2,4)', 
         ha='center', va='center',
         fontsize=20, 
         color="y")
plt.show()

Der vorige Ansatz ist durchaus akzeptabel. Jedoch ist es ein besserer Stil, Instanzen der Figure-Klasse im Sinne der objektorientierten Programmierung zu verwenden. Wir demonstrieren dies, indem wir das vorige Beispiel umschreiben. In diesem Fall müssen wir die add_subplot-Methode auf das Figure-Objekt anwenden.

Wir empfehlen dazu die Kapitel zu OOP in unserem Python-Tutorial zu lesen, wenn Sie nicht mit objektorientierter Programmierung vertraut sind: