Benutzerdefinierte Farbkarte mit Python Matplotlib
- Verwenden Sie Matplotlib, um eine benutzerdefinierte Colormap in Python zu erstellen
-
Verwenden Sie die Methode
get_cmap()
von Matplotlib, um auf Colormaps und ihre Werte in Python zuzugreifen -
Verwendung des Attributs
colors
des ObjektsListedColormap
zur Erstellung einer benutzerdefinierten Listed Colormap in Python - Wie erstelle ich eine benutzerdefinierte linear segmentierte Farbkarte in Python?
- Fazit
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)
- Der Parameter
name
akzeptiert den Namen der Colormap als String oder alsColormap
-Objekt, das immatplotlib.colors
-Modul definiert ist. Es hat einen Standardwert vonNone
. Wenn wir keine Eingabe für den Parameternamen angeben, gibt die Methodeget_cmap()
die Colormapviridis
zurück. - Wenn eine Colormap mit dem angegebenen Namen in der Matplotlib-Bibliothek definiert ist, gibt die Methode
get_cmap()
eineColormap
-Instanz zurück. - Der Standardwert für den Parameter
lut
istNone
. Wennlut
nichtNone
ist, sollte es eine Ganzzahl sein, die die Anzahl der Farben in der Liste angibt, die zum Definieren der Farbtabelle verwendet wird. - Wenn der
name
keine gültige Colormap ist undlut
nichtNone
ist, wird die Colormap neu abgetastet, umlut
-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:
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)
- Der Parameter
colors
nimmt ein Array oder eine Liste von Farbnamen oder numerischen Werten an, die RGBA-Werte darstellen. - Der Parameter
name
wird verwendet, um der erstellten benutzerdefinierten Farbtabelle einen bestimmten Namen zu geben. Es hat einen Standardwertfrom_list
. - 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 Listecolors
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 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:
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.
- Jeder Ankerpunkt wird als Zeile in einer Matrix der Form
[x[i] yleft[i] yright[i]]
angegeben. Dasx[i]
ist der Anker, undyleft[i]
undyright[i]
sind die Farbwerte auf beiden Seiten des Ankerpunkts. - Wenn die Farbkarte Diskontinuitäten an den Ankerpunkten hat, haben
yleft[i]
undyright[i]
unterschiedliche Werte. Ansonsten habenyleft[i]
undyright[i]
denselben Wert. - Die Ankerpunkte werden in einem Farblexikon gespeichert, oft auch
cdict
genannt. Die Schlüssel des Wörterbuchs sindred
,green
undblue
, 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 einescdict
muss derx[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)
- Der Parameter
name
gibt den Namen der Farbtabelle an. Es muss eine Zeichenfolge sein. - Der Parameter
segmentdata
nimmt dascdict
als Eingabeargument. - Der Parameter N bezeichnet die Anzahl von Punkten in der Farbabbildungs-Nachschlagetabelle. Es hat einen Standardwert von 256.
- 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 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:
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.
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