MATLAB 2014b及更高版本中带画家渲染器的三角形分割面片
MATLABs新图形引擎HG2无法使用painters渲染器正确打印修补程序:MATLAB 2014b及更高版本中带画家渲染器的三角形分割面片,matlab,pdf,matlab-hg2,Matlab,Pdf,Matlab Hg2,MATLABs新图形引擎HG2无法使用painters渲染器正确打印修补程序: hist(randn(1,1000)); colorbar('Location','SouthOutside'); print('test.pdf','-dpdf'); 无论是由hist还是colorbar生成,生成的面片都具有三角形分割: 这个问题已经在MATLAB Central上讨论过,有人建议在pdf查看器中禁用“平滑线艺术”选项可以解决这个问题。这在某些阅读器中隐藏了问题(例如,在Adobe Read
hist(randn(1,1000));
colorbar('Location','SouthOutside');
print('test.pdf','-dpdf');
无论是由hist
还是colorbar
生成,生成的面片都具有三角形分割:
这个问题已经在MATLAB Central上讨论过,有人建议在pdf查看器中禁用“平滑线艺术”选项可以解决这个问题。这在某些阅读器中隐藏了问题(例如,在Adobe Reader中,但在Apple Preview中不存在),但要求合作者和读者使用具有非默认设置的特定pdf查看器以正确显示图形,这很难解决问题。在Inkscape中查看生成的文件,很明显,分割显示在输出向量图形中。在这里,我移动了颜色条的一半,证明它实际上被一分为二,而不仅仅是被pdf查看器误解了:
使用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');
说明:
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
g=get(f1,'children')代码>获取当前图形中的所有轴、色条等
colorbar
对象链接到轴,这就是为什么我们只需移动轴
类型子对象
将颜色设置为none
将使新轴的背景透明(因为它们位于旧轴的顶部)
g(i).位置+[0.0001 0 0]
将新轴向右移动0.0001个标准化单位
set(g(i+n),'position',g(i+n).position代码>这一行似乎没有必要,但下面的最后一幅图显示了如果不包括它,打印时会发生什么
根据绘制的图形对象的类型,您可能需要调整此代码以满足自己的需要,但如果只有colorbar和axes对象,则此代码应该可以工作
原件:
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
使用hack:
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
没有%//重要代码>行:
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
在R2015b中,直方图
似乎没有显示白线,但填充
显示了白线
对于简单绘图,只需再次粘贴数据:
x = 0:pi/100:pi;
y = sin(x);
f = fill(x,y,'r');
hold on;
f2 = fill(x,y,'r'); %// Worked like magic
如果魔术失败,尝试与杰夫的答案类似的方法:f2=fill(x+0.0001,y,'r')代码>根据您使用的Matlab版本,您可以尝试使用。它似乎不适用于最新版本的Matlab,如2017a
否则,可以在使用-painters选项导出的现有eps文件(非pdf)上运行epsclean,以生成矢量化图形,并在删除这些白线的情况下重写(或创建另一个文件) 到目前为止,我找到的唯一解决方案是后期处理,例如在Adobe Illustrator中。对于颜色栏,只需删除剪裁遮罩即可。对于直方图,您必须选择所有三角形(通过选择相同外观)并添加一个细轮廓笔划。MATLAB不将三角形导出为闭合路径是没有帮助的,因此可能需要手动关闭每条路径才能实现这一点。当然,这只适用于不太复杂的最终数据。。。