MATLAB 的新图形引擎 HG2 无法使用 painters 渲染器正确打印补丁:
hist(randn(1,1000));
colorbar('Location','SouthOutside');
print('test.pdf','-dpdf');
生成的补丁,无论是由 hist
还是 colorbar
生成的,都有三角形分割:
该问题已在 MATLAB Central here 上讨论过和 here ,建议禁用 pdf-viewer 中的“平滑线条艺术”选项应该解决它。这在某些阅读器中隐藏了问题(例如,在 Adobe Reader 中,但在 Apple Preview 中没有),但是要求协作者和读者使用具有非默认设置的特定 pdf 查看器来正确显示图形几乎不是解决方案。在 Inkscape 中查看生成的文件,很明显分割存在于输出矢量图形中。在这里,我移动了一半的颜色条,证明它实际上被分成两半,而不仅仅是被 pdf-viewer 误解:
使用 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');
解释:
g = get(f1,'children');
获取当前图形中的所有轴、颜色条等。
colorbar
对象链接到一个轴,这就是为什么我们只需要移动 axes
类型的 child 。
将 color
设置为 none
使新轴的背景透明(因为它们位于旧轴之上)。
g(i).Position+[0.0001 0 0 0]
将新轴向右移动 0.0001 个标准化单位。
set(g(i+n),'position',g(i+n).Position);
这一行似乎是不必要的,但下面的最后一张图片显示了如果你打印时会发生什么不要包含它。
根据您绘制的图形对象的类型,您可能需要调整它以满足您自己的需要,但如果您只有颜色条和轴对象,则此代码应该有效。
原文:
黑客攻击:
没有 %//important!
行:
关于matlab - 在 MATLAB 2014b 及更高版本中使用画家渲染器的三角形分割补丁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30870613/