为什么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?
这是因为您的域 ineq1
和 ineq3
之间存在重叠。
如果您将图形的渲染器设置为 painter
以外的任何其他值(例如 opengl
或 zbuffer
),您将看到代表域边界的线 ineq3
(应该隐藏在ineq1
下)
当使用 Matlab 引擎打印图形时(对于 png
、jpg
、tiff
等...),我无法强制 print
命令使用 painter
渲染器。如果您使用使用 gostscript 引擎呈现的格式之一(pdf
、bmp
、pcx
、pcm
、...),则会生成正确的输出。
如果您想坚持使用 png
输出,简单的解决方法是确保您的域之间没有重叠,然后再将它们发送到 contourf
函数。因此,在您的情况下,只需添加以下行:
ineq3(ineq3==ineq1) = false ;
就在你调用不同的contourf
之前,保存的图像中的图和中的输出就可以了(因为不会有鬼线到混淆渲染引擎)。
当然,对于这种方法,重叠的顺序很重要。此解决方案假设您想要查看完整域 ineq1
,并且它优先于域 ineq3
。如果您想要不同的优先级,您必须更改哪个域覆盖另一个。
PS:如果你想让所有域的边界都可见,可以考虑使用补丁和透明度,这样重叠会更明显。
我一直在尝试在 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 R2014aAny idea as to why this happens?
这是因为您的域 ineq1
和 ineq3
之间存在重叠。
如果您将图形的渲染器设置为 painter
以外的任何其他值(例如 opengl
或 zbuffer
),您将看到代表域边界的线 ineq3
(应该隐藏在ineq1
下)
当使用 Matlab 引擎打印图形时(对于 png
、jpg
、tiff
等...),我无法强制 print
命令使用 painter
渲染器。如果您使用使用 gostscript 引擎呈现的格式之一(pdf
、bmp
、pcx
、pcm
、...),则会生成正确的输出。
如果您想坚持使用 png
输出,简单的解决方法是确保您的域之间没有重叠,然后再将它们发送到 contourf
函数。因此,在您的情况下,只需添加以下行:
ineq3(ineq3==ineq1) = false ;
就在你调用不同的contourf
之前,保存的图像中的图和中的输出就可以了(因为不会有鬼线到混淆渲染引擎)。
当然,对于这种方法,重叠的顺序很重要。此解决方案假设您想要查看完整域 ineq1
,并且它优先于域 ineq3
。如果您想要不同的优先级,您必须更改哪个域覆盖另一个。
PS:如果你想让所有域的边界都可见,可以考虑使用补丁和透明度,这样重叠会更明显。