我经常想绘制一张从某个负数到某个正数的差异图像。问题在于matlab的颜色图仅从最小值缩放到最大值,但不关心一些中间值(本例为零)。例如,我制作了peaks
一个像素不同的图像:
原来的样子是这样的:
所以零值在顶部图像为蓝色,在底部为绿色......(以 jet colormap 为例)
我想构建一个颜色图,无论最小\最大值是什么,它都会自动将零值表示为相同的颜色。我怎样才能做到这一点?
我经常想绘制一张从某个负数到某个正数的差异图像。问题在于matlab的颜色图仅从最小值缩放到最大值,但不关心一些中间值(本例为零)。例如,我制作了peaks
一个像素不同的图像:
原来的样子是这样的:
所以零值在顶部图像为蓝色,在底部为绿色......(以 jet colormap 为例)
我想构建一个颜色图,无论最小\最大值是什么,它都会自动将零值表示为相同的颜色。我怎样才能做到这一点?
可以使用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 配色方案,该配色方案被设计为一个发散的调色板,以突出两个极端之间的差异。
如果原始范围非常偏斜,您可能需要重新采样颜色图以在过度拉伸的子范围中为其提供更多值。
我喜欢其他答案,尤其是@Amro 的答案。但它看起来很复杂:) 你的caxis
参数不需要依赖于你的输入,你可以简单地从轴上抓取它们。所有这些都可以是单行的:
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]);
或者,使用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)始终是颜色条的中间颜色。