如何在Matlab

时间:2016-12-05 23:05:46

标签: matlab matlab-figure colorbar colormap

我有一个涵盖两个不同尺度的数据集,我需要显示更精细的细节以及“大图”的一些特征。我能想到遇到这类问题的最好例子是海洋地形数据,其中突出了海岸的细节以及深海的一般趋势,所有这些都有一个色图。虽然这些应用程序可以使用色彩映射,但似乎没有太多关于如何生成它们的信息。

此外,随着非线性色彩图的应用,色条似乎保持线性。例如,如果我的数据覆盖了[0 1]的范围,但95%的方差位于[0 0.0075]之间,则颜色条仍然在线性刻度上从[0 1]开始,并且很难将颜色与颜色条关联起来。含义0.0075%的colorbar是可变的,而剩下的基本上是一种颜色,这似乎毫无意义。

坚持我的例子,我的数据范围为[0 1],但95%的方差介于[0 0.0075]之间。我需要色彩图覆盖整个范围,但要突出显示[0 0.0075]之间的差异。与此同时,我希望95%的颜色条能够覆盖相当于95%方差的颜色变化。

有人可以告诉我如何有效地生成涵盖多个尺度的色彩图吗?

编辑:这是一个简单的例子

tmp = peaks;
index = find(abs(tmp)<0.2);
new = 0.2.*rand(1,length(index));
tmp(index) = new;
imagesc(tmp)
colorbar

颜色条可以根据需要覆盖整个数据范围,但您无法在精细尺度上看到任何差异。

coarse scale

如果您只是限制颜色轴

caxis([-0.2 0.2])

您可以在精细尺度上看到差异

enter image description here

我想用一个图像和一个色彩图/彩色条来捕捉这两个尺度。使用第一张图像中的颜色条作为参考,范围将从约[-6 8]开始,但是颜色图将来自[darkblue skyblue]的值[-6 -0.2],[skyblue lightred]的值[ - 0.2 [0.2]]和[光线暗化]值[0.2 8]。颜色变化将针对较小的尺度,而红色/蓝色渐变将针对粗尺度。我相信两种尺度都可以在视觉上很好地解决。

然后可以将彩条作为分段线性比例给出,使得[skyblue lightred]占据彩条的80%?我不确定什么是最好的,但我知道它是否是整个范围内的线性比例,颜色条约为49%[深蓝色天蓝色],2%[天蓝色光亮],49%[光线暗淡] ,这无助于将颜色与精细尺度的值相关联。

也许这不是最好的方法......因此我为什么会这样......这种方法只是为了在试图显示多尺度数据时展示我的问题。

EDIT2:我在这里给出的例子只是分段线性......我相信这个概念也应该转化为非线性色图,我应该能够在任何一组尺度上定义任何颜色范围,线性,非线性,分段,无论我想要什么。

1 个答案:

答案 0 :(得分:0)

一个想法是将喷射色图分成两半并使用日志索引来拉伸它的中间部分,这样你就可以在接近零的值上获得更好的对比度。

nColor=1000; % number of colors in the colormap

nJet = 1000; % needs to be even, high number for better interpolation
mapJet = jet(nJet);
kHalf = round(nJet/2);
map1 = mapJet(1:kHalf,:);
map2 = mapJet((nJet-kHalf+1):end,:);

% tweak 0.4 and 50 so that you are happy with the result
idx = log(linspace(0.4,50,kHalf))/log(2);
idx = (idx-min(idx(:)))/(max(idx)-min(idx))*(kHalf-1)+1;

map3 = arrayfun(@(x) interp1(size(map1,1):-1:1,map1(:,x),idx(length(idx):-1:1))', 1:3,'UniformOutput', false);
map3 = cell2mat(map3);

map4 = arrayfun(@(x) interp1(1:size(map2,1),map2(:,x),idx)', 1:3,'UniformOutput', false);
map4 = cell2mat(map4);

map = [map3;map4];

tmp = peaks;
index = find(abs(tmp)<0.2);
new = 0.2.*rand(1,length(index));
tmp(index) = new;
m = max(abs(tmp(:)));

imagesc(tmp)
caxis([-m m])
colormap(map)

产生以下结果。您当然可以调整参数或传递函数(此处为日志),以便结果更符合您的需求:

enter image description here