【问题标题】:Why does Matlab add this line to plot when saving?为什么Matlab在保存时要添加这条线?
【发布时间】:2015-01-02 01:29:46
【问题描述】:

我一直试图在 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。


知道为什么会发生这种情况吗?

【问题讨论】:

  • 请提供更多细节。显示您用于生成绘图的代码,并保存图形(哪种格式?)。了解哪个版本的 matlab(和平台)也可能有用。
  • @Hoki - 感谢您的评论。添加了详细信息。

标签: matlab plot


【解决方案1】:

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

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

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

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

ineq3(ineq3==ineq1) = false ;

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

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

PS:如果您希望所有域的边框都可见,请考虑使用补丁和透明度,这样重叠会更加明显。

【讨论】:

    猜你喜欢
    • 2019-04-16
    • 1970-01-01
    • 2012-10-10
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    相关资源
    最近更新 更多