我经常想要绘制一个差异图像,范围从一些负数到一些正数.问题在于,matlab的色彩图仅从最小值到最大值进行缩放,但不关心某些中间值(这种情况为零).例如,我生成的peaks图像具有不同的单个像素:

原件看起来像这样:

因此,顶部图像的零值为蓝色,底部的值为绿色......(使用jet colormap作为示例)
我想构建一个色彩映射表,无论min\max值是多少,它都会自动将零值表示为相同的颜色.我怎样才能做到这一点?
可以使用caxis函数(设置CLim当前轴对象的属性)来控制颜色映射.当然,假设使用缩放的颜色映射,而不是直接颜色映射(读取CDataMapping属性).通过使用零中心范围作为输入,您可以确保零始终位于中间.
这是一个例子:
load penny
P = 4*(P./255) - 1; %# not centered around zero
imagesc(P), axis image off
colormap(lbmap(64,'BrownBlue')), colorbar
Run Code Online (Sandbox Code Playgroud)

现在我们调整颜色映射使其在零附近对称:
c = max(abs([min(P(:)),max(P(:))]));
caxis([-c c])
Run Code Online (Sandbox Code Playgroud)

请注意,我使用Light Bartlein配色方案,该方案设计为发散调色板,以突出两个极端之间的差异.
如果原始范围非常偏斜,您可能需要重新采样色彩图,以便在过度拉伸的子范围内为其提供更多值.