Matlab双色图

时间:2012-12-10 20:53:25

标签: matlab plot

我想绘制一个函数f作为2个向量:xy,所以y=f(x)。 我使用plot(x,y),但现在我需要它是0以上的蓝色和红色,所以它看起来像这样:

enter image description here

2 个答案:

答案 0 :(得分:8)

在matlab中绘制矢量时,不会绘制任何填充了NaN的矢量段。因此,实现目标的一个技巧是在原始的一行上绘制第二行,并使用Nans删除相关的段。例如,

x = linspace(1,100,1000);
y = sin(x);

% Using a cutoff of y>=0.5
belowCutoff       = y;
belowCutoff(y>=0) = NaN;  % Replace points above cutoff with NaNs; 

figure;
plot(x,y,'r',x, belowCutoff, 'b');

enter image description here

答案 1 :(得分:1)

y0 = 0; % threshold
color1 = [1 0 0]; % below threshold
color2 = [0 0 1]; % above threshold
x = 1 : 10;
y = randn(1, 10);
threshold_plot(x, y, y0, color1, color2);

function threshold_plot(x, y, y0, color1, color2)
hold on;
n = length(x);
for i = 2 : n
  x1 = x(i - 1); y1 = y(i - 1);
  x2 = x(i); y2 = y(i);
  ascending = y1 < y2;
  if x1 == x2
    if ascending
      plot([x1 x2], [y1, y0], 'Color', color1);
      plot([x1 x2], [y0, y2], 'Color', color2);
    else
      plot([x1 x2], [y1, y0], 'Color', color2);
      plot([x1 x2], [y0, y2], 'Color', color1);
    end;
  elseif y1 == y2
    if threshold <= y1
      plot([x1 x2], [y1 y2], 'Color', color2);
    else
      plot([x1 x2], [y1 y2], 'Color', color1);
    end;
  else
    a = (y2 - y1) / (x2 - x1);
    b = y1 - a * x1;
    x0 = (y0 - b) / a;
    if x1 <= x0 && x0 <= x2
      if ascending
        plot([x1 x0], [y1, y0], 'Color', color1);
        plot([x0 x2], [y0, y2], 'Color', color2);
      else
        plot([x1 x0], [y1, y0], 'Color', color2);
        plot([x0 x2], [y0, y2], 'Color', color1);
      end;
    else
      if y0 <= y1
        plot([x1 x2], [y1 y2], 'Color', color2);
      else
        plot([x1 x2], [y1 y2], 'Color', color1);
      end;
    end;   
  end;
end;