Matrix grafisch darstellen#

Für die einfache grafische Darstellung von Grids bzw. Matrizen eignet sich in Matplotlib die Funktion/Methode imshow(). Diese kann ähnlich wie z.B. plot() als Funktion oder Methode eines Axes-Objektes ausgeführt werden, erwartet jedoch statt einer eindimensionalen Datenreihe (z.B. eine Liste mit Zahlen) einen zweidimensionalen, matrixartigen Datentyp (z.B. eine geschachtelte Liste mit Zahlen) als Input.

Im Folgenden erstelle ich zunächst eine 2x2-Matrix, welche Nullen und Einsen enthält. Dann erstelle ich wie gewohnt ein Figure- und ein Axes-Objekt mit plt.subplots() und wende schließlich dort, wo in vorherigen Kapiteln meist plot() verwendet wurde, die Axes-Methode imshow() mit der 2x2-Matrix als Input an.

import matplotlib.pyplot as plt

# Matrix erstellen

matrix = [
    [1,0],
    [0,1],
]

# Figure und Axes erstellen
leinwand, diagramm = plt.subplots()

# imshow()-Methode des Axes-Objekt anwenden, Matrix ist Input
diagramm.imshow(matrix)

# Diagramm anzeigen
plt.show()
../_images/amp07a_02_imshow_1_0.png

Wir sehen, die 2x2-Matrix wurde mittels imshow() in ein Diagramm, welches aus 4 gleichgroßen, farbigen Quadraten besteht, übersetzt. Jedem Feld der Matrix entspricht einem Quadrat des Diagramms. Die Farbe des Quadrates ergibt sich jeweils aus dem Zahlenwert in der Matrix. Unten ein weiteres Beispiel, diesmal eine 4x4-Matrix, welche die Zahlen 0, 1 und 2 beinhalten.

# Matrix erstellen
matrix = [
    [1,0,0,1],
    [0,2,2,0],
    [0,2,2,0],
    [1,0,0,1],
]

# Figure und Axes erstellen
leinwand, diagramm = plt.subplots()

# Diagramm malen
diagramm.imshow(matrix)

# Diagramm anzeigen
plt.show()
../_images/amp07a_02_imshow_3_0.png

Wieder sehen wir, dass jeder Zelle der Matrix je nach Zahl eine spezifische Farbe zugewiesen wurde. Allerdings unterscheiden sich die Zuweisungen der Farben zu den Zahlen im Vergleich zur vorherigen Matrix. Wie werden die Farben festgelegt?

Jeder Zahl in der Matrix wird eine Farbe im Diagramm zugeordnet d.h. jede Zahl ist letztlich ein Code für eine Farbe. Um festzulegen, welche Zahl welcher Farbe zugeordnet wird, greift die Methode imshow() auf eine sogenannte Colormap zurück. Eine Colormap ist eine Farbpalette, die bestimmte Bereiche einer Skala bestimmten Farben zuordnet. Die in der Matrix verwendeten Zahlen werden dabei als Zahlen einer kontinuierlichen Skala angesehen. Wenn man nichts anderes einstellt, dann wird das Minimum der verwendeten Skala, also die niedrigste verwendete Zahl, der Farbe am linken Ende der Colormap zugeordnet. Das Maximum der Skala, also die höchste verwendete Zahl, wird der Farbe am rechten Ende der Colormap zugeordnet. Die restlichen Skalenschritte werden dann gleichmäßig entlang der Colormap verteilt, sodass z.B. die Skalenmitte genau der mittleren Farbe der Colormap zugeordnet wird. Unten siehst du die standardmäßig in Matplotlib eingestellte Colormap namens “viridis” (hier findest du unten auf der Seite eine Übersicht über alle standardmäßig verfügbaren Colormaps in Matplotlib). QUELLE: https://matplotlib.org/stable/gallery/color/colormap_reference.html

Die Abbildung unten zeigt die Farbzuweisungen der obigen zwei Beispieldiagramme. Im ersten Diagramm oben haben wir nur Nullen und Einsen in der Matrix verwendet, sodass wir quasi eine Skala von 0 bis 1 verwendet haben. Da die Methode imshow() die Colormap namens “viridis” als Standard-Colormap eingestellt hat, wurde dann die Zahl 0 der Farbe auf der linken Seite und die Zahl 1 der Farbe auf der rechten Seite der Colormap “viridis” zugeordnet. Im zweiten Diagramm wurden die Zahlen 0 bis 2 verwendet, sodass wir praktisch eine Skala von 0 bis 2 verwende hatten. Die 0 wurde somit als Skalenminimum der Farbe lila auf der linken Seite, die 1 als Skalenmitte der Farbe türkis in der Mitte und die 2 als Skalenmaximum der Farbe gelb auf der rechten Seite der Colormap viridis zugeordnet.

Die in der Matrix verwendeten Skalen können beliebig groß und beliebig kleinschrittig sein. Im Folgenden erstelle ich z.B. eine Matrix mit 10 Zeilen und 10 Spalten und addiere in jeder Zelle der Matrix die Zeilen- und Spaltenposition.

matrix = []

for i in range(10):
    zeile = []
    
    for j in range(10):
        zeile.append(i + j)
    
    matrix.append(zeile)

