Nuage de points Matplotlib; couleur en fonction d'une troisième variable

152

Je veux faire un nuage de points (en utilisant matplotlib) où les points sont ombrés selon une troisième variable. Je suis très proche de ceci:

plt.scatter(w, M, c=p, marker='s')

où w et M sont les points de données et p est la variable que je veux ombrer par rapport à.
Cependant, je veux le faire en niveaux de gris plutôt qu'en couleur. Quelqu'un peut-il aider?

Thomas Collett
la source

Réponses:

156

Il n'est pas nécessaire de définir manuellement les couleurs. À la place, spécifiez une palette de couleurs en niveaux de gris ...

import numpy as np
import matplotlib.pyplot as plt

# Generate data...
x = np.random.random(10)
y = np.random.random(10)

# Plot...
plt.scatter(x, y, c=y, s=500)
plt.gray()

plt.show()

entrez la description de l'image ici

Ou, si vous préférez une gamme plus large de couleurs , vous pouvez également spécifier le cmapkwarg à scatter. Pour utiliser la version inversée de l'un d'entre eux, spécifiez simplement la _rversion " " de l'un d'entre eux. Par exemple gray_rau lieu de gray. Il y a plusieurs niveaux de gris différents colormaps pré-faites (par exemple gray, gist_yarg, binary, etc.).

import matplotlib.pyplot as plt
import numpy as np

# Generate data...
x = np.random.random(10)
y = np.random.random(10)

plt.scatter(x, y, c=y, s=500, cmap='gray')
plt.show()
Joe Kington
la source
1
Merci! Est-il possible de dessiner des contours autour de ces points contenant une certaine quantité du poids total?
Thomas Collett
6
mpl.cmest également disponible directement sous forme de plt.cm.
heltonbiker
@Thomas Collet: Si vous voulez dessiner des contours, vous devez interpoler les données des points sur une matrice 2D, puis tracer cela en utilisant plt.contour()ou plt.contourf()- mais c'est une question différente
Zak
Comment pouvez-vous ajouter l'étiquette dans la légende? Dans ce cas avec des nombres continus, je suppose que vous utiliseriez la barre de couleurs. Qu'en est-il dans le cas des valeurs discrètes? par exemple pourrais-je ajouter 3 étiquettes dans la légende pour mes trois catégories?
Nate
26

Dans matplotlib, les couleurs grises peuvent être données sous la forme d'une chaîne d'une valeur numérique comprise entre 0-1.
Par exemplec = '0.1'

Ensuite, vous pouvez convertir votre troisième variable en une valeur à l'intérieur de cette plage et l'utiliser pour colorer vos points.
Dans l'exemple suivant, j'ai utilisé la position y du point comme valeur qui détermine la couleur:

from matplotlib import pyplot as plt

x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
y = [125, 32, 54, 253, 67, 87, 233, 56, 67]

color = [str(item/255.) for item in y]

plt.scatter(x, y, s=500, c=color)

plt.show()

entrez la description de l'image ici

Joaquin
la source
3
Pour mémoire, vous pouvez appliquer ALPHA en tant que palette de couleurs si vous fournissez un tableau en forme (n, 4) comme cargument, avec des valeurs alpha dans la quatrième colonne. Si la troisième variable est Z, avec shape=(n,1), alors colors = numpy.hstack((numpy.zeros_like(z), numpy.zeros_like(z), numpy.ones_like(z), z/z.max()))donne un très bel effet (bien sûr, il peut être modifié).
heltonbiker
J'obtiens une erreur: `` La longueur de la séquence rgba doit être de 3 ou 4 ''
MattCochrane
1
@MattClimbs Je suppose que vous appelez plt.plot plutôt que plt.scatter comme dans l'exemple.
smashbro
comment ajouter une barre de couleurs à ce tracé?
FaCoffee
2
@FaCoffee plt.colorbar()fera ça
Mathew Savage
10

Parfois, vous devrez peut-être tracer la couleur avec précision en fonction du cas de la valeur x . Par exemple, vous pouvez avoir un dataframe avec 3 types de variables et quelques points de données. Et vous voulez faire la suite,

  • Tracez les points correspondant à la variable physique «A» en ROUGE.
  • Tracez les points correspondant à la variable physique «B» en BLEU.
  • Tracez les points correspondant à la variable physique «C» en VERT.

Dans ce cas, vous devrez peut-être écrire dans une fonction courte pour mapper les valeurs x aux noms de couleur correspondants sous forme de liste, puis transmettre cette liste à la plt.scattercommande.

x=['A','B','B','C','A','B']
y=[15,30,25,18,22,13]

# Function to map the colors as a list from the input list of x variables
def pltcolor(lst):
    cols=[]
    for l in lst:
        if l=='A':
            cols.append('red')
        elif l=='B':
            cols.append('blue')
        else:
            cols.append('green')
    return cols
# Create the colors list using the function above
cols=pltcolor(x)

plt.scatter(x=x,y=y,s=500,c=cols) #Pass on the list created by the function here
plt.grid(True)
plt.show()

Coloration du nuage de points en fonction de la variable x

Tirtha
la source
comment créer une barre de couleur pour ce tracé?
Maryam Rahmani Moghaddam le