barra de colores matplotlib para dispersión

89

Estoy trabajando con datos que tienen 3 parámetros de trazado: x, y, c. ¿Cómo se crea un valor de color personalizado para un diagrama de dispersión?

Ampliando este ejemplo que estoy tratando de hacer:

import matplotlib
import matplotlib.pyplot as plt
cm = matplotlib.cm.get_cmap('RdYlBu')
colors=[cm(1.*i/20) for i in range(20)]
xy = range(20)
plt.subplot(111)
colorlist=[colors[x/2] for x in xy] #actually some other non-linear relationship
plt.scatter(xy, xy, c=colorlist, s=35, vmin=0, vmax=20)
plt.colorbar()
plt.show()

pero el resultado es TypeError: You must first set_array for mappable

Adam Greenhall
fuente

Respuestas:

196

De los documentos de matplotlib en la dispersión 1 :

cmap solo se usa si c es una matriz de flotantes

Por lo tanto, la lista de colores debe ser una lista de flotantes en lugar de una lista de tuplas como la tiene ahora. plt.colorbar () quiere un objeto mapeable, como CircleCollection que devuelve plt.scatter (). vmin y vmax pueden controlar los límites de su barra de colores. Las cosas fuera de vmin / vmax obtienen los colores de los puntos finales.

¿Cómo funciona esto para ti?

import matplotlib.pyplot as plt
cm = plt.cm.get_cmap('RdYlBu')
xy = range(20)
z = xy
sc = plt.scatter(xy, xy, c=z, vmin=0, vmax=20, s=35, cmap=cm)
plt.colorbar(sc)
plt.show()

Ejemplo de imagen

mate
fuente
Lo probé y obtuve 'AxesSubplot' object has no attribute 'colorbar'. He hecho ax.colorbar()... ¿qué estoy haciendo mal?
Lucas Aimaretto
Este ejemplo no proporciona una aplicación clara cuando se usa la interfaz matplotlib OOP: matplotlib.org/gallery/api/agg_oo_sgskip.html
Ryszard Cetnarski
18

Aquí está la forma OOP de agregar una barra de colores:

fig, ax = plt.subplots()
im = ax.scatter(x, y, c=c)
fig.colorbar(im, ax=ax)
neurita
fuente
Cuando hago esto, termino con la trama completamente reescalada para que todos los puntos estén dentro de una astilla de la trama en el extremo derecho, y la barra de colores es una línea muy delgada en la parte inferior.
Marses
pltCreo que la respuesta correcta, usar directamente para trazar la barra de colores no es una forma recomendada. La suya es una forma recomendada.
GoingMyWay
2

Si está buscando dispersar por dos variables y colorear por la tercera, Altair puede ser una excelente opción.

Creando el conjunto de datos

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

df = pd.DataFrame(40*np.random.randn(10, 3), columns=['A', 'B','C'])

Parcela de Altair

from altair import *
Chart(df).mark_circle().encode(x='A',y='B', color='C').configure_cell(width=200, height=150)

Trama

ingrese la descripción de la imagen aquí

Nipun Batra
fuente