matrix
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
 [2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
 [3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
 [4, 5, 6, 7, 8, 9, 10, 11, 12, 13],
 [5, 6, 7, 8, 9, 10, 11, 12, 13, 14],
 [6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
 [7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
 [8, 9, 10, 11, 12, 13, 14, 15, 16, 17],
 [9, 10, 11, 12, 13, 14, 15, 16, 17, 18]]
leinwand, diagramm = plt.subplots()

diagramm.imshow(matrix)

plt.show()
../_images/amp07a_02_imshow_6_0.png

Nun das ganze nochmal mit 20 Zeilen und 20 Spalten, sodass wir eine feinere Auflösung bekommen:

matrix = []

for i in range(20):
    zeile = []
    
    for j in range(20):
        zeile.append(i + j)
    
    matrix.append(zeile)

    
leinwand, diagramm = plt.subplots()
diagramm.imshow(matrix)
plt.show()
../_images/amp07a_02_imshow_8_0.png

Colormap ändern#

Mithilfe des Parameters cmap können wir die verwendete Colormap ändern. Dafür müssen wir cmap die Bezeichnung der gewünschten Colormap zuweisen. Unten setze ich den Parameter cmap auf "Dark2". Anders als "viridis" hat "Dark2" weniger Farben und harte Übergänge zwischen den Farbbereichen. Wie man unten sieht, wird dadurch mehreren Zahlen die jeweils gleiche Farbe zugeordnet.

leinwand, diagramm = plt.subplots()
diagramm.imshow(matrix, cmap="Dark2")
plt.show()
../_images/amp07a_02_imshow_10_0.png

Skalenbereich selbst festlegen#

Die Funktion/Methode imshow() nimmt (ohne weitere Einstellung) den kleinsten in der Matrix gefundenen Wert als Skalenminimum und den größten in der Matrix gefundenen Wert als Skalenmaximum an. Wir können aber auch selbst das Skalenminimum und -maximum festlegen. Das ist sinnvoll, wenn wir über mehrere Plots hinweg die Farbzuweisungen gleich halten wollen, obwohl sich in den verschiedenen Plots evtl. die kleinsten und größten Werte voneinander unterscheiden. Das ist auch bei der Animation dieser Diagramme sehr wichtig.

Das Skalenminimum und Skalenmaximum stellen wir mit den beiden Parametern vmin und vmax ein. Im Beispiel unten gehe ich per For-Loop eine Liste von Matrizen namens matrices durch und plotte diese nacheinander auf eigene “Leinwände”. Obwohl jede Matrix der Liste matrices andere Zahlenkombinationen beinhaltet, sehen alle Diagramme gleich aus. Das liegt daran, dass in jeder Matrix nur zwei unterschiedliche Zahlen vorkommen, somit die verwendete Skala nur aus zwei Werten besteht, welche den jeweiligen Enden der Colormap zugeordnet werden.

matrices = [
    [[0,0],
     [1,1]],
    
    [[1,1],
     [2,2]],
    
    [[2,2],
     [3,3]],
]

for matrix in matrices:
    leinwand, diagramm = plt.subplots()
    diagramm.imshow(matrix)
    plt.show()
../_images/amp07a_02_imshow_12_0.png ../_images/amp07a_02_imshow_12_1.png ../_images/amp07a_02_imshow_12_2.png

Unten hingegen lege ich per vmin und vmax die Skalenenden, welche den Skalenenden der Colormap zugeordnet werden, selbst fest, wodurch nun bestimmte Werte innerhalb der Skala über die Diagramme hinweg denselben Farben zugeordnet werden.

matrices = [
    [[0,0],
     [1,1]],
    
    [[1,1],
     [2,2]],
    
    [[2,2],
     [3,3]],
]

for matrix in matrices:
    leinwand, diagramm = plt.subplots()
    diagramm.imshow(matrix, vmin=0, vmax=3)
    plt.show()
../_images/amp07a_02_imshow_14_0.png ../_images/amp07a_02_imshow_14_1.png ../_images/amp07a_02_imshow_14_2.png

Farben per RGB-Code bestimmen#

Die Funktion/Methode imshow() akzeptiert auch Matrizen, deren Elemente sogenannte RGB-Farbcodes darstellen. Dadurch muss der Inhalt einer Matrix nicht mehr über eine Colormap in Farben übersetzt werden, sondern die Information über die anzuzeigende Farbe steht direkt in den Elementen der Matrix selbst.

“RGB” steht für “rot grün blau”. Ein RGB-Farbcode definiert eine bestimmte Farbe, indem angegeben wird, wie viel rot, wie viel grün und wie viel blau in dieser Farbe steckt (jede Farbe besteht letztlich aus diesen drei Farben). Wie viel von einer Farbe in den Farbmix kommt, wird über eine Zahl zwischen 0 und 255 angegeben. Ein RGB-Farbcode besteht daher aus drei Zahlen zwischen 0 und 255. Die erste Farbe steht für die “Menge” an rot, die zweite Zahl für die “Menge” an grün und die dritte Zahl für die “Menge” an blau. Ein reines rot hat dementsprechend den RGB-Code “255 0 0”. Ein reines grün hat den Code “0 255 0” und ein reines blau den Code “0 0 255”. Die meisten Farben sind jedoch eine Mischung aus allem. Hier findest du eine Übersicht über gängige Farben und deren RGB-Farbcodes.

In Python gibt man RGB-Farbcodes meist als eine Liste oder ein Tupel mit den entsprechenden 3 Zahlen an z.B. so: [255, 100, 0]. Unten speichere ich zunächst zwei RGB-Farbcodes unter den Namen gold und navy, erstelle dann eine Matrix mit diesen Farben und lasse die Matrix mit imshow() anzeigen.

# RGB-Farbcodes
gold = [255, 215, 0]
navy = [0, 0, 128]

# Matrix mit RGB-Farbcodes
rgb_matrix = [
    [gold, navy, gold],
    [navy, gold, navy],
    [gold, navy, gold],
]

# Diagramm erstellen
leinwand, diagrammbereich = plt.subplots()
diagrammbereich.imshow(rgb_matrix)
plt.show()
../_images/amp07a_02_imshow_16_0.png