0

我正在尝试使用 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 条),但轮廓颜色不跟随。

在此处输入图像描述

我应该在代码中进行哪些更改才能获得预期的结果?

4

2 回答 2

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

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

peaks170图


如果您希望 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])

产生:

峰值方法1

现在您的等值线均匀分布在您指定的范围内。我不太清楚为什么值 < -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像最初调用它的方式一样调用它。这将产生以下输出:

峰值手动

于 2015-01-08T11:01:46.810 回答
0

魔法场是功能LevelListcontourfn是你想要的颜色数量

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(:))]);
于 2015-01-08T05:25:02.270 回答