3

我想要一个像下面这样的表面图,但有一个适当的颜色条。

没有颜色条的绘图

这是我的代码:

[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])。相反,当我取消注释最后三行时,会出现一个颜色呈线性对齐的颜色条,并且我的绘图中的颜色根据颜色条而不是我的自定义范围对齐。

用彩条绘制

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

4

3 回答 3

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));

在此处输入图像描述

或者另一种方法是简单地使用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]);

在此处输入图像描述

所以毕竟,我认为我的第一种方法(使用 yticklabels)是做你想做的事情的唯一方法。

于 2012-11-17T14:10:14.413 回答
1

我知道这是一个疯狂的旧帖子,但它是在我寻找答案时出现的。这就是我的答案(不幸的是,它必须假设彩条上的刻度大小相同)。

因此,鉴于您已经制作了只有 3 种颜色的颜色图,下一部分是代数。caxis遵循一个简单的公式,该公式由颜色栏中的颜色数量以及您的最小和最大范围决定。

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

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

很抱歉回复这么旧的帖子,但也许这对其他人有帮助。

于 2014-11-03T18:56:55.453 回答
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]);

阴谋

于 2016-01-29T06:36:30.910 回答