6 votes

Comment colorer un nuage de points `matplotlib` en utilisant une valeur continue [`palettes de couleurs seaborn?`]

J'ai un nuage de points et je veux le colorier en fonction d'une autre valeur (assignée de manière naïve à np.random.random() dans ce cas).

Existe-t-il un moyen d'utiliser seaborn pour mapper une valeur continue (non directement associée aux données tracées) pour chaque point à une valeur le long d'un dégradé continu dans seaborn ?

Voici mon code pour générer les données :

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn import decomposition
import seaborn as sns; sns.set_style("whitegrid", {'axes.grid' : False})

%matplotlib inline
np.random.seed(0)

# Jeu de données Iris
DF_data = pd.DataFrame(load_iris().data, 
                       index = ["iris_%d" % i for i in range(load_iris().data.shape[0])],
                       columns = load_iris().feature_names)

Se_targets = pd.Series(load_iris().target, 
                       index = ["iris_%d" % i for i in range(load_iris().data.shape[0])], 
                       name = "Species")

# Mise à l'échelle : moyenne = 0, variance = 1
DF_standard = pd.DataFrame(StandardScaler().fit_transform(DF_data), 
                           index = DF_data.index,
                           columns = DF_data.columns)

# Sklearn pour l'analyse en composantes principales
# Dimensions
m = DF_standard.shape[1]
K = 2

# ACP (Comment j'ai tendance à le configurer)
Mod_PCA = decomposition.PCA(n_components=m)
DF_PCA = pd.DataFrame(Mod_PCA.fit_transform(DF_standard), 
                      columns=["PC%d" % k for k in range(1,m + 1)]).iloc[:,:K]
# Tracé
fig, ax = plt.subplots()
ax.scatter(x=DF_PCA["PC1"], y=DF_PCA["PC2"], color="k")
ax.set_title("Aucune coloration")

description de l'image

Idéalement, je voulais faire quelque chose comme ceci :

# Classes de couleur
cmap = {obsv_id:np.random.random() for obsv_id in DF_PCA.index}

# Tracé

fig, ax = plt.subplots()
ax.scatter(x=DF_PCA["PC1"], y=DF_PCA["PC2"], color=[cmap[obsv_id] for obsv_id in DF_PCA.index])
ax.set_title("Avec coloration")

mais il n'aimait pas la valeur continue.

Je veux utiliser une palette de couleurs comme :

sns.palplot(sns.cubehelix_palette(8))

description de l'image

J'ai également essayé de faire quelque chose comme ci-dessous, mais cela n'aurait pas de sens car il ne sait pas quelles valeurs j'ai utilisées dans mon dictionnaire cmap ci-dessus :

ax.scatter(x=DF_PCA["PC1"], y=DF_PCA["PC2"],cmap=sns.cubehelix_palette(as_cmap=True)

19voto

mwaskom Points 2974
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

x, y, z = np.random.rand(3, 100)
cmap = sns.cubehelix_palette(as_cmap=True)

f, ax = plt.subplots()
points = ax.scatter(x, y, c=z, s=50, cmap=cmap)
f.colorbar(points)

Veuillez saisir la description de l'image ici

1voto

O.rka Points 867
de matplotlib.cm import ScalarMappable
de matplotlib.colors import Normalize

cmap = {obsv_id:np.random.random() for obsv_id in DF_PCA.index}
sm = ScalarMappable(norm=Normalize(vmin=min(list(cmap.values())), vmax=max(list(cmap.values()))), cmap=sns.cubehelix_palette(as_cmap=True))

# Plot
fig, ax = plt.subplots()
ax.scatter(x=DF_PCA["PC1"], y=DF_PCA["PC2"], color=[sm.to_rgba(cmap[obsv_id]) for obsv_id in DF_PCA.index])
ax.set_title("Avec coloration")

entrez la description de l'image ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X