MATLAB新图形引擎HG2无法使用画家渲染器正确打印补丁:
hist(randn(1,1000));
colorbar('Location','SouthOutside');
print('test.pdf','-dpdf');
由hist
或colorbar
生成的结果修补程序具有三角形分割:
已在MATLAB Central here和here上讨论了该问题,其中建议禁用pdf-viewer中的“smooth line art”选项应该解决它。这隐藏了一些读者的问题(例如在Adobe Reader中但在Apple Preview中没有),但要求协作者和读者使用具有非默认设置的特定pdf查看器才能正确显示图形。查看Inkscape中的结果文件,很明显分割存在于输出矢量图形中。在这里,我移动了一半的colorbar,证明它实际上是分成两半,而不仅仅是被pdf-viewer误解了:
使用OpenGL渲染器(print('test.pdf','-opengl')
时不存在问题,但输出未向量化)。这个问题在MATLAB 2015a中仍然存在。
有没有办法在MATLAB 2014b或更高版本中导出无伪影矢量图形?
答案 0 :(得分: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
类型的孩子。
将color
设置为none
会使新轴的背景透明(因为它们位于旧轴的顶部)。
g(i).Position+[0.0001 0 0 0]
将新轴向右移动0.0001标准化单位。
set(g(i+n),'position',g(i+n).Position);
此行似乎没必要,但下面的最后一张图片显示了打印时发生的情况,如果您不包含它。
根据您绘制的图形对象的类型,您可能需要调整它以满足您自己的需要,但如果您只有颜色条和轴对象,则此代码应该有效。
<强>原始强>
使用hack:
没有%// important!
行:
答案 1 :(得分: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');
答案 2 :(得分:0)
根据您使用的Matlab版本,您可能会尝试使用epsclean。它似乎不适用于最新版本的Matlab,如2017a。
否则,epsclean可以在使用-painters选项导出的现有eps文件(不是pdf)上运行,以生成矢量化图形,并且它将重写(或创建另一个文件)并删除这些白线。