Matlab将图形保存到一个非常大的eps文件中似乎没有理由

时间:2015-02-18 16:59:37

标签: matlab graphics eps

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

这个问题可能很难回答。这似乎是一个意想不到的Matlab行为但不幸的是我无法共享原始代码(加上代码很长,取决于很多变量和函数......)。我试图使用内置函数构建一个最小的工作示例,但当然它没有重现问题。不过,我可以给出代码的结构和创建的对象的类型(见帖子的结尾):曲线,曲面,透明度,没有疯狂的东西。

此代码在许多不同情况下运行时没有任何问题,并为我提供了几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,windows 7上运行。

谢谢大家!

1 个答案:

答案 0 :(得分:2)

谢谢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的任何缺点?

如果有人对这个主题有更详细的答案,我会很高兴看到它。