2012-11-17 48 views
3

我想有一个如下面的曲线图,但有一个适当的颜色条。如何在MATLAB中将自定义颜色范围与颜色条结合起来?

plot without colorbar

这是我的代码:

[X,Y,Z] = peaks(30); 

[maxval dummy] = max(Z(:)); 
[minval dummy] = min(Z(:)); 

crange = 1.5; 

% red, yellow, green 
cmap = [1 0 0; 1 1 0; 0 1 0]; 
colormap(cmap); 

colors = zeros(size(Z));     
colors(Z <= -crange) = 1;    % red (1) 
colors(Z > -crange & Z < crange) = 2; % yellow (2) 
colors(Z >= crange) = 3;    % green (3) 

surf(X,Y,Z, colors); 
axis([-3 3 -3 3 -10 10]); 

%cbh = colorbar('YGrid','on');  
%caxis([minval-0.1 maxval+0.1]); 
%set(cbh,'YTick',[minval -crange crange maxval]); 

到目前为止,我没有运气在增加,其中的颜色(绿,黄,红)根据我的自定义范围内对齐的彩条(绿[8 ... 1.5],黄色[1.5 ... -1.5],红色[-1.5 ... -6.4])。相反,当我取消注释最后三行 时,会出现线性对齐颜色的颜色条,并且我的绘图中的颜色会根据颜色条对齐而不是我自定义的范围。

plot with colorbar

现在,我想有是,在彩条的颜色搭配我的自定义蜱和情节看起来像在第一张照片。

回答

4

问题在于你自己指定冲浪图中每个点的颜色,所以它们与默认情况下与z值无关。其颜色条仅由颜色编号构成,为1至3.这些因此也显示为颜色条的缺省滴答(在您更改颜色条之前)(

正如您发现的,您可以手动设置滴答,并以同样的方式,你可以“骗”和使用yticklabels

figure 
colormap(cmap); 
surf(X,Y,Z, colors); 
axis([-3 3 -3 3 -10 10]); 

cbh = colorbar('YGrid','on'); 
set(cbh,'ytick',linspace(1,3,4)); 
set(cbh,'yticklabel',arrayfun(@num2str,[minval -crange crange maxval],'uni',false)); 

enter image description here

或者另一种方式是简单地使用caxis,但随后的情节颜色线性由极小极大值定义。因此,你不能设置你的非线性范围
插图:

figure 
colormap(cmap); 
surf(X,Y,Z); 
axis([-3 3 -3 3 -10 10]); 
caxis([minval-0.1 maxval+0.1]); 
cbh=colorbar 
set(cbh,'YTick',[minval -crange crange maxval]); 

enter image description here

所以毕竟,我想我的第一种方法(使用yticklabels)是做你想要什么的唯一途径。

1

我知道这是一个疯狂的旧帖子,但它是在我寻找答案时才提出来的。这里是我的答案(不得不承认,彩条上的刻度尺寸是相同的)。

所以,假设你制作了只有3种颜色的彩色地图,下一部分就是代数。 caxis遵循一个简单的公式,该公式由颜色条中的颜色数以及最小和最大范围决定。

index = fix((C-cmin)/(cmax-cmin)*m)+1; 

那么指数将参考在彩色地图索引(M = 3,因为那是你的颜色表的长度),我会做的是使C = 1.5,决定是否需要它的对称(你正在求解cmax和cmin,如果两者都是x),并且使索引= 2(因为你只有3种颜色,这意味着求解1.5会给你cmin/cmax来设置哪一个会使得1.5的截断值在黄色和红色之间,你应该可以在某个地方设置显示范围值,这将会适当地设置色彩地图(尽管可能不是标签)

对不起,回复这样一个旧帖子,但也许这会帮助其他人。

0

当我找到解决方案时遇到了这个问题。无论如何,这个问题帮助我在对书写代码进行小小的修改之后为我的问题找到了一个解决方案。 同时,我希望对代码提出一些更改,以便用户可以使用必要的颜色和相应的颜色条获取所需的绘图。 下面是代码,

[X,Y,Z] = peaks(30); 
 

 
[maxval dummy] = max(Z(:)); 
 
[minval dummy] = min(Z(:)); 
 

 
crange=1.5; 
 

 
% red, yellow, green 
 
cmap = [1 0 0; 1 1 0; 0 1 0]; 
 
colormap(cmap); 
 

 
colors = zeros(size(Z));     
 
colors(Z <= -crange) = minval-0.1;    % red (1) 
 
colors(Z > -crange & Z < crange) = crange; % yellow (2) 
 
colors(Z >= crange) = maxval+0.1;    % green (3) 
 

 
surf(X,Y,Z, colors); 
 
axis([-3 3 -3 3 -10 10]); 
 

 
cbh = colorbar('YGrid','on');  
 
caxis([minval-0.1 maxval+0.1]); 
 
set(cbh,'YTick',[minval -crange crange maxval]);

Plot