Matlab 填充轮廓颜色不更新

Matlab filled contour colors not updating

我正在尝试使用 contourf 和 caxis 调整轮廓的颜色限制,但轮廓中的颜色数量没有更新。请看下面的例子。

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

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

下面是结果的图片。等高线数量正确更新(有20条),但等高线颜色不跟随。

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

魔法字段是 contourf 函数中的 LevelList 字段。 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(:))]);

如评论中所述,命令 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 个选项,输出略有不同。

选项 1:修改对 contourf

的调用

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

范围内指定 20 个等值线
%% // 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])

产生:

现在你的等值线均匀分布在你指定的范围内。我不太确定为什么值 < -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:自己饱和底层数据集

它可能不是最优雅的选择,但至少它摆脱了上面解决方案中的 "white patch" 问题。我们的想法是创建另一个 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。这将产生以下输出: