matlab - 在 MATLAB 2014b 及更高版本中使用画家渲染器的三角形分割补丁

标签 matlab pdf matlab-hg2

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

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

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

Triangular splits in patches

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

enter image description here

使用 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); 这一行似乎是不必要的,但下面的最后一张图片显示了如果你打印时会发生什么不要包含它。

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

原文:

original

黑客攻击:

enter image description here

没有 %//important! 行:

enter image description here

关于matlab - 在 MATLAB 2014b 及更高版本中使用画家渲染器的三角形分割补丁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30870613/

相关文章:

javascript - 使用 <a> 将图像链接到 PDF 文件时出现问题

MATLAB 误差线线条样式

MATLAB:导出为矢量图形后可见的补丁边缘

string - Matlab中变量的结构名称

matlab - 当 RAM 已满时中止 MATLAB 代码

matlab - 在matlab中从波德图查找传递函数

ios - 如何在 Objective C 中从 uiwebview 保存 pdf

javascript - 从 BLOB 格式 -Angular 实现 PDF 预览或在网页中隐藏部分 PDF

c++ - Matlab C++ - 接收动态大小输出类型 (emxArray_real_T)