Kazz
Kazz

Reputation: 616

Matlab double color plot

I want to draw a function f given as 2 vectors: x and y, so y=f(x). I use plot(x,y), but now I need it be blue above 0 and red under so it look like this:

enter image description here

Upvotes: 5

Views: 1400

Answers (2)

jerad
jerad

Reputation: 2028

When you plot a vector in matlab, any segment of that vector that is filled with NaNs will not be plotted. So one trick to accomplish your goal is to plot a second line on top of the original one with the relevant segments removed using Nans. For example,

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

Upvotes: 8

kol
kol

Reputation: 28688

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;

Upvotes: 1

Related Questions