kto*_*bol 6 pdf matlab matlab-hg2
MATLAB的新图形引擎HG2无法使用画家渲染器正确打印补丁:
hist(randn(1,1000));
colorbar('Location','SouthOutside');
print('test.pdf','-dpdf');
Run Code Online (Sandbox Code Playgroud)
将所得的贴剂,无论是通过产生hist或colorbar,具有三角形分割:

这里和这里已经讨论了MATLAB Central的问题,其中建议禁用pdf-viewer中的"smooth line art"选项应该解决它.这隐藏了一些读者的问题(例如在Adobe Reader中但在Apple Preview中没有),但要求协作者和读者使用特定的pdf查看器以及图形的非默认设置才能正确显示,这几乎不是一个解决方案.查看Inkscape中的结果文件,很明显分割存在于输出矢量图形中.在这里,我移动了一半的colorbar,证明它实际上是分成两半,而不仅仅是被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
Run Code Online (Sandbox Code Playgroud)
复制的对象现在是数组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');
Run Code Online (Sandbox Code Playgroud)
解释:
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);该行似乎没有必要,但下面的最后一张图片显示了如果不包含它,打印时会发生什么。
根据您绘制的图形对象的类型,您可能需要对其进行调整以满足您自己的需求,但如果您只有colorbar 和 axis 对象,则此代码应该可以工作。
原来的:
与黑客:
不带%// important!线:
| 归档时间: |
|
| 查看次数: |
1277 次 |
| 最近记录: |