Benutzerdefinierte Farbkarte mit Python Matplotlib

Aditya Raj 21 Dezember 2022
  1. Verwenden Sie Matplotlib, um eine benutzerdefinierte Colormap in Python zu erstellen
  2. Verwenden Sie die Methode get_cmap() von Matplotlib, um auf Colormaps und ihre Werte in Python zuzugreifen
  3. Verwendung des Attributs colors des Objekts ListedColormap zur Erstellung einer benutzerdefinierten Listed Colormap in Python
  4. Wie erstelle ich eine benutzerdefinierte linear segmentierte Farbkarte in Python?
  5. Fazit
Benutzerdefinierte Farbkarte mit Python Matplotlib

Colormaps sind eine der effektivsten Methoden, um Variationen zwischen kontinuierlichen und diskreten Werten in einem Diagramm darzustellen. In diesem Artikel wird das Erstellen einer benutzerdefinierten Farbkarte mit Matplotlib in Python erläutert.

Verwenden Sie Matplotlib, um eine benutzerdefinierte Colormap in Python zu erstellen

Die Bibliothek matplotlib bietet verschiedene eingebaute Farbkarten. Angenommen, Sie möchten Colormaps manipulieren oder benutzerdefinierte Colormaps erstellen. In diesem Fall können Sie dies mit der Klasse ListedColormap oder der Klasse LinearSegmentedColormap tun, die in der Bibliothek matplotlib definiert ist.

Bevor wir benutzerdefinierte Colormaps erstellen, lassen Sie uns zunächst besprechen, wie wir auf Werte in den Matplotlib-Colormaps zugreifen können, um die Implementierung der Colormaps zu verstehen. Dadurch können wir benutzerdefinierte Farbkarten unserer eigenen Wahl erstellen.

Verwenden Sie die Methode get_cmap() von Matplotlib, um auf Colormaps und ihre Werte in Python zuzugreifen

Im Matplotlib-Modul sind verschiedene Colormaps definiert. Jeder Farbkarte wurde ein eindeutiger Name zugewiesen. Wir können mit der Methode get_cmap() im Modul cm der Bibliothek matplotlib auf eine Farbkarte zugreifen.

Die Syntax für die Methode get_cmap() ist wie folgt.

matplotlib.cm.get_cmap(name=None, lut=None)
  1. Der Parameter name akzeptiert den Namen der Colormap als String oder als Colormap-Objekt, das im matplotlib.colors-Modul definiert ist. Es hat einen Standardwert von None. Wenn wir keine Eingabe für den Parameternamen angeben, gibt die Methode get_cmap() die Colormap viridis zurück.
  2. Wenn eine Colormap mit dem angegebenen Namen in der Matplotlib-Bibliothek definiert ist, gibt die Methode get_cmap() eine Colormap-Instanz zurück.
  3. Der Standardwert für den Parameter lut ist None. Wenn lut nicht None ist, sollte es eine Ganzzahl sein, die die Anzahl der Farben in der Liste angibt, die zum Definieren der Farbtabelle verwendet wird.
  4. Wenn der name keine gültige Colormap ist und lut nicht None ist, wird die Colormap neu abgetastet, um lut-Werte in die Nachschlagetabelle einzugeben.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap

cm.get_cmap("viridis", 8)

Ausgabe:

Matplotlib-Farbkarte - Viridis

Der obige Code wurde in der interaktiven Shell im Jupyter Notebook ausgeführt. Wenn Sie versuchen, es in einer anderen IDE auszuführen, erhalten Sie möglicherweise das obige Bild als Ausgabe.

Die von der Methode get_cmap() zurückgegebene Colormap ist aufrufbar. Wenn wir einen Wert zwischen 0 und 1 an das Colormap-Objekt übergeben, gibt es einen RGBA-Wert zurück.

Dies können Sie in diesem Beispiel beobachten.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap

viridis = cm.get_cmap("viridis", 8)
print(viridis(0.56))

Ausgabe:

(0.122312, 0.633153, 0.530398, 1.0)

Verwendung des Attributs colors des Objekts ListedColormap zur Erstellung einer benutzerdefinierten Listed Colormap in Python

