2015-10-01 3 views

Répondre

1

vous pouvez définir les vmin et vmax du colormap explicitement mlab.points3d. Donc, vous pouvez simplement vous assurer que vmin = -vmax. Quelque chose comme ceci:

mylimit = 10 
mlab.points3d(x, y, z, e, colormap='RdBu',vmin=-mylimit,vmax=mylimit) 

Ou, vous pouvez définir la limite automatiquement avec quelque chose comme:

mylimit = max(abs(e.min()),abs(e.max())) 
1

Au cas où quelqu'un veut le faire, mais de telle sorte que toute l'étendue du colorbar est utilisé, ici est une solution que j'ai fait (avec l'aide de here) pour mayavi qui étire la colorbar pour que le centre de celui-ci est sur zéro:

#Mayavi surface 
s = mlab.surf(data) 
#Get the lut table of the data 
lut = s.module_manager.scalar_lut_manager.lut.table.asarray() 

maxd = np.max(data) 
mind = np.min(data) 
#Data range 
dran = maxd - mind 

#Proportion of the data range at which the centred value lies 
zdp = abs(mind/dran)  

#The +0.5's here are because floats are rounded down when converted to ints 
#index equal portion of distance along colormap 
cmzi = int(zdp * 255 + 0.5) 
#linspace from zero to 128, with number of points matching portion to side of zero 
topi = np.linspace(0, 127, cmzi) + 0.5 
#and for other side 
boti = np.linspace(128, 255, 255 - cmzi) + 0.5  

#convert these linspaces to ints and map the new lut from these  
shift_index = np.hstack([topi.astype(int), boti.astype(int)]) 
s.module_manager.scalar_lut_manager.lut.table = self.lut[shift_index] 

#Force update of the figure now that we have changed the LUT 
mlab.draw() 

Notez que si vous souhaitez faire mul temps tiple pour la même surface (ie. si vous modifiez les scalaires mayavi plutôt que de redessiner le tracé), vous devez enregistrer la table initiale de lut et la modifier à chaque fois.