2016-12-05 319 views
0

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

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

坚持我的例子,我的数据范围从[0 1],但95%的方差位于[0 0.0075]之间。我需要colormap覆盖全部范围,但突出显示[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%[darkblue skyblue],2%[skyblue lightred]和49%[lightred darkred] ,这无助于将颜色与精细尺度的值相关联。

也许这不是最好的方法...因此,我为什么在这里......这种方法只是为了展示我的问题,试图展示多尺度数据的概念。编辑2:我在这里给出的例子是简单的分段线性...我相信这个概念也应该转化为非线性的颜色映射,我应该能够在任何尺度集上定义任何范围的颜色,线性的,非线性,分段,无论我的愿望。

+0

我认为这个问题会加入一些图像而受益良多。您是否碰巧手头有分享和展示您想要的内容以及您目前看到的线性彩色地图? –

+0

它是一种简单的方法;但你有没有尝试定义一个自定义颜色映射?使用[链接](https://www.mathworks.com/help/matlab/ref/colormap.html) 例如: map = [0, 0, 1; 0, 1, 0.4; 1, 0, 0.5; 0, 0, 0.5; 0, 0, 0.6; 0, 0, 0.7 ; 0, 0, 0.8; 0, 0, 0.9; 0, 0, 1]; caxis manual colormap(map) colorbar' 您可以在图像中定义自己的段数。 –

回答

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