Matlab - surf 和 contour3,剪裁顺序?

Matlab - surf and contour3, clipping order?

我在 matlab 中将数据绘制为曲面。我有三个数据矩阵,x,y,z.z的值不能在0~1范围之外。

我用以下内容生成图:

surf(x,y,z);
[c,h] = contour3(x,y,z,'LevelList',[0 : 0.1 : 1],'Color','k');
clabel(c,h,[0 : 0.1 : 1]);

我也对surface做了一些修改,比如设置shading interp.

如您所见,结果图像剪裁了具有底层表面的轮廓。如何确保轮廓和标签绘制在曲面上方?

您可以尝试处理 contour 补丁的属性:增加补丁边缘的 linewidth:默认值为 0.5:linewidth 为 1 或 1.5应该够了。

用同样的方法你可以设置clabel生成的lavels的属性:你可以设置font sizefont weight使它们更明显。您也可以通过指定 labelspacing 属性.

来设置要添加的标签数

一个有趣的选项也可以是手动设置标签:这可以通过在 clabel 调用中指定 manaul 属性 来完成。

下面是一个基于 peaks 表面的示例:

[x,y,z]=peaks
surf(x,y,z);
shading interp
hold on
[c,h] = contour3(x,y,z,[-10:1:10]);
set(h(:),'linewidth',1,'edgecolor','k')
clabel(c,h,[-10:1:10],'fontsize',9,'fontweight','bold','rotation',0,'labelspacing',99);
% clabel(c,h,'manual','fontsize',9,'fontweight','bold','rotation',0);

希望对您有所帮助。

在深入研究文档后,我找到了最佳解决方案。

裁剪顺序在axes级别指定。

轮廓始终位于曲面顶部的完整 MWE 如下:

fig = figure;
ax = get(gca);
ax.SortMethod = 'childorder'; % this is the important line
surf(x,y,z);
[c,h] = contour3(x,y,z,'LevelList',[0 : 0.1 : 1],'Color','k');
clabel(c,h,[0 : 0.1 : 1]);