Um eine benutzerdefinierte ListedColormap zu erstellen, sehen wir uns zunächst an, wie Farben in einer ListedColormap gespeichert werden. Dazu können wir das Attribut colors des Objekts ListedColormap verwenden.

viridis ist beispielsweise eine ListedColormap. Wir können die Farbwerte mithilfe des Attributs colors der Colormap viridis beobachten, wie im folgenden Beispiel gezeigt.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap

viridis = cm.get_cmap("viridis", 8)
print(viridis.colors)

Ausgabe:

[[0.267004 0.004874 0.329415 1.      ]
 [0.275191 0.194905 0.496005 1.      ]
 [0.212395 0.359683 0.55171  1.      ]
 [0.153364 0.497    0.557724 1.      ]
 [0.122312 0.633153 0.530398 1.      ]
 [0.288921 0.758394 0.428426 1.      ]
 [0.626579 0.854645 0.223353 1.      ]
 [0.993248 0.906157 0.143936 1.      ]]

Hier sehen Sie, dass die Farben in einem Array von Nx4 gespeichert sind. Sie können auch auf die angegebene Anzahl von Zeilen der ListedColormap zugreifen, indem Sie den Colormap-Namen mit der erforderlichen Sequenz als Eingabeargument aufrufen, wie unten gezeigt.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap

viridis = cm.get_cmap("viridis", 8)
print(viridis(range(0, 8)))

Ausgabe:

[[0.267004 0.004874 0.329415 1.      ]
 [0.275191 0.194905 0.496005 1.      ]
 [0.212395 0.359683 0.55171  1.      ]
 [0.153364 0.497    0.557724 1.      ]
 [0.122312 0.633153 0.530398 1.      ]
 [0.288921 0.758394 0.428426 1.      ]
 [0.626579 0.854645 0.223353 1.      ]
 [0.993248 0.906157 0.143936 1.      ]]

Wie Sie sehen können, wird eine ListedColormap durch eine Liste dargestellt. Um also eine benutzerdefinierte ListedColormap in Python zu erstellen, müssen wir eine Liste erstellen, die die Farben der Farbtabelle darstellt.

Verwenden Sie Farbnamen, um eine benutzerdefinierte aufgelistete Farbzuordnung in Python zu erstellen

Wir können eine benutzerdefinierte Farbkarte mit der Methode ListedColormap() erstellen. Die Syntax der Methode ListedColormap() ist wie folgt.

matplotlib.colors.ListedColormap(colors, name="from_list", N=None)
  1. Der Parameter colors nimmt ein Array oder eine Liste von Farbnamen oder numerischen Werten an, die RGBA-Werte darstellen.
  2. Der Parameter name wird verwendet, um der erstellten benutzerdefinierten Farbtabelle einen bestimmten Namen zu geben. Es hat einen Standardwert from_list.
  3. Der Parameter N bezeichnet die Anzahl der Einträge in der Farbkarte. Es hat einen Standardwert von None. Wenn N den Wert None hat, sollte es für jede Farbe in der Liste colors einen Colormap-Eintrag geben.

Um eine benutzerdefinierte Farbkarte mit der Methode ListedColormap() und einer Liste von Farben zu erstellen, können Sie Namen von vier Farben an die Methode ListedColormap() übergeben. Es wird ein Colormap-Objekt zurückgegeben.

Danach können Sie das Objekt Colormap verwenden, um die Daten zu zeichnen, wie unten gezeigt.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors

xdata = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
ydata = [x * x for x in xdata]
norm = plt.Normalize(1, 150)
cmap = ListedColormap(["darkorange", "gold", "lawngreen", "lightseagreen"])
c = np.linspace(0, 150, 12)
plt.scatter(xdata, ydata, c=c, cmap=cmap, norm=norm)
plt.colorbar()
plt.show()

Ausgabe:

Verwenden Sie Farbnamen, um eine benutzerdefinierte aufgelistete Farbzuordnung in Python zu erstellen

Verwenden Sie RGBA-Werte, um eine benutzerdefinierte aufgelistete Farbzuordnung in Python zu erstellen

