我经常想要绘制一个差异图像,范围从一些负数到一些正数。问题在于,matlab的色彩图仅从最小值到最大值进行缩放,但不关心某些中间值(这种情况为零)。例如,我生成了peaks
图像,其中一个像素不同:
原作如下:
所以零值在顶部图像为蓝色,底部为绿色......(以喷涂色彩图为例)
我想构建一个色彩映射表,无论min \ max值是多少,它都会自动将零值表示为相同的颜色。我怎么能这样做?
答案 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
现在我们调整颜色映射使其在零附近对称:
c = max(abs([min(P(:)),max(P(:))]));
caxis([-c c])
请注意,我使用的Light Bartlein color scheme设计为不同的调色板,以突出两个极端之间的差异。
如果原始范围非常偏斜,您可能需要重新采样色彩图,以便在过度拉伸的子范围内为其提供更多值。
答案 1 :(得分:4)
您可以使用FEX中的this tool。它生成蓝白红色图,零始终对应白色。对于您想要包含两种以上颜色的情况,请深入了解code并根据您的需要进行调整。
FEX中还有一些选项可以做类似的事情(这里是one和another one)...
答案 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)始终是颜色条的中间颜色。