Python-Adventskalender 2015 von Adventar Dies ist der Artikel am 21. Tag.
Ich denke, Sie werden beim Zeichnen eines Diagramms in Python Matplotlib verwenden. Vor kurzem gab es eine Bibliothek namens Seaborn, die das Diagramm bereinigt, und ich liebe es. Es ist jedoch praktisch, die Farbkarte mit + α anzupassen, wenn Sie die Farbe freier auswählen oder einstellen möchten. Dieses Mal werde ich dies vorstellen.
Zunächst ist es der übliche Set-Import. Die meisten davon befinden sich in Anaconda, aber Sie können die fehlenden mit pip install <Bibliotheksname, den Sie installieren möchten>
installieren.
import numpy as np
import pandas as pd
from sklearn import datasets
import matplotlib.pyplot as plt
import matplotlib.cm as cm
%matplotlib inline
import seaborn as sns
sns.set(style="darkgrid", palette="muted", color_codes=True)
Ich benutze den üblichen Iris-Datensatz als Test.
#Irisdaten laden
iris = datasets.load_iris()
Wenn Sie einfach ein Streudiagramm zeichnen, indem Sie jeden Iristyp farblich kennzeichnen, wird es wie folgt schwarzweiß ...
#Anzeige des Streudiagramms (Farbe wird schwarz und weiß ...)
plt.figure(figsize=(10,7))
plt.scatter(iris.data[:,0], iris.data[:,1], linewidths=0, alpha=1,
c=iris.target # iris.Ziel repräsentiert den Typ[0, 1, 2]Da es enthält, ist es farbcodiert
)
plt.show()
Sie können die Farbe angeben, indem Sie den Namen der Farbe einzeln im Argument "c" angeben. Aber ich denke nicht, dass es klug ist.
#Anzeige des Streudiagramms (Farben einzeln angeben)
def set_color(l):
if l == 0:
return "b" # blue
elif l == 1:
return "g" # green
else:
return "r" # red
color_list = map(set_color, iris.target)
plt.figure(figsize=(10,7))
plt.scatter(iris.data[:,0], iris.data[:,1], linewidths=0, alpha=1,
c=iris.target # iris.Ziel repräsentiert den Typ[0, 1, 2]Da es enthält, ist es farbcodiert
)
plt.show()
Da es schwierig ist, die Farbe für jeden Typ anzugeben, können Sie auch die ursprünglich in Matplotlib definierte Farbkarte verwenden. Für Colormaps können Sie verschiedene Colormap-Definitionen unter hier anzeigen.
#Wenden Sie die definierte Farbkarte an
#Referenz: http://matplotlib.org/examples/color/colormaps_reference.html
fig = plt.figure(figsize=(13,7))
im = plt.scatter(iris.data[:,0], iris.data[:,1], c=iris.target, linewidths=0, alpha=1,
cmap=cm.Accent #Geben Sie hier die Farbkarte an
)
fig.colorbar(im)
plt.show()
Es ist jedoch schwierig, die gewünschte Farbe zu finden.
Lassen Sie uns diese Farbkarte also selbst anpassen und definieren. Wenn Sie in der Liste einen Farbnamen oder einen hexadezimalen Farbcode angeben, wird eine Farbkarte erstellt, die die Leerzeichen reibungslos linear ergänzt. Ich kann es nicht gut auf Japanisch erklären, also schauen wir uns ein Anwendungsbeispiel an.
#Passen Sie die Farbkarte an
from matplotlib.colors import LinearSegmentedColormap
def generate_cmap(colors):
"""Gibt eine selbst definierte Farbkarte zurück"""
values = range(len(colors))
vmax = np.ceil(np.max(values))
color_list = []
for v, c in zip(values, colors):
color_list.append( ( v/ vmax, c) )
return LinearSegmentedColormap.from_list('custom_cmap', color_list)
Da es 3 Arten von Irisdaten gibt, geben Sie 3 Farben an. Eine Liste der verwendbaren Farbnamen finden Sie unter hier.
#Farben anpassen,Teil 1:Angegeben durch den Farbnamen
#Referenz: http://matplotlib.org/examples/color/named_colors.html
unique_value = set(iris.target)
print unique_value
# --> [0, 1, 2]
cm = generate_cmap(['mediumblue', 'limegreen', 'orangered'])
fig = plt.figure(figsize=(13,7))
im = plt.scatter(iris.data[:,0], iris.data[:,1], c=iris.target, linewidths=0, alpha=.8, cmap=cm)
fig.colorbar(im)
plt.show()
Sie können es auch in hexadezimaler Schreibweise anstelle des Farbnamens angeben. Hier war hilfreich für den hexadezimalen Farbcode.
#Farben anpassen,Teil 2: Hexadezimal bezeichnet
# http://www5.plala.or.jp/vaio0630/hp/c_code.htm
cm = generate_cmap(['#87CEEB', '#2E8B57', '#F4A460'])
fig = plt.figure(figsize=(13,7))
im = plt.scatter(iris.data[:,0], iris.data[:,1], c=iris.target, linewidths=0, alpha=.8, cmap=cm)
fig.colorbar(im)
plt.show()
Wenn eine helle Farbe angegeben wird, ist ein weißer Hintergrund leichter zu erkennen als ein grauer Hintergrund. Sie können es mit seaborn ändern, also lassen Sie uns den Hintergrund weiß machen.
#Farben anpassen,Teil 3: Den Hintergrund aufhellen
sns.set(style="whitegrid", palette="muted", color_codes=True)
cm = generate_cmap(['#87CEEB', '#2E8B57', '#F4A460'])
fig = plt.figure(figsize=(13,7))
im = plt.scatter(iris.data[:,0], iris.data[:,1], c=iris.target, linewidths=0, alpha=.8, cmap=cm)
fig.colorbar(im)
plt.show()
Als nächstes drücken wir den Wert der Funktion aus, die Ebenenkoordinaten (zwei Variablen) als Argumente in Farbe verwendet. Die Anpassung der Farbkarte ist in diesen Fällen sehr effektiv.
#Glatte Füllung
n = 501
X, Y = np.meshgrid(np.linspace(0, 1, n), np.linspace(0, 1, n))
Z = np.sin(X*30) + np.cos(Y*30)
print np.min(Z), np.max(Z)
cm = generate_cmap(['#00008B', '#aaaaab', '#FFFFFF', '#F4D793', '#F4A460'])
fig =plt.figure(figsize=(10,8))
im = plt.pcolor(X, Y, Z, cmap=cm)
fig.colorbar(im)
plt.xlim(0, 1)
plt.ylim(0, 1)
plt.show()
Schließlich ist hier ein Beispiel für das Ausdrücken der Höhe von Konturlinien in Farbe. Es ist auch sehr effektiv, die Einbeziehung der Abstufung in die Farbkarte angeben zu können.
#Kontur
n = 201
X, Y = np.meshgrid(np.linspace(0, 1, n), np.linspace(0, 1, n))
Z = np.sin(X*20) * np.cos(Y*20)
cm = generate_cmap(['indigo', 'white', 'salmon'])
fig =plt.figure(figsize=(10,8))
interval = [i/10. -1 for i in range(20)]
im = plt.contour(X, Y, Z, interval, alpha=0.5, cmap=cm)
fig.colorbar(im)
plt.xlim(0, 1)
plt.ylim(0, 1)
plt.show()
Der Code wird auf GitHub veröffentlicht. https://github.com/matsuken92/Qiita_Contents/blob/master/General/Matplotlib_color_settings.ipynb
Matplotlib colormaps reference http://matplotlib.org/examples/color/colormaps_reference.html Making a custom colormap using matplotlib in python (stackoverflow) http://stackoverflow.com/questions/24997926/making-a-custom-colormap-using-matplotlib-in-python Liste der Farben mit definierten Namen http://matplotlib.org/examples/color/named_colors.html Sechseck-Farbcode http://www5.plala.or.jp/vaio0630/hp/c_code.htm
Recommended Posts