我正在尝试使用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个),但轮廓颜色不会跟随。
我应该在代码中更改什么才能获得预期的结果?
答案 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)) ;
这与您当前的代码一起产生了下图,它确实表现出与您的示例相同的问题:
如果您希望20个等值线在[-10 10]范围内,则有2个选项,输出略有不同。
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])
产生:
现在您的等值线均匀分布在您指定的范围内。我不太清楚为什么值&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
这将产生与下面的解决方案相同的输出
它可能不是最优雅的选择,但至少它摆脱了上述解决方案中的“白色补丁”问题。我们的想法是创建另一个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
。这将产生以下输出:
答案 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(:))]);