MATLAB 2014b及以上

时间:2015-06-16 14:31:47

标签: matlab pdf matlab-hg2

MATLAB新图形引擎HG2无法使用画家渲染器正确打印补丁:

hist(randn(1,1000)); 
colorbar('Location','SouthOutside');
print('test.pdf','-dpdf');

histcolorbar生成的结果修补程序具有三角形分割:

Triangular splits in patches

已在MATLAB Central herehere上讨论了该问题,其中建议禁用pdf-viewer中的“smooth line art”选项应该解决它。这隐藏了一些读者的问题(例如在Adobe Reader中但在Apple Preview中没有),但要求协作者和读者使用具有非默认设置的特定pdf查看器才能正确显示图形。查看Inkscape中的结果文件,很明显分割存在于输出矢量图形中。在这里,我移动了一半的colorbar,证明它实际上是分成两半,而不仅仅是被pdf-viewer误解了:

enter image description here

使用OpenGL渲染器(print('test.pdf','-opengl')时不存在问题,但输出未向量化)。这个问题在MATLAB 2015a中仍然存在。

有没有办法在MATLAB 2014b或更高版本中导出无伪影矢量图形?

3 个答案:

答案 0 :(得分:1)

这是一个值得怀疑的解决方法,直到实际问题得到解决:

对角线只是三角形之间的空白区域,所以我们看到的是补丁后面的白色空间。 愚蠢的想法: 让我们用匹配的颜色填充该空格而不是白色。

为了做到这一点,我们将复制所有对象,并通过一个小的位来抵消新对象。

<强>代码:

hist(randn(1,1000));
colorbar('Location','SouthOutside');
print('test.pdf','-dpdf');               %// print original for comparison

f1 = gcf;
g  = get(f1,'children');
n  = length(g);
copyobj(g,f1);                           %// copy all figure children

复制的对象现在是n 2*n数组中的第一个f1.Children元素。它们恰好位于旧对象的顶部

g=get(f1,'children');
for i=1:n;
    if strcmpi(g(i).Type,'axes');
        set(g(i),'color','none','position',g(i).Position+[0.0001 0 0 0]);
        set(g(i+n),'position',g(i+n).Position);                            %// important!
    end;
end;
print('test2.pdf','-dpdf');

<强>解释

g = get(f1,'children');获取当前图形中的所有轴,颜色条等。

colorbar个对象链接到一个轴,这就是为什么我们只需要移动axes类型的孩子。

color设置为none会使新轴的背景透明(因为它们位于旧轴的顶部)。

g(i).Position+[0.0001 0 0 0]将新轴向右移动0.0001标准化单位。

set(g(i+n),'position',g(i+n).Position);此行似乎没必要,但下面的最后一张图片显示了打印时发生的情况,如果您不包含它。

根据您绘制的图形对象的类型,您可能需要调整它以满足您自己的需要,但如果您只有颜色条和轴对象,则此代码应该有效。

<强>原始

original

使用hack:

enter image description here

没有%// important!行:

enter image description here

答案 1 :(得分:0)

在R2015b中,histogram似乎没有显示白线,但fill表示。

对于简单的图,只需再次粘贴数据:

x = 0:pi/100:pi;
y = sin(x);
f = fill(x,y,'r');
hold on;
f2 = fill(x,y,'r'); %// Worked like magic

如果魔法失败,请尝试类似于Geoff的回答:f2 = fill(x+0.0001,y,'r');

答案 2 :(得分:0)

根据您使用的Matlab版本,您可能会尝试使用epsclean。它似乎不适用于最新版本的Matlab,如2017a。

否则,epsclean可以在使用-painters选项导出的现有eps文件(不是pdf)上运行,以生成矢量化图形,并且它将重写(或创建另一个文件)并删除这些白线。