Cómo colorear marcadores de dispersión en función de una tercera variable

4 minutos de lectura

Avatar de usuario de Thomas Collett
Thomas Collett

Quiero hacer un diagrama de dispersión (usando matplotlib) donde los puntos están sombreados según una tercera variable. Me he acercado mucho a esto:

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

donde w y M son los puntos de datos y p es la variable con respecto a la que quiero sombrear.
Sin embargo, quiero hacerlo en escala de grises en lugar de en color. ¿Alguien puede ayudar?

Avatar de usuario de Joe Kington
jose kington

No hay necesidad de configurar manualmente los colores. En su lugar, especifique un mapa de colores en escala de grises…

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) # s is a size of marker 
plt.gray()

plt.show()

ingrese la descripción de la imagen aquí

O, si prefieres un gama más amplia de mapas de colorestambién puede especificar el cmap kwarg a scatter. Para usar la versión invertida de cualquiera de estos, simplemente especifique el “_r” versión de cualquiera de ellos. Ej. gray_r en lugar de gray. Hay varios mapas de colores en escala de grises diferentes prefabricados (por ejemplo, gray, gist_yarg, binaryetc).

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

  • ¡Gracias! ¿Hay alguna forma de dibujar contornos alrededor de estos puntos que contengan una cierta cantidad del peso total?

    – Thomas Collett

    21 de noviembre de 2011 a las 18:44

  • mpl.cm también está disponible directamente como plt.cm.

    – Heltonbiker

    9 de septiembre de 2012 a las 22:19

  • @Thomas Collet: si desea dibujar contornos, tendría que interpolar los datos de los puntos a una matriz 2D, luego trazar eso usando plt.contour() o plt.contourf() — pero esa es otra pregunta

    – Zak

    28/09/2016 a las 19:21

  • ¿Cómo se puede agregar la etiqueta en la leyenda? En este caso, con números continuos, sospecho que usaría la barra de colores. ¿Qué pasa en el caso de valores discretos? por ejemplo, ¿puedo agregar 3 etiquetas en la leyenda para mis tres categorías?

    – Nate

    19 de junio de 2017 a las 16:37

avatar de usuario de joaquín
joaquín

En matplotlib, los colores grises se pueden dar como una cadena de un valor numérico entre 0-1.
Por ejemplo c="0.1"

Luego puede convertir su tercera variable en un valor dentro de este rango y usarlo para colorear sus puntos.
En el siguiente ejemplo, utilicé la posición y del punto como el valor que determina el color:

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

ingrese la descripción de la imagen aquí

  • Para el registro, puede aplicar ALPHA como un mapa de colores si proporciona una matriz con forma (n,4) como c argumento, con valores alfa en la cuarta columna. Si la tercera variable es Z, con shape=(n,1)entonces colors = numpy.hstack((numpy.zeros_like(z), numpy.zeros_like(z), numpy.ones_like(z), z/z.max())) da un efecto muy agradable (por supuesto que se puede modificar).

    – Heltonbiker

    13 de septiembre de 2013 a las 18:13


  • Recibo un error: ‘la longitud de la secuencia rgba debe ser 3 o 4’

    – Matt Cochrane

    4 de noviembre de 2015 a las 4:51

  • @MattClimbs Sospecho que está llamando a plt.plot en lugar de plt.scatter como en el ejemplo.

    – smashbro

    21 de abril de 2016 a las 9:35

  • ¿Cómo se agrega una barra de colores a esta trama?

    – FaCoffee

    03/08/2016 a las 19:34

  • @FaCoffee plt.colorbar() lo haré

    – Mateo Salvaje

    12 de septiembre de 2017 a las 10:14


A veces puede que necesite trazar el color con precisión en función del caso del valor x. Por ejemplo, puede tener un marco de datos con 3 tipos de variables y algunos puntos de datos. Y quieres seguir,

  • Trace los puntos correspondientes a la variable física ‘A’ en ROJO.
  • Trace los puntos correspondientes a la variable física ‘B’ en AZUL.
  • Trace los puntos correspondientes a la variable física ‘C’ en VERDE.

En este caso, es posible que deba escribir en la función corta para asignar los valores de x a los nombres de color correspondientes como una lista y luego pasar esa lista al plt.scatter dominio.

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

Colorear el diagrama de dispersión en función de la variable x

  • ¿Cómo crear una barra de color para esta trama?

    – MRM

    26 de abril de 2020 a las 22:21

  • ¿Cómo formar la leyenda para esto? He seguido la función anterior para mapear el color de mi elección, pero quiero crear una leyenda correspondiente a cada color.

    – Pablo

    19 oct 2021 a las 10:54

Una solución bastante sencilla también es esta:

fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(8,8)) 

p = ax.scatter(x, y, c=y, cmap='cmo.deep')
fig.colorbar(p,ax=ax,orientation='vertical',label="labelname")

¿Ha sido útil esta solución?