如何在MATLAB中将自定义颜色范围与colorbar相结合?

时间:2012-11-17 13:48:09

标签: matlab plot range colorbar

我希望有一个像下面那样的表面图,但是有一个合适的颜色条。

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

现在,我想要的是颜色条中的颜色与我的自定义刻度匹配,并且情节在第一张图片中看起来像。

3 个答案:

答案 0 :(得分: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,然后绘图的颜色由minmax值线性定义。因此,您无法设置非线性范围 插图:

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 :(得分:1)

我知道这是一个疯狂的老帖子,但是当我寻找答案时,它就出现了。这将是我的答案(不幸的是,不得不假设颜色条上的刻度是相同的大小)。

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

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

因此索引将引用颜色映射中的索引(m = 3,因为这是你的颜色映射的长度),我要做的是使C = 1.5,决定你是否想要它是对称的(你正在解决cmax和cmin并且如果两者都是x)则更容易,并且使index = 2(因为你只有3种颜色,这应该意味着求解1.5将给你设置cmin / cmax,这将使得黄色和红色之间的截止值为1.5)你应该可以在某处设置显示范围值,这将适当地设置色彩图(尽管可能不是标签)。

很抱歉回复这么老的帖子,但也许这会有所帮助。

答案 2 :(得分: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