MATLAB 2014b及更高版本中带画家渲染器的三角形分割面片

MATLAB 2014b及更高版本中带画家渲染器的三角形分割面片,matlab,pdf,matlab-hg2,Matlab,Pdf,Matlab Hg2,MATLABs新图形引擎HG2无法使用painters渲染器正确打印修补程序: hist(randn(1,1000)); colorbar('Location','SouthOutside'); print('test.pdf','-dpdf'); 无论是由hist还是colorbar生成,生成的面片都具有三角形分割: 这个问题已经在MATLAB Central上讨论过,有人建议在pdf查看器中禁用“平滑线艺术”选项可以解决这个问题。这在某些阅读器中隐藏了问题(例如,在Adobe Read

MATLABs新图形引擎HG2无法使用painters渲染器正确打印修补程序:

hist(randn(1,1000)); 
colorbar('Location','SouthOutside');
print('test.pdf','-dpdf');
无论是由
hist
还是
colorbar
生成,生成的面片都具有三角形分割:

这个问题已经在MATLAB Central上讨论过,有人建议在pdf查看器中禁用“平滑线艺术”选项可以解决这个问题。这在某些阅读器中隐藏了问题(例如,在Adobe Reader中,但在Apple Preview中不存在),但要求合作者和读者使用具有非默认设置的特定pdf查看器以正确显示图形,这很难解决问题。在Inkscape中查看生成的文件,很明显,分割显示在输出向量图形中。在这里,我移动了颜色条的一半,证明它实际上被一分为二,而不仅仅是被pdf查看器误解了:

使用OpenGL渲染器(
print('test.pdf','-OpenGL')
,但输出没有矢量化)时,问题不存在。该问题在MATLAB 2015a中仍然存在


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

在实际问题解决之前,这里有一个值得商榷的解决方法:

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

为此,我们将复制所有对象,并将新对象偏移一点点

代码:

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
复制的对象现在是
2*n
f1.Children
数组中的第一个
n
元素。它们正好位于旧对象的顶部

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');
说明:

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
g=get(f1,'children')获取当前图形中的所有轴、色条等

colorbar
对象链接到轴,这就是为什么我们只需移动
类型子对象

颜色设置为
none
将使新轴的背景透明(因为它们位于旧轴的顶部)

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

set(g(i+n),'position',g(i+n).position这一行似乎没有必要,但下面的最后一幅图显示了如果不包括它,打印时会发生什么

根据绘制的图形对象的类型,您可能需要调整此代码以满足自己的需要,但如果只有colorbar和axes对象,则此代码应该可以工作

原件:

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

使用hack:

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

没有
%//重要行:

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

在R2015b中,
直方图
似乎没有显示白线,但
填充
显示了白线

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

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

如果魔术失败,尝试与杰夫的答案类似的方法:
f2=fill(x+0.0001,y,'r')

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


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

到目前为止,我找到的唯一解决方案是后期处理,例如在Adobe Illustrator中。对于颜色栏,只需删除剪裁遮罩即可。对于直方图,您必须选择所有三角形(通过选择相同外观)并添加一个细轮廓笔划。MATLAB不将三角形导出为闭合路径是没有帮助的,因此可能需要手动关闭每条路径才能实现这一点。当然,这只适用于不太复杂的最终数据。。。