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?
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()
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
, 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()
-
¡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 comoplt.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()
oplt.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
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()
-
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, conshape=(n,1)
entoncescolors = 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()
-
¿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")