在 Mayavi 中以 0 为中心的颜色图
Center a colormap around 0 in Mayavi
我正在绘制点云并根据残差着色。我希望颜色图保持以 0 为中心,这样 0 错误就是白色。
我明白了answers for matplotlib。 Mayavi 呢?
from mayavi import mlab
mlab.points3d(x, y, z, e, colormap='RdBu')
您可以使用 mlab.points3d
显式设置颜色图的 vmin
和 vmax
。因此,您只需确保 vmin
= -vmax
。像这样:
mylimit = 10
mlab.points3d(x, y, z, e, colormap='RdBu',vmin=-mylimit,vmax=mylimit)
或者,您可以使用以下内容自动设置限制:
mylimit = max(abs(e.min()),abs(e.max()))
如果有人希望这样做,但要使用颜色条的全部范围,这是我为 mayavi 制作的解决方案(在 here 的帮助下),它拉伸颜色条,使中心其中为零:
#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()
请注意,如果您希望对同一表面多次执行此操作(即,如果您正在修改 mayavi 标量而不是重新绘制绘图),您需要记录初始 lut table 并每次修改它。
我正在绘制点云并根据残差着色。我希望颜色图保持以 0 为中心,这样 0 错误就是白色。
我明白了answers for matplotlib。 Mayavi 呢?
from mayavi import mlab
mlab.points3d(x, y, z, e, colormap='RdBu')
您可以使用 mlab.points3d
显式设置颜色图的 vmin
和 vmax
。因此,您只需确保 vmin
= -vmax
。像这样:
mylimit = 10
mlab.points3d(x, y, z, e, colormap='RdBu',vmin=-mylimit,vmax=mylimit)
或者,您可以使用以下内容自动设置限制:
mylimit = max(abs(e.min()),abs(e.max()))
如果有人希望这样做,但要使用颜色条的全部范围,这是我为 mayavi 制作的解决方案(在 here 的帮助下),它拉伸颜色条,使中心其中为零:
#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()
请注意,如果您希望对同一表面多次执行此操作(即,如果您正在修改 mayavi 标量而不是重新绘制绘图),您需要记录初始 lut table 并每次修改它。