Matlab填充轮廓颜色不更新

时间:2015-01-07 22:58:06

标签: matlab colorbar contourf

我正在尝试使用contourf和caxis调整轮廓的颜色限制,但轮廓中的颜色数量不会更新。请参阅下面的示例。

Z是一个值范围从-170到80的数组。我想在-10和10之间绘制20个等值线。为此,我使用以下代码:

h = figure('windowstyle', 'docked');
contourf(mesh_x, mesh_y, Z, 20)
colormap(jet(20))
colorbar
caxis([-10 10])

下面是结果图。轮廓线的数量已正确更新(其中有20个),但轮廓颜色不会跟随。

enter image description here

我应该在代码中更改什么才能获得预期的结果?

2 个答案:

答案 0 :(得分:1)

如评论中所述,命令caxis仅更新图形的颜色图,但不会修改先前使用contourf创建的等值线。

由于我没有您的数据,我在函数peaks上构建了我的示例,我将其扩展到范围[-170 80]

%% // generate sample data set
x = linspace(0,1) ; [mesh_x , mesh_y] = meshgrid(x,x) ;
Z = peaks(100) ; Z(Z<0) = Z(Z<0) * -170./min(min(Z)) ; Z(Z>0) = Z(Z>0) * 80./max(max(Z)) ;

这与您当前的代码一起产生了下图,它确实表现出与您的示例相同的问题:

peaks170figure


如果您希望20个等值线在[-10 10]范围内,则有2个选项,输出略有不同。

选项1:修改对contourf的呼叫

函数contourf有一个参数,允许你指定 where 来放置等值线,所以最简单的方法就是用一个参数来调用contourf 20个等值线在[-10 10]

范围内
%% // method 1 : specify isolevels explicitely
h = figure ;
isolevels = linspace(-10,10,20) ; 
contourf(mesh_x, mesh_y, Z, isolevels )
colormap(jet(20)) ; colorbar ; caxis([-10 10])

产生:

peaksmethod1

现在您的等值线均匀分布在您指定的范围内。我不太清楚为什么值&lt; -10显示为白色,而值> 10则显示为右饱和色。

编辑:查看评论。要填充最低轮廓,必须添加低于或等于曲面中最低点的人造等值线。因此,如果您将contourf的来电替换为:

contourf(mesh_x, mesh_y, Z, [min(min(Z)) isolevels] ) %// use this if you want the lowest contour to be filled

这将产生与下面的解决方案相同的输出


选项2:自己使基础数据集饱和

它可能不是最优雅的选择,但至少它摆脱了上述解决方案中的“白色补丁”问题。我们的想法是创建另一个Z2,它将是范围[-10 10]的Z的副本,但是此范围之外的每个值都将被捕捉到范围限制。

%% // method 2 : saturate the data yourself
h = figure ;
Z2 = Z ; 
Z2(Z<=-10) = -10 ;  %// snap every value<-10 to the value: -10
Z2(Z>= 10) =  10 ;  %// snap every value>10 to the value: 10

contourf(mesh_x, mesh_y, Z2, 20)
colormap(jet(20)) ; colorbar ; caxis([-10 10])

这次您修改基础数据集以满足您的需要,因此您可以像最初调用它一样调用contourf。这将产生以下输出:

peaksmanual

答案 1 :(得分:0)

魔术字段是LevelList函数中的contourf字段。 n是您想要的颜色数

x=0:0.01:1;
y=0:0.01:1;
[xx,yy]=meshgrid(x,y);
zz=xx.^2+yy.^2;

n=5;
tclist=linspace(min(zz(:)),max(zz(:)),n+1);
tclist=tclist(1:n);

[C,h]=contourf(xx,yy,zz,'LevelList',tclist);
colormap(jet(n))
colorbar
caxis([min(zz(:)) max(zz(:))]);