6

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

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

生成的补丁,无论是由hist或生成的colorbar,都有三角形分割:

补丁中的三角形分裂

该问题已在此处此处的 MATLAB Central 上进行了讨论,其中建议禁用 pdf-viewer 中的“平滑线条艺术”选项应该可以解决该问题。这在某些阅读器中隐藏了问题(例如,在 Adob​​e Reader 中,但在 Apple Preview 中没有),但要求协作者和读者使用具有非默认设置的特定 pdf 查看器以正确显示图形,这几乎不是解决方案。在 Inkscape 中查看生成的文件,很明显分割存在于输出矢量图形中。在这里,我移动了一半的颜色条,证明它实际上被分成两半,而不仅仅是被 pdf-viewer 误解:

在此处输入图像描述

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

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

4

3 回答 3

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子类型。

设置colornone使新轴的背景透明(因为它们位于旧轴之上)。

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

set(g(i+n),'position',g(i+n).Position);这条线似乎没有必要,但下面的最后一张图片显示了如果不包含它,打印时会发生什么。

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

原来的:

原来的

与黑客:

在此处输入图像描述

无线%// important!

在此处输入图像描述

于 2015-09-22T17:37:38.580 回答
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');

于 2015-11-05T17:27:49.857 回答
0

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

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

于 2017-11-02T00:00:46.440 回答