MATLAB中surf与plot命令输出EPS文件时裁剪差异问题咨询
为什么
surf导出EPS不裁剪空白,而2D绘图会? 原因分析
这本质是MATLAB针对2D和3D绘图的边界框计算逻辑差异:
- 对于
plot、imagesc、contour这类2D函数,MATLAB会自动检测绘图元素的实际可视范围,输出时把边界框严格限定在绘图区域内,所以导出EPS时会自动裁掉周围空白。 - 但
surf是3D绘图函数,MATLAB默认会把整个坐标轴的完整空间范围(包括3D视角下看起来空白的区域)都包含进输出边界。这是因为3D视角会影响元素的显示位置,MATLAB怕误删在某些视角下可能可见的元素,所以默认不自动裁剪这些“潜在”区域。
解决办法
这里有几个实用的方案,覆盖不同MATLAB版本:
1. 用exportgraphics一键解决(推荐,R2020a+)
MATLAB R2020a之后推出的exportgraphics专门优化了导出逻辑,默认就会自动裁剪空白,不管2D还是3D图形都适用,代码更简洁:
[xgrid,ygrid] = ndgrid(-1:0.01:1,-1:0.01:1); xplot= -1:0.01:1; func = @(x,y) x+y; subplot(2,2,1) surf(xplot,xplot,func(xgrid,ygrid)) % 导出矢量EPS并自动裁剪空白 exportgraphics(gca, 'surf_fig.eps', 'ContentType', 'vector')
2. 手动调整坐标轴位置(兼容旧版本)
通过TightInset获取图形的紧凑边界,然后调整坐标轴的Position属性,让它贴合实际图形:
[xgrid,ygrid] = ndgrid(-1:0.01:1,-1:0.01:1); xplot= -1:0.01:1; func = @(x,y) x+y; subplot(2,2,1) surf(xplot,xplot,func(xgrid,ygrid)) ax = gca; % 获取紧凑边界的偏移量 inset = ax.TightInset; % 重新设置坐标轴位置,去掉空白区域 ax.Position = [ax.Position(1)+inset(1), ax.Position(2)+inset(2), ... ax.Position(3)-inset(1)-inset(3), ax.Position(4)-inset(2)-inset(4)]; print -depsc 'surf_fig'
3. 开启坐标轴裁剪功能
强制让坐标轴只显示自身范围内的元素,再导出:
[xgrid,ygrid] = ndgrid(-1:0.01:1,-1:0.01:1); xplot= -1:0.01:1; func = @(x,y) x+y; subplot(2,2,1) surf(xplot,xplot,func(xgrid,ygrid)) ax = gca; ax.Clipping = 'on'; % 开启裁剪,只保留坐标轴内的图形元素 print -depsc 'surf_fig'
内容的提问来源于stack exchange,提问作者Amir Sagiv
相关产品推荐
相关产品推荐

