如何在MATLAB中将表面图栅格化,同时保持轴为矢量图形?

4

我正在使用MATLAB制作3D曲面图,我希望将曲面图栅格化(以节约图片大小和加载速度),同时保留图中的其它部分(例如坐标轴、标签、标题等)为矢量图。我该如何做?目前我有以下代码:

x = linspace(-2, 2, 201);
y = linspace(-2, 2, 201);
[X, Y] = meshgrid(x, y);
Z = sin(sqrt(X.^2 + Y.^2));

fig = figure;

colormap parula
surf(X, Y, Z, 'FaceColor', 'interp', 'EdgeColor', 'none', 'FaceLighting', 'gouraud')
daspect([4 4 1])
axis tight
view(-50, 30)
camlight left

exportgraphics(fig, 'test_matlab_02.pdf', 'ContentType', 'vector')

如果我将ContentType设置为vector,那么整个图形都是矢量图形。如果我将ContentType设置为image,则整个图形会变成光栅化。我如何在剩余的图形特性中获得一个光栅化表面绘图与矢量图形?

从根本上讲,图像将以向量或位图文件格式存储在磁盘上,您需要一种同时支持两种格式的图像格式(你知道有哪一种吗?我不知道!),然后可能需要一个非常定制的写入方式。 - Wolfie
1
因为在matplotlib中,只需设置ax.plot_surf(...,rasterized=True)fig.savefig('test.pdf', dpi=500),然后使用dpi控制光栅化表面图的分辨率,就可以实现我想要的效果。我发现MATLAB在照明和着色方面提供了更好的表面绘图质量,所以我想看看是否可以在MATLAB中不进行太多修改的情况下实现相同的效果(光栅化表面图+矢量图形中的其余内容)。 - Physicist
2
@Wolfie PDF、EPS 和 SVG 都支持矢量图形和位图。在一个图形中同时使用两者是完全可行的。 - Cris Luengo
1
@CrisLuengo所说的是,对于PDF文件,没有必要放弃矢量图。如果您坚持这样做,有人在SO上很久以前就写了一个函数来实现这一点。 - alle_meije
这是我完全放弃Matlab的主要原因之一...为了获得一致、高质量的图形所需跳过的障碍实在是荒谬,尤其是对于你真正需要的细节。 - rubenvb
1个回答

4
文件交换提供了vecrast,通过vecrast可以实现混合栅格和矢量格式。根据vecrast函数的描述,该函数可以自动保存包含混合矢量和栅格内容的图形。具体而言,对感兴趣的图形创建两个副本,即rasterFigure和vectorFigure。将缀片、表面、轮廓、图像和灯光保存在rasterFigure中,但从vectorFigure中移除。然后,将rasterFigure以所需分辨率保存为临时.png图像。随后将.png文件插入到vectorFigure中,并将结果保存在单个矢量文件中。该函数能够处理2D和3D图形,如说明中所指定的那样。此外,函数还有其他注意事项,例如:关闭栅格图形的图形平滑处理(抗锯齿)功能以提高图像边缘的锐度并大大减小文件大小;建议使用不少于300 dpi的分辨率来避免插值在栅格图像边缘处造成图像出血现象等等。如果需要设置精确的图形大小,则建议了解tightPlots函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接