Matplotlib 3D scatterplot con el color del marcador correspondiente a los valores RGB

He cargado una imagen en una matriz numpy utilizando mahotas.

import mahotas img = mahotas.imread('test.jpg') 

Cada píxel en img está representado por una matriz de valores RGB:

 img[1,1] = [254, 200, 189] 

He realizado un diagtwig de dispersión 3D de los valores R en un eje, los valores G en el segundo eje y los valores B en el tercer eje. Esto no es un problema:

 fig = plt.figure() ax = fig.add_subplot(111, projection = '3d') for i in range(1,img.shape[1]+1): xs = img[i,1][0] ys = img[i,1][1] zs = img[i,1][2] ax.scatter(xs, ys, zs, c='0.5', marker='o') ax.set_xlabel('X Label') ax.set_ylabel('Y Label') ax.set_zlabel('Z Label') plt.show() 

(Estoy trazando la primera columna de la imagen por el momento).

¿Cómo puedo colorear cada uno de los puntos del diagtwig de dispersión por el color de cada píxel de la imagen? es decir, creo que me gustaría colorear los puntos por su valor RGB, pero no estoy seguro de si esto es posible.

Sí, puede hacer esto, pero debe hacerse a través de un mecanismo diferente al del argumento c . En pocas palabras, use facecolors=rgb_array .


En primer lugar, déjame explicarte lo que está pasando. La Collection que devuelve la scatter tiene dos “sistemas” (por falta de un término mejor) para establecer los colores.

Si usa el argumento c , está configurando los colores a través del “sistema” ScalarMappable . Esto especifica que los colores deben controlarse aplicando un mapa de colores a una única variable. (Este es el método set_array de todo lo que se hereda de ScalarMappable ).

Además del sistema ScalarMappable , los colores de una colección se pueden configurar de forma independiente. En ese caso, facecolors las facecolors kwarg.


Como un ejemplo rápido, estos puntos tendrán colores rgb especificados al azar:

 import matplotlib.pyplot as plt import numpy as np x, y = np.random.random((2, 10)) rgb = np.random.random((10, 3)) fig, ax = plt.subplots() ax.scatter(x, y, s=200, facecolors=rgb) plt.show() 

introduzca la descripción de la imagen aquí