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
。这将产生以下输出:
我正在尝试使用 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]
%% // 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
。这将产生以下输出: