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.