Anstatt die Farbnamen zu verwenden, können Sie die Arrays mit RGBA-Werten verwenden, um die Farbtabelle wie unten gezeigt zu erstellen.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors

xdata = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
ydata = [x * x for x in xdata]
norm = plt.Normalize(1, 150)
colorarray = [
    [0.57647055, 0.4116, 0.27107143, 1],
    [0, 0.4116, 0.27107143, 1],
    [0.57647055, 0, 0.27107143, 1],
]
cmap = ListedColormap(colorarray)
c = np.linspace(0, 150, 12)
plt.scatter(xdata, ydata, c=c, cmap=cmap, norm=norm)
plt.colorbar()
plt.show()

Ausgabe:

Verwenden Sie RGBA-Werte, um eine benutzerdefinierte aufgelistete Farbzuordnung in Python zu erstellen

Wie erstelle ich eine benutzerdefinierte linear segmentierte Farbkarte in Python?

Bevor wir benutzerdefinierte linear segmentierte Farbtabellen erstellen, sehen wir uns an, wie Farbwerte in einer linear segmentierten Farbtabelle gespeichert werden.

Die linear segmentierten Colormaps haben nicht das Attribut color. Wir können jedoch den Colormap-Namen mit der erforderlichen Sequenz als Eingabeargument aufrufen, um die Farbwerte zu beobachten.

Beispielsweise können wir uns die Farbwerte der Colormap Kupfer wie folgt ansehen.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap

copper = cm.get_cmap("copper", 8)
print(copper(range(0, 8)))

Ausgabe:

[[0.         0.         0.         1.        ]
 [0.17647055 0.1116     0.07107143 1.        ]
 [0.35294109 0.2232     0.14214286 1.        ]
 [0.52941164 0.3348     0.21321429 1.        ]
 [0.70588219 0.4464     0.28428571 1.        ]
 [0.88235273 0.558      0.35535714 1.        ]
 [1.         0.6696     0.42642857 1.        ]
 [1.         0.7812     0.4975     1.        ]]

Was ist cdict in Matplotlib in Python?

Die Klasse LinearSegmentedColormap verwendet Ankerpunkte, zwischen denen RGBA-Werte interpoliert werden, um eine linear segmentierte Farbtabelle zu definieren.

  1. Jeder Ankerpunkt wird als Zeile in einer Matrix der Form [x[i] yleft[i] yright[i]] angegeben. Das x[i] ist der Anker, und yleft[i] und yright[i] sind die Farbwerte auf beiden Seiten des Ankerpunkts.
  2. Wenn die Farbkarte Diskontinuitäten an den Ankerpunkten hat, haben yleft[i] und yright[i] unterschiedliche Werte. Ansonsten haben yleft[i] und yright[i] denselben Wert.
  3. Die Ankerpunkte werden in einem Farblexikon gespeichert, oft auch cdict genannt. Die Schlüssel des Wörterbuchs sind red, green und blue, und die entsprechenden Werte sind Ankerpunkte, die als Zeilen in einer Matrix der Form [x[i] yleft[i] yright[i]] angegeben sind. In jedem Eintrag eines cdict muss der x[i]-Wert monoton von 0 auf 1 steigen.

Sie können ein Farbwörterbuch wie folgt erstellen.

cdict = {
    "blue": [[0.0, 0.0, 0.0], [0.5, 1.0, 1.0], [1.0, 1.0, 1.0]],
    "red": [[0.0, 0.0, 0.0], [0.25, 0.0, 0.0], [0.75, 1.0, 1.0], [1.0, 1.0, 1.0]],
    "green": [[0.0, 0.0, 0.0], [0.5, 0.0, 0.0], [1.0, 1.0, 1.0]],
}

Verwenden Sie Ankerpunkte, um eine benutzerdefinierte linear segmentierte Farbkarte in Python zu erstellen

Nachdem Sie ein cdict erstellt haben, können Sie die Methode LinearSegmentedColormap() verwenden, um eine linear segmentierte Farbkarte zu erstellen. Die Syntax der Methode LinearSegmentedColormap() ist wie folgt.

