[Python] Personnalisez la palette de couleurs lors du dessin de graphiques avec matplotlib

Calendrier de l'Avent Python 2015 de Adventar C'est l'article du 21e jour.

Lorsque vous dessinez un graphe en Python, je pense que vous utiliserez Matplotlib. Récemment, il existe une bibliothèque appelée Seaborn qui nettoie le graphe, et j'adore ça. Cependant, il est pratique de personnaliser la palette de couleurs avec + α lorsque vous souhaitez sélectionner ou définir la couleur plus librement. Cette fois, je vais vous présenter ceci.

Préparation

Tout d'abord, c'est l'import de set habituel. La plupart d'entre eux sont dans Anaconda, mais vous pouvez installer ceux qui manquent avec pip install <nom de la bibliothèque que vous voulez installer>.

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) 

J'utilise l'ensemble de données d'iris habituel comme un essai.

#Chargement des données d'iris
iris = datasets.load_iris()

Si vous dessinez un diagramme de dispersion en codant par couleur chaque type d'iris, il sera noir et blanc comme ceci ...

#Affichage du diagramme de dispersion (la couleur devient noir et blanc ...)
plt.figure(figsize=(10,7))
plt.scatter(iris.data[:,0], iris.data[:,1], linewidths=0, alpha=1,
            c=iris.target   # iris.la cible représente le type[0, 1, 2]Parce qu'il contient, il est codé par couleur
           )
plt.show()

plot_01.png

Vous pouvez spécifier la couleur en spécifiant le nom de la couleur individuellement dans l'argument c. Mais je ne pense pas que ce soit intelligent.

#Affichage du diagramme de dispersion (spécifier les couleurs une par une)
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.la cible représente le type[0, 1, 2]Parce qu'il contient, il est codé par couleur
           )
plt.show()

plot_02.png

Comme il est difficile de spécifier la couleur pour chaque type, vous pouvez également utiliser la palette de couleurs initialement définie dans Matplotlib. Pour les cartes de couleurs, vous pouvez voir les définitions des différentes cartes de couleurs en vous référant à ici.

#Appliquer la palette de couleurs définie
#Référence: 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 #Spécifiez la palette de couleurs ici
                )
fig.colorbar(im)
plt.show()

Mais il est difficile de faire correspondre la couleur souhaitée. plot_03.png

Personnalisation de la palette de couleurs

Alors, personnalisons et définissons nous-mêmes cette carte de couleurs. Si vous spécifiez un nom de couleur ou un code de couleur hexadécimal dans la liste, une carte de couleurs sera créée tout en complétant de manière linéaire et linéaire les espaces. Je ne peux pas bien l'expliquer en japonais, alors jetons un coup d'œil à un exemple d'utilisation.

#Personnaliser la palette de couleurs
from matplotlib.colors import LinearSegmentedColormap

def generate_cmap(colors):
    """Renvoie une palette de couleurs auto-définie"""
    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)

Puisqu'il existe 3 types de données d'iris, spécifiez 3 couleurs. Vous pouvez voir une liste de noms de couleurs utilisables en vous référant à ici.

#Personnalisez les couleurs,Partie 1:Spécifié par le nom de la couleur
#Référence: 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()

plot_04.png

Vous pouvez également le spécifier en notation hexadécimale au lieu du nom de la couleur. Ici était utile pour le code de couleur hexadécimal.

#Personnalisez les couleurs,Partie 2: Désigné en hexadécimal
# 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()

plot_04-2.png

Lorsqu'une couleur claire est spécifiée, un arrière-plan blanc est plus facile à voir qu'un arrière-plan gris. Vous pouvez le changer avec seaborn, alors rendons l'arrière-plan blanc.

#Personnalisez les couleurs,Partie 3: blanchir l'arrière-plan
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()

plot_05.png

Ensuite, exprimons la valeur de la fonction qui prend les coordonnées planes (deux variables) comme arguments en couleur. La personnalisation de la palette de couleurs est très efficace dans ces cas.

