5

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

在此处输入图像描述

4

2 回答 2

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');

在此处输入图像描述

于 2012-12-10T21:37:55.897 回答
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;
于 2012-12-10T21:47:17.000 回答