В случае кто-то хочет это сделать, но так, чтобы в полной мере степень Colorbar используется здесь это решение, которое я сделал (с помощью here) для MayaVi, который тянется Colorbar так, что центр его на ноль:
#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()
Обратите внимание, что если вы хотите сделать это MUL несколько раз для одной и той же поверхности (т. если вы изменяете скаляры майави, а не перерисовываете сюжет), вам нужно сделать запись начальной таблицы лут и изменить это каждый раз.