matplotlib.colors.LinearSegmentedColormap(name, segmentdata, N=256, gamma=1.0)
  1. Der Parameter name gibt den Namen der Farbtabelle an. Es muss eine Zeichenfolge sein.
  2. Der Parameter segmentdata nimmt das cdict als Eingabeargument.
  3. Der Parameter N bezeichnet die Anzahl von Punkten in der Farbabbildungs-Nachschlagetabelle. Es hat einen Standardwert von 256.
  4. Der Parameter gamma bezeichnet die verwendete Skalierung für x-Koordinaten. Es hat einen Standardwert von 1,0.

Wie unten gezeigt, können wir mit der Methode LinearSegmentedColormap() eine linear segmentierte Farbkarte erstellen.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors

xdata = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
ydata = [x * x for x in xdata]
norm = plt.Normalize(1, 150)
cdict = {
    "blue": [[0.0, 0.0, 0.0], [0.5, 1.0, 1.0], [1.0, 1.0, 1.0]],
    "red": [[0.0, 0.0, 0.0], [0.25, 0.0, 0.0], [0.75, 1.0, 1.0], [1.0, 1.0, 1.0]],
    "green": [[0.0, 0.0, 0.0], [0.5, 0.0, 0.0], [1.0, 1.0, 1.0]],
}
newcmp = LinearSegmentedColormap("testCmap", segmentdata=cdict, N=256)
c = np.linspace(0, 80, 12)
plt.scatter(xdata, ydata, c=c, cmap=newcmp, norm=norm)
plt.colorbar()
plt.show()

Ausgabe:

Verwenden Sie Ankerpunkte, um eine benutzerdefinierte linear segmentierte Farbkarte in Python zu erstellen

Verwenden Sie Farbnamen, um eine benutzerdefinierte linear segmentierte Farbkarte in Python zu erstellen

Anstatt ein cdict zu verwenden, können wir auch eine Liste von Farben verwenden, um eine benutzerdefinierte Farbtabelle zu erstellen. Dazu können wir die Methode LinearSegmentedColormap.from_list() verwenden. Die Syntax der Methode from_list() ist wie folgt.

from_list(name, colors, N=256, gamma=1.0)

Hier nimmt der Parameter colors eine Liste von Farben als Eingabeargument. Alle anderen Parameter ähneln der Methode LinearSegmentedColormap().

Sie können eine linear segmentierte Farbkarte mit der Methode from_list() wie folgt erstellen.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors

xdata = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
ydata = [x * x for x in xdata]
norm = plt.Normalize(1, 150)
colorlist = ["darkorange", "gold", "lawngreen", "lightseagreen"]
newcmp = LinearSegmentedColormap.from_list("testCmap", colors=colorlist, N=256)
c = np.linspace(0, 80, 12)
plt.scatter(xdata, ydata, c=c, cmap=newcmp, norm=norm)
plt.colorbar()
plt.show()

Ausgabe:

Verwenden Sie Farbnamen, um eine benutzerdefinierte linear segmentierte Farbkarte in Python zu erstellen

Fazit

In diesem Artikel wurden verschiedene Möglichkeiten zum Erstellen einer benutzerdefinierten Farbtabelle mit Matplotlib in Python beschrieben. Wir haben aufgelistete Farbkarten und linear segmentierte Farbkarten erstellt und einige Daten unter Verwendung der Farbkarten geplottet.

Autor: Aditya Raj
Aditya Raj avatar Aditya Raj avatar

Aditya Raj is a highly skilled technical professional with a background in IT and business, holding an Integrated B.Tech (IT) and MBA (IT) from the Indian Institute of Information Technology Allahabad. With a solid foundation in data analytics, programming languages (C, Java, Python), and software environments, Aditya has excelled in various roles. He has significant experience as a Technical Content Writer for Python on multiple platforms and has interned in data analytics at Apollo Clinics. His projects demonstrate a keen interest in cutting-edge technology and problem-solving, showcasing his proficiency in areas like data mining and software development. Aditya's achievements include securing a top position in a project demonstration competition and gaining certifications in Python, SQL, and digital marketing fundamentals.

GitHub

Verwandter Artikel - Matplotlib Color