围绕零值自动构建色彩图

时间:2013-05-27 22:19:23

标签: matlab plot color-mapping

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

enter image description here

原作如下:

enter image description here

所以零值在顶部图像为蓝色,底部为绿色......(以喷涂色彩图为例)

我想构建一个色彩映射表,无论min \ max值是多少,它都会自动将零值表示为相同的颜色。我怎么能这样做?

3 个答案:

答案 0 :(得分:9)

可以使用caxis函数(设置当前轴对象的CLim属性)来控制颜色映射。当然,假设使用缩放颜色映射,而不是直接颜色映射(读取CDataMapping属性)。通过使用零中心范围作为输入,您可以确保零始终位于中间。

以下是一个例子:

load penny
P = 4*(P./255) - 1;        %# not centered around zero
imagesc(P), axis image off
colormap(lbmap(64,'BrownBlue')), colorbar

skewed_range

现在我们调整颜色映射使其在零附近对称:

c = max(abs([min(P(:)),max(P(:))]));
caxis([-c c])

symmetric_range

请注意,我使用的Light Bartlein color scheme设计为不同的调色板,以突出两个极端之间的差异。

如果原始范围非常偏斜,您可能需要重新采样色彩图,以便在过度拉伸的子范围内为其提供更多值。

答案 1 :(得分:4)

您可以使用FEX中的this tool。它生成蓝白红色图,零始终对应白色。对于您想要包含两种以上颜色的情况,请深入了解code并根据您的需要进行调整。

FEX中还有一些选项可以做类似的事情(这里是oneanother one)... enter image description here

答案 2 :(得分:3)

我喜欢其他答案,尤其是@Amro的答案。但它看起来很复杂:)而且你的caxis参数不需要依赖你的输入,你可以简单地从轴上抓取它们。所有这些都可以是一个单行:

a = gca; % or whatever you use to access your axis handle
a.CLim = max(abs(a.CLim)) * [-1 1];

那就是它。这在MATLAB R2014b之后有效,它具有新的图形处理系统(详见here)。在早期版本(以及新版本,如果您愿意),您将使用

a = gca; % or whatever you use to access your axis handle
set(a, 'CLim', max(abs(get(a, 'CLim'))) * [-1 1]);

或使用caxis

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)始终是颜色条的中间颜色。