我经常想绘制一个范围从某个负数到某个正数的差异图像。问题在于Matlab的色图只能从最小值到最大值进行缩放,但并不关心某些中间值(本例中为零)。例如,我使用单个像素点生成了
peaks
图像:
其中原始图像如下所示:
因此,顶部图像的零值为蓝色,底部为绿色...(以jet色图为例)
我想建立一个自动将零值表示为相同颜色的色图,无论最小\最大值是什么。该怎么做?
peaks
图像:
其中原始图像如下所示:
因此,顶部图像的零值为蓝色,底部为绿色...(以jet色图为例)
我想建立一个自动将零值表示为相同颜色的色图,无论最小\最大值是什么。该怎么做?
使用caxis
函数(可设置当前坐标轴对象的CLim
属性)可以控制颜色映射。前提是使用了缩放的颜色映射,而不是直接颜色映射(请查看CDataMapping
属性)。通过使用以零为中心的范围作为输入,您可以确保始终将零放在中间。
这里是一个例子:
load penny
P = 4*(P./255) - 1; %# not centered around zero
imagesc(P), axis image off
colormap(lbmap(64,'BrownBlue')), colorbar
c = max(abs([min(P(:)),max(P(:))]));
caxis([-c c])
请注意,我使用的是Light Bartlein颜色方案,这是一种设计为突出两个极端之间差异的发散调色板。
如果原始范围非常倾斜,您可能希望重新采样颜色映射,在过度拉伸的子范围内给它更多值。
colormapeditor
)。 - Amroc = max(abs((P(:))));
就足够了。 - wsdzbm我喜欢其他答案,特别是@Amro的答案。但它看起来很复杂 :) 而且你的参数不需要依赖于你的输入,你可以直接从轴上获取它们。所有这些都可以成为一个一行代码:
a = gca; % or whatever you use to access your axis handle
a.CLim = max(abs(a.CLim)) * [-1 1];
就是这样。这适用于MATLAB R2014b及以上版本,该版本具有新的图形句柄系统(详见此处)。在早期版本中(以及您喜欢的新版本中),您将使用以下方法:
a = gca; % or whatever you use to access your axis handle
set(a, 'CLim', max(abs(get(a, 'CLim'))) * [-1 1]);
a = gca; % or whatever you use to access your axis handle
caxis(a, max(abs(caxis(a))) * [-1 1]);
a = gca; % or whatever you use to access your axis handle
addlistener(a, 'CLimMode', 'PostSet', @(h, e) caxis(e.AffectedObject, max(abs(caxis(e.AffectedObject))) * [-1 1]));
这使您可以这样做。
for ii = -5 : 5
imagesc([-1 0 10^ii]);
pause(0.2);
end
中间的条纹(代表0)始终是彩条的中间颜色。
addlistener
。我不知道它的存在,但它似乎非常有用。 - Scz
[-1,1]
)来实现。 - Marc Claesencaxis
函数来控制颜色映射,通过使用以零为中心的范围,这样0
就始终在中间(假设你正在使用缩放的颜色映射而不是直接映射)。 - Amro