Diagrama de dispersión Matplotlib; color en función de una tercera variable

152

Quiero hacer un diagrama de dispersión (usando matplotlib) donde los puntos se sombrean de acuerdo con 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 que quiero sombrear con respecto a.
Sin embargo, quiero hacerlo en escala de grises en lugar de color. ¿Alguien puede ayudar?

Thomas Collett
fuente

Respuestas:

156

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)
plt.gray()

plt.show()

ingrese la descripción de la imagen aquí

O, si prefiere una gama más amplia decmap mapas de color, también puede especificar el kwarg scatter. Para usar la versión inversa de cualquiera de estos, simplemente especifique la " _r" versión de cualquiera de ellos. Por ejemplo, en gray_rlugar de gray. Hay varios mapas de color en escala de grises prefabricados (p gray. Ej 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
fuente
1
¡Gracias! ¿Hay alguna forma de dibujar contornos alrededor de estos puntos que contengan una cierta cantidad del peso total?
Thomas Collett
66
mpl.cmtambién está disponible directamente como plt.cm.
heltonbiker
@Thomas Collet: si desea dibujar contornos, tendría que interpolar los datos de los puntos a una matriz 2D, luego trazarlos usando plt.contour()o plt.contourf(), pero esa es una pregunta diferente
Zak
¿Cómo puedes 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, ¿podría agregar 3 etiquetas en la leyenda para mis tres categorías?
Nate
26

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

Luego puede convertir su tercera variable en un valor dentro de este rango y usarla 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í

joaquin
fuente
3
Para el registro, puede aplicar ALFA como mapa de colores si proporciona una matriz con forma (n, 4) como cargumento, 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, se puede ajustar).
heltonbiker
Recibo un error: 'la longitud de la secuencia rgba debe ser 3 o 4'
MattCochrane
1
@MattClimbs Sospecho que está llamando a plt.plot en lugar de plt.scatter como en el ejemplo.
smashbro
¿Cómo se agrega una barra de colores a esta trama?
FaCoffee
2
@FaCoffee plt.colorbar()hará eso
Mathew Savage
10

A veces es posible que necesite trazar el color con precisión según el caso del valor x . Por ejemplo, puede tener un marco de datos con 3 tipos de variables y algunos puntos de datos. Y quieres hacer lo siguiente,

  • 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 una función corta para asignar los valores de x a los nombres de colores correspondientes como una lista y luego pasar esa lista al plt.scattercomando.

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

Diagrama de dispersión para colorear en función de la variable x

Tirtha
fuente
¿Cómo crear una barra de color para esta trama?
Maryam Rahmani Moghaddam