#Remplissage lisse
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()

plot_06.png

Enfin, voici un exemple d'expression de la hauteur des lignes de contour en couleur. Il est également très efficace de pouvoir spécifier notamment la gradation dans la carte des couleurs.

#contour
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()

plot_07.png

Code pour cet article

Le code est publié sur GitHub. https://github.com/matsuken92/Qiita_Contents/blob/master/General/Matplotlib_color_settings.ipynb

référence

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 des couleurs avec des noms définis  http://matplotlib.org/examples/color/named_colors.html Code couleur hexagonal  http://www5.plala.or.jp/vaio0630/hp/c_code.htm

Recommended Posts

[Python] Personnalisez la palette de couleurs lors du dessin de graphiques avec matplotlib
Quand matplotlib ne fonctionne pas avec python2.7
[Python] Comment dessiner plusieurs graphiques avec Matplotlib
Carte thermique par Python + matplotlib
[Python] Ravel () est pratique pour dessiner plusieurs graphiques
Dessin en temps réel avec matplotlib
Dessiner avec Python Tinker
(Pour ceux qui ne connaissent pas Matplotlib) Conseils pour dessiner des graphiques avec Seaborn
Méthode de dessin graphique avec matplotlib
Erreur lors de la lecture avec python
Animer plusieurs graphiques avec matplotlib
[python] Comment utiliser Matplotlib, une bibliothèque pour dessiner des graphiques
Créer une animation de tracé avec Python + Matplotlib
Manuel de graphisme Python avec Matplotlib.
Dessinez facilement des graphiques avec matplotlib
Dessinez Riapnov Fractal avec Python, matplotlib
Effectuer un tracé de probabilité normale logarithmique avec Python, matplotlib
Précautions lors de l'utilisation de six avec Python 2.5
[Python] Formater quand to_csv avec des pandas
[Python] Définissez la plage du graphique avec matplotlib
Extrait de code pour une recherche de bits complète avec python
Remarques lors de la création d'un environnement avec python
Essayez de dessiner une distribution normale avec matplotlib
[Python] Dessiner un motif de tourbillon avec une tortue
Points à noter lors de la résolution de problèmes DP avec Python
Ecrire des graphiques SVG avec matplotlib avec heroku
Afficher le graphique japonais avec VS Code + matplotlib
[Python] Rendons matplotlib compatible avec le japonais
Dessin avec Matrix-Reinventor of Python Image Processing-
Essayez de dessiner une carte avec python + cartopy 0.18.0
[Calcul scientifique / technique par Python] Dessin d'animation de mouvement parabolique avec locus, matplotlib
Erreur lors de l'installation d'un module avec Python pip
[Python] axe limite du graphe 3D avec Matplotlib
Lire les données csv Python avec Pandas ⇒ Graphique avec Matplotlib
Conseils de dessin avec matplotlib côté serveur
Premiers pas avec le dessin avec matplotlib: écrire des fonctions simples
Conseils personnels lorsque vous faites diverses choses avec Python 3
Précautions lors du traitement des structures de contrôle dans Python 2.6
Un mémo lors de la création d'un environnement python avec miniconda
Encodage de caractères lors du traitement de fichiers en Python 3
[python] [vscode] Lorsque vous vous fâchez avec space-tab-mixed
Dessin graphique avec jupyter (notebook ipython) + matplotlib + vagrant
Matériel à lire lors de la mise en route de Python
[python] Dessin simplifié
FizzBuzz en Python3
Grattage avec Python
Statistiques avec python
Grattage avec Python
Python avec Go
Les bases de #Python (#matplotlib)
Twilio avec Python
Jouez avec 2016-Python
Testé avec Python
Animation avec matplotlib
avec syntaxe (Python)
Mon matplotlib (Python)
Japonais avec matplotlib
Bingo avec python
Animation avec matplotlib
histogramme avec matplotlib
Faire une animation avec matplotlib