为什么Matlab在保存时要加上这条线来作图?

Why does Matlab add this line to plot when saving?

我一直在尝试在 Matlab 中绘制一些不等式。

在Matlab图中显示的时候,看起来是对的:

但是当我保存图形时,我得到了这条烦人的黄线(无论是手动保存还是在代码中保存):


生成图的代码是:

function [  ] = plotInequalities( ~ )

pRange = linspace(1/2,1,1000);
cRange = linspace(0,1,1000);
[P, C] = meshgrid(pRange,cRange);
ineq1 = P >= 2/3;           
ineq2 = C.*P.*(3-4.*P)./(2.*P+C.*(2-4.*P)) >= 1-P; 
ineq3 = C <= 3.*P.*(1-P)./(2.*(-6.*P.^2+6.*P-1));
rest = ~ineq1 & ~ineq2 & ~ineq3;                      
pl = figure
hold on
c = 2:5; 
contourf(pRange, cRange, c(2) * ineq2, [c(2), c(2)], 'c')  
contourf(pRange, cRange, c(3) * ineq3, [c(3), c(3)], 'y')  
contourf(pRange, cRange, c(4) * rest, [c(4), c(4)], 'r') 
contourf(pRange, cRange, c(1) * ineq1, [c(1), c(1)], 'b')  
legend('\{A,AB\}', '\{A,B\}', '\{A,AB, B\}', '\{A\}')
xlabel('P')
ylabel('C')
saveas(pl, 'out.png','png');
end

我在 Windows 8.

上使用 Matlab R2014a

Any idea as to why this happens?

这是因为您的域 ineq1ineq3 之间存在重叠。

如果您将图形的渲染器设置为 painter 以外的任何其他值(例如 openglzbuffer),您将看到代表域边界的线 ineq3(应该隐藏在ineq1下)

当使用 Matlab 引擎打印图形时(对于 pngjpgtiff 等...),我无法强制 print命令使用 painter 渲染器。如果您使用使用 gostscript 引擎呈现的格式之一(pdfbmppcxpcm、...),则会生成正确的输出。

如果您想坚持使用 png 输出,简单的解决方法是确保您的域之间没有重叠,然后再将它们发送到 contourf 函数。因此,在您的情况下,只需添加以下行:

ineq3(ineq3==ineq1) = false ;

就在你调用不同的contourf之前,保存的图像中的图中的输出就可以了(因为不会有鬼线到混淆渲染引擎)。

当然,对于这种方法,重叠的顺序很重要。此解决方案假设您想要查看完整域 ineq1,并且它优先于域 ineq3。如果您想要不同的优先级,您必须更改哪个域覆盖另一个。

PS:如果你想让所有域的边界都可见,可以考虑使用补丁和透明度,这样重叠会更明显。