Mayavi: Mayavi no admite tuplas RGB como datos de puntos

Creado en 22 nov. 2013  ·  9Comentarios  ·  Fuente: enthought/mayavi

En vtk puro es posible tener superficies donde point_data.scalars es un vtkUnsignedCharArray. El renderizador interpretará esto como que proporciona un valor RGB o RGBA distinto para cada vértice y coloreará la superficie en consecuencia si se configuran los ajustes. Los objetos Mayavi no le permiten hacer esto en absoluto porque nunca configuran vtkUnsignedCharArrays.

Eventualmente, sería bueno tenerlo de modo que si el usuario especifica tuplas RGB o RGBA válidas como escalares para funciones mlab, los colores en cada punto se ajusten a los escalares.

Comentario más útil

Ninguna de esas respuestas por sí sola realmente hizo lo que quería, pero finalmente lo descubrí al combinarlas :)

# Imports
import numpy as np
from mayavi.mlab import quiver3d, draw

# Primitives
N = 200 # Number of points
ones = np.ones(N)
scalars = np.arange(N) # Key point: set an integer for each point

# Define color table (including alpha), which must be uint8 and [0,255]
colors = (np.random.random((N, 4))*255).astype(np.uint8)
colors[:,-1] = 255 # No transparency

# Define coordinates and points
x, y, z = colors[:,0], colors[:,1], colors[:,2] # Assign x, y, z values to match color
pts = quiver3d(x, y, z, ones, ones, ones, scalars=scalars, mode='sphere') # Create points
pts.glyph.color_mode = 'color_by_scalar' # Color by scalar

# Set look-up table and redraw
pts.module_manager.scalar_lut_manager.lut.table = colors
draw()

snapshot

Todos 9 comentarios

Los desarrolladores principales de Mayavi están bastante ocupados en otros lugares. Me temo que por
esta solicitud de función suceda, alguien más tendrá que intervenir
y código.

Eso está bien. Lo pensé como una solicitud de funciones para el futuro, sé que es una cantidad considerable de trabajo. Es algo en lo que trataría de trabajar, si pudiera encontrar tiempo.

Muchas gracias por ser tan comprensivo. Claramente la fuerza laboral en
Mayavi no es suficiente para alcanzar todo su potencial.

@GaelVaroquaux, pronto habrá algo de financiación para el proyecto (a partir del segundo trimestre del próximo año).

Me he estado golpeando la cabeza contra esta pared en particular durante la mayor parte del día: ¡especificar una lista de puntos en términos de matrices de [x, y, z, tamaño, color] parece una característica tan obvia! ¡¿Por qué alguien querría que el tamaño de los puntos se bloqueara con el color de los puntos ?!

Su conjunto de requisitos puede ser el de otros. Mayavi se basa en
VTK, que se ha creado como un conjunto de herramientas de visualización general para mostrar
ricos datos que varían continuamente. Tiende a considerar las cosas como abstractas
cantidades que deben asignarse a las propiedades visuales de los objetos. Gusta
o no, estamos bastante obligados a ello.

Dicho esto, es posible disociar el tamaño y el color fácilmente con un poco de
hack: último elemento del siguiente párrafo
http://docs.enthought.com/mayavi/mayavi/mlab.html#adding -color-or-size-variaciones

Gracias por la rápida respuesta. Desafortunadamente, es una limitación importante en términos de la capacidad de Mayavi para trazar datos científicos (ver, por ejemplo, este hilo , con la cita "También tomé la posición fetal y comencé a llorar después de darme cuenta de que la API no tiene una forma clara / predeterminada de colores personalizados ", que resume exactamente mi sentimiento!). Parece que la función es posible en VTK (por ejemplo, esto ), aunque puede que no sea fácil de traducir a Mayavi.

(Por cierto, parece que está familiarizado con lo que estoy tratando de hacer aquí: quiero usar diferentes colores para cada población diferente de neuronas en un modelo 3D de la corteza).

Hola Cliff,

No hay una buena API para esto, pero hay algunas soluciones para hacerlo.

O bien mediante el uso de una matriz de caracteres sin firmar tvtk como sugerí inicialmente aquí

(ver
http://stackoverflow.com/questions/19431099/how-to-directly-set-rgb-rgba-colors-in-mayavi,
es complicado para ciertas fuentes mayavi)

O configurando una gran tabla de colores que contenga todos los valores RGB posibles.

(ver la respuesta del usuario eqzx,
http://stackoverflow.com/questions/18537172/specify-absolute-colour-for-3d-points-in-mayavi?rq=3
)

El viernes 15 de mayo de 2015 a la 1:26 p. M., Cliff Kerr [email protected]
escribió:

Gracias por la rápida respuesta. Desafortunadamente, es una limitación importante en
términos de la capacidad de Mayavi para trazar datos científicos (ver, por ejemplo, este hilo
http://stackoverflow.com/questions/18537172/specify-absolute-colour-for-3d-points-in-mayavi,
con la cita "También tomé la posición fetal y comencé a llorar
después de darme cuenta de que la API no tiene ninguna forma clara / predeterminada de personalización
colores ", que resume exactamente mi sentimiento!). Parece que la función es
posible en VTK (por ejemplo, este
http://www.vtk.org/Wiki/VTK/Examples/Cxx/PolyData/ColoredPoints),
aunque puede que no sea fácil de traducir a Mayavi.

-
Responda a este correo electrónico directamente o véalo en GitHub
https://github.com/enthought/mayavi/issues/92#issuecomment -102463748.

Ninguna de esas respuestas por sí sola realmente hizo lo que quería, pero finalmente lo descubrí al combinarlas :)

# Imports
import numpy as np
from mayavi.mlab import quiver3d, draw

# Primitives
N = 200 # Number of points
ones = np.ones(N)
scalars = np.arange(N) # Key point: set an integer for each point

# Define color table (including alpha), which must be uint8 and [0,255]
colors = (np.random.random((N, 4))*255).astype(np.uint8)
colors[:,-1] = 255 # No transparency

# Define coordinates and points
x, y, z = colors[:,0], colors[:,1], colors[:,2] # Assign x, y, z values to match color
pts = quiver3d(x, y, z, ones, ones, ones, scalars=scalars, mode='sphere') # Create points
pts.glyph.color_mode = 'color_by_scalar' # Color by scalar

# Set look-up table and redraw
pts.module_manager.scalar_lut_manager.lut.table = colors
draw()

snapshot

¿Fue útil esta página
0 / 5 - 0 calificaciones