Matlab似乎没有任何原因将图形保存为非常大的eps文件

3
我大多数写作都使用LaTeX,并且总是使用Matlab创建的eps文件。一直没有问题,但是对于一个新的案例,我开始学习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
如果您无法分享原始代码,也许您可以存储要绘制的变量,并将它们上传到例如Dropbox的.mat文件中。这样,我们就可以检查实际图像是否在我们的系统上产生了如此大的文件。另一种选择是使用matlab2tikz包(但我从未对其进行过太多测试,因此请谨慎使用此建议),该包将您的matlab图形转换为tikz文件(您可以使用Tikz包在Latex中绘制)。 Tikz的优点是您可以单独调整沿轴缩放的文本,这是我主要用它的原因。 - Wouter Kuijsters
4
EPS可以非常高效(且高质量)地发布矢量图形。线条、阴影区域、文字等等都可以。然而,当图形无法用这些高效的EPS基元表示时,EPS就会包裹位图。观察图形的“渲染器”属性,并尝试删除图形的某些特征以找到罪魁祸首。我怀疑是透明表面造成的。 - Peter
@Peter:将位图包装起来是一个质量问题,但与大量矢量基元相比,它的性能问题较小。 - Ben Voigt
@WouterKuijsters 我不知道这个包,非常感谢。我仍然希望有一些修复方法,比如“关闭某些参数”,但如果无法生成eps文件,我会研究它。沿着轴重新调整文本听起来很棒!恐怕我不能分享实际变量,因为这是我的雇主不希望我在网上发布的数据。我知道这让任何人都很困难,但我不能分享它... - Godzy
@Peter 谢谢你,老兄!!! 你的直觉是对的,渲染程序在某种未知的方式下出现了问题,详见我下面发布的答案。 - Godzy
2个回答

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切换到painters。检查eps文件,明显透明度非常错误(大多数地方都偏离了)并且多边形偏移(或允许在其补丁前绘制线条的属性)也非常差。无论是否涉及位图,我都无法检索此类信息。但是,显然保存的图形与显示的图形不同。还应该注意,将渲染器切换为手动不会以任何其他方式影响屏幕上的图片。我想知道默认设置渲染器为手动是否是一个好主意...强制始终使用OpenGl是否有任何缺点?如果有人对此问题有更详细的答案,我很乐意阅读。

0

前往文件 -> 导出设置 -> 渲染 -> 自定义渲染,并将画家(矢量格式)更改为OpenGL(位图格式),然后单击“应用于图形”。 现在以任何格式保存图像。 即使eps文件也不大于几MB。 这对我有效!


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