mayavimayavi.mlab

mayavi color all the shape by one color except "some" vertices


To point out shape correspondences I've created, I would like to color a 3d mesh in gray, except some points (e.g. 1 point) in red. Here's my current code, which Unfortunately colors the whole figure in blue, and the last point in red.
enter image description here

And my code

mlab.figure()
        part_color = np.full((self.f.shape[0]),0.98)
        part_color[point_idx] = 1
        part_plot = mlab.triangular_mesh(self.part.vx, self.part.vy, self.part.vz, self.part.triv,
                                         scalars=part_color[:, np.newaxis])

Here is optimally what I'm aiming for (ignore the rest of the figures, I just want a red ball around some points) enter image description here


Solution

  • you have to modify the Look Up Table (LUT) for that.

    I took the "LUT modification" example and adapted it to your needs (highest value is red, everything else is gray):

    # Create some data
    import numpy as np
    
    x, y = np.mgrid[-10:10:200j, -10:10:200j]
    z = 100 * np.sin(x * y) / (x * y)
    
    # Visualize it with mlab.surf
    from mayavi import mlab
    mlab.figure(bgcolor=(1, 1, 1))
    surf = mlab.surf(z, colormap='cool')
    
    # Retrieve the LUT of the surf object.
    lut = surf.module_manager.scalar_lut_manager.lut.table.to_array()
    
    # The lut is a 255x4 array, with the columns representing RGBA
    # (red, green, blue, alpha) coded with integers going from 0 to 255.
    
    # We modify the alpha channel to add a transparency gradient
    lut[:] = 255/2 # all grey
    # red
    lut[-1,0] = 255
    lut[-1,1] = 0
    lut[-1,2] = 0
    
    lut[:, -1] = 255 # 100% translucency
    
    # and finally we put this LUT back in the surface object. We could have
    # added any 255*4 array rather than modifying an existing LUT.
    surf.module_manager.scalar_lut_manager.lut.table = lut
    
    # We need to force update of the figure now that we have changed the LUT.
    mlab.draw()
    mlab.view(40, 85)
    

    hi in red, else is grey