Matlab无缘无故将图形保存到一个非常大的eps文件

Matlab saves figure to a very large eps file for seemingly no reason

我的大部分作品都使用 LaTeX,并且总是使用 eps 文件——Matlab 可以创建。没有任何问题,但是,对于一个新案例,我开始研究 Matlab 生成了一个 95MB 的文件(而 eps2pdf 无法生成一个 pdf)

这个问题可能很难回答。这似乎是一种意外的 Matlab 行为,但不幸的是我无法共享原始代码(加上代码很长并且依赖于如此多的变量和函数......)。我尝试使用内置函数构建一个最小工作示例,但当然它不会重现问题。不过,我可以给出代码的结构和创建的对象类型(见 post 的末尾):曲线、曲面、透明度,没有疯狂的事情。

这段代码 运行 在许多不同的情况下都没有任何问题,并给了我几 MB 的文件。表面之一中存在的点数、近似形状、曲线中的点数等。没有变化或变化很小。我无法解释文件大小差异。

我欢迎对行为的解释或将此图片转换为 eps 的替代方法。或者两者兼而有之。现在我将它输出为 png,但我非常想要矢量文件。有没有人遇到过eps很大的问题?

colordef white;
figure('Color','White','Name','STUFF')
hold all

% Show a curve
lpot = plot3(//STUFF\, '-',...
    'Color', [0 0 1], 'LineWidth', 2);

% Show a curve
ph = plot3(//STUFF\,'-',...
        'Color', [1 0 0], 'LineWidth', 2);

% Show a curve
plot3(//STUFF\, '-',...
        'Color', [0 1 0], 'LineWidth', 2);

% Show a point
plot3(//STUFF\, ...
    'k', 'MarkerSize', 10, 'Marker', '^', ...
    'MarkerFaceColor', [1 1 0]);

% Show a surface
surf(//STUFF\);
colormap(jet); 
shading interp;

% Show a surface in transparency
surf_1 = trisurf(//STUFF\);
set(surf_1,'FaceColor', [1 1 1], 'EdgeAlpha', 0, 'FaceAlpha', 0.5);

% Axis adjustements
axis equal tight
xlabel('stuff');
ylabel('stuff');
zlabel('stuff');
view(2);
grid on;
h_cbar = colorbar;
ylabel(h_cbar, //STUFF\);
legend(//STUFF\,...
    {//STUFF\});
set(gcf,'units','normalized','outerposition',[0.10 0.10 0.80 0.80])

hold off

hgexport(gcf, ['mytoobigfigure.eps'],...
    hgexport('factorystyle'), 'Format', 'eps');

代码在matlab r2014b上运行,windows7.

谢谢大家!

是的,感谢 Peter 的评论,我解决了问题!修复:

myfig = gcf;                   % or define myfig when the figure is created
myfig.RendererMode = 'manual'  % use a set with older versions of Matlab

这并不意味着我理解为什么会发生这种情况,而且这很可能不是 Matlab 所期望的行为。我认为出于某种原因,渲染器会在保存图形时从 OpenGL 切换到画家。检查 eps,很明显透明度非常错误(在大多数地方关闭)并且多边形偏移(或允许在其补丁前面画线的 属性)也很差。无论是否涉及位图,检索此类信息都超出了我的技能范围。但显然保存的图形与显示的图形不一样。还应注意,将渲染器切换为手动不会以任何其他方式影响屏幕上的图片。我想知道默认情况下将渲染器设置为手动是否不是一个好主意...一直强制使用 OpenGl 会有任何缺点吗?

如果有人对此主题有更详细的答案,我很乐意阅读。