Matlab中叠加surf后contour阈值线条仅显示一条的问题排查
问题:叠加surf后仅显示一条等高线的原因分析
用户尝试在surf图上叠加两条等高线,代码如下:
x = 0:5:180; y = 0:5:355; [X,Y] = meshgrid(x,y); Z = 5*cos(X); figure(1); surf(X',Y',Z','EdgeColor','none'); view(2); colorbar;colormap(jet); hold on contour(X',Y',Z',[-1,-1],'k','LineWidth',1); contour(X',Y',Z',[2,2],'k','LineWidth',2); legend('','1','2','Location','northeastoutside');
发现单独绘制两条contour时正常显示,但叠加surf后仅能看到[-1,-1]的等高线;改用pcolor替代surf则两条等高线都能正常显示,询问原因。
核心原因分析
1. surf的3D深度遮挡特性
surf是3D曲面绘图函数,每个面元拥有独立的z轴高度,且默认不透明。当通过view(2)切换到俯视视角时,MATLAB会依据z值的深度关系进行渲染:z值更大的面元会覆盖在z值较小的物体(包括等高线)上方。
- 示例中
Z=5*cos(X)的取值范围是[-5,5],[2,2]的等高线位于z=2的高度,而surf中存在大量z>2的区域(比如z=5的区域),这些区域的面元在俯视视角下会完全遮挡z=2的等高线,导致其无法显示。 - 而
[-1,-1]的等高线位于z=-1的高度,虽然surf中z>-1的面元理论上会遮挡它,但由于Z矩阵中存在z<-1的区域(比如z=-5),这些区域的面元z值低于等高线,不会形成遮挡,再加上等高线是线条状,能在面元边缘处露出,因此可以被看到。
2. pcolor的2D平面特性
pcolor是纯粹的2D绘图函数,所有元素都默认位于z=0的平面上,后续绘制的contour等高线也会被渲染在同一平面,不存在3D深度遮挡的问题,因此两条等高线都能正常显示。
解决方法
- 方法1:设置surf为半透明:让等高线透过曲面显示
surf(X',Y',Z','EdgeColor','none','FaceAlpha',0.5); % 添加FaceAlpha参数设置透明度 - 方法2:将等高线绘制在曲面上方:通过
ZData将等高线置于高于曲面最大值的z层级z_max = max(Z(:)); contour(X',Y',Z',[-1,-1],'k','LineWidth',1,'ZData',z_max+1); contour(X',Y',Z',[2,2],'k','LineWidth',2,'ZData',z_max+1); - 方法3:改用2D绘图组合:直接使用
pcolor+contour的组合,避免3D遮挡问题
内容的提问来源于stack exchange,提问作者Shika93
相关产品推荐
相关产品推荐

