Diagrama de dispersión y mapeo de color en Python

91

Tengo un rango de puntos xey almacenados en matrices numpy. Estos representan x (t) y y (t) donde t = 0 ... T-1

Estoy trazando un diagrama de dispersión usando

import matplotlib.pyplot as plt

plt.scatter(x,y)
plt.show()

Me gustaría tener un mapa de colores que represente el tiempo (por lo tanto, colorea los puntos según el índice en las matrices numpy)

¿Cuál es la forma más sencilla de hacerlo?

Vincent
fuente

Respuestas:

170

Aquí hay un ejemplo

import numpy as np
import matplotlib.pyplot as plt

x = np.random.rand(100)
y = np.random.rand(100)
t = np.arange(100)

plt.scatter(x, y, c=t)
plt.show()

Aquí está configurando el color según el índice t, que es solo una matriz de [1, 2, ..., 100]. ingrese la descripción de la imagen aquí

Quizás un ejemplo más fácil de entender es el ligeramente más simple

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(100)
y = x
t = x
plt.scatter(x, y, c=t)
plt.show()

ingrese la descripción de la imagen aquí

Tenga en cuenta que la matriz que pasa como cno necesita tener ningún orden o tipo en particular, es decir, no necesita ser ordenada o enteros como en estos ejemplos. La rutina de trazado escalará el mapa de colores de modo que los valores mínimo / máximo en ccorrespondan a la parte inferior / superior del mapa de colores.

Mapas de colores

Puede cambiar el mapa de colores agregando

import matplotlib.cm as cm
plt.scatter(x, y, c=t, cmap=cm.cmap_name)

La importación matplotlib.cmes opcional, ya que también puede llamar a mapas de colores cmap="cmap_name". Hay una página de referencia de mapas de colores que muestra el aspecto de cada uno. También sepa que puede invertir un mapa de colores simplemente llamándolo como cmap_name_r. Entonces tampoco

plt.scatter(x, y, c=t, cmap=cm.cmap_name_r)
# or
plt.scatter(x, y, c=t, cmap="cmap_name_r")

trabajará. Los ejemplos son "jet_r"o cm.plasma_r. Aquí hay un ejemplo con el nuevo viridis de mapa de colores 1.5:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(100)
y = x
t = x
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.scatter(x, y, c=t, cmap='viridis')
ax2.scatter(x, y, c=t, cmap='viridis_r')
plt.show()

ingrese la descripción de la imagen aquí

Barras de colores

Puede agregar una barra de colores usando

plt.scatter(x, y, c=t, cmap='viridis')
plt.colorbar()
plt.show()

ingrese la descripción de la imagen aquí

Tenga en cuenta que si está utilizando figuras y subtramas explícitamente (por ejemplo, fig, ax = plt.subplots()o ax = fig.add_subplot(111)), agregar una barra de colores puede ser un poco más complicado. Se pueden encontrar buenos ejemplos aquí para una sola barra de color de subparcela y aquí para 2 subtramas 1 barra de color .

wflynny
fuente
1
Puede obtener una leyenda para los colores con el plt.colorbar()comando.
drevicko
El código parece haber cambiado aquí. Cmap = cm.colormap_name ahora debería ser cmap = cm.cmapname.
Chris
@ cmarti1138 No estoy seguro de lo que quiere decir, cm.colormap_namey cm.cmapnameno de variables reales en matplotlib.cm; es solo un pseudocódigo para cm.jeto cm.veridis_r, etc.
wflynny
¿Hay alguna forma de cambiar la cmapo la clista de una curva ya trazada?
Guimoute
10

Para agregar a la respuesta de wflynny anterior, puede encontrar los mapas de colores disponibles aquí

Ejemplo:

import matplotlib.cm as cm
plt.scatter(x, y, c=t, cmap=cm.jet)

o alternativamente,

plt.scatter(x, y, c=t, cmap='jet')
Nathan
fuente
3

Barra de color de la subtrama

Para las subtramas con dispersión, puede engañar una barra de colores en sus ejes construyendo el "mapeable" con la ayuda de una figura secundaria y luego agregándolo a su trama original.

Como continuación del ejemplo anterior:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(10)
y = x
t = x
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.scatter(x, y, c=t, cmap='viridis')
ax2.scatter(x, y, c=t, cmap='viridis_r')


# Build your secondary mirror axes:
fig2, (ax3, ax4) = plt.subplots(1, 2)

# Build maps that parallel the color-coded data
# NOTE 1: imshow requires a 2-D array as input
# NOTE 2: You must use the same cmap tag as above for it match
map1 = ax3.imshow(np.stack([t, t]),cmap='viridis')
map2 = ax4.imshow(np.stack([t, t]),cmap='viridis_r')

# Add your maps onto your original figure/axes
fig.colorbar(map1, ax=ax1)
fig.colorbar(map2, ax=ax2)
plt.show()

Dispersión de subparcelas con COLORBAR

Tenga en cuenta que también generará una figura secundaria que puede ignorar.

Audelia
fuente