2.7 Shaded Parametric Lines

How do you generate a 2- or 3-D line whose amplitude is represented by

colors?

Solution

It is possible to do this using the mesh command. By converting x, y, and/or z into a 2xN array whose first row equals the second, it is possible to use mesh to plot a shaded line. For example:

% Original Data
x = 0:pi/5:2*pi;
y = sin(x);
% Convert x and y into 2xN arrays
X = [x;x];
Y = [y;y];
% Generate the shaded line
mesh(X,Y,zeros(size(X)),Y)
view(2)
In this example, a colored sine wave is created. The first two inputs to mesh are the X and Y values. The third input is the Z value. Since this is a 2-D plot, the Z data is set to zero. The final input is the color data. Since Y represents the amplitude, set the color data to Y. Remember, by default, if the color data is not given, it defaults to the Z data. Since the Z data is all zeros, you must specify the color data. For a 3-D plot, it is not necessary to specify the color data.

Below is an M-file which combines all these steps into one file. It supports both 2- and 3-D cases. Using the x and y from the previous example, you can create the same plot by doing the following:

plotcol(x,y)
As you can see, this is much easier to type.

<---------------------  PLOTCOL.M  --------------------->
function handle = plotcol(x,y,z,c,linestyle);
% PLOTCOL generates a line plot that uses the color map.
% 
% PLOTCOL(X,Y,Z,C,LINESTYLE) plots a colored parametric
% line based on X, Y, Z, and C using the line style
% LINESTYLE.  The color scaling is determined by the
% values of C or by the current setting of CAXIS.  The
% scaled color values are used as indices into the current
% COLORMAP.
%
% Any combination of inputs can be used.  If C is not
% given, it is assigned to Z, Y, or X, depending on the
% input.  Below is a table which describes this:
%
%   GIVEN       VALUE OF C
%   X,Y,Z           Z
%    X,Y            Y
%     X             X
%
% SEE ALSO: mesh
if nargin == 0;error('Requires at least one input');end
% Determine which inputs were given:
if nargin == 1;                 % 2-D plot, X given.
  [m,n] = size(x);
  y = [x;x];
  x = [1:n;1:n];
  z = zeros(2,n);
  c = y;
  linestyle = '-';
elseif nargin == 2;             % 2-D plot, X and Y, C, 
                                %or LINESTYLE are given
  [m,n] = size(x);
  z = zeros(2,n)
  if isstr(y)                   % X and LINESTYLE given.
    y = [x;x];
    x = [1:n,1:n];
  else                          % X and Y given.
    x = [x;x];
    y = [y;y];
    linestyle = '-';
  end
  c = y;
elseif nargin == 3;             % X, Y, and Z, or 
                                %LINESTYLE given.
  [m,n] = size(x);
  x = [x;x];
  y = [y;y];
  if ~isstr(z)                  % X, Y, and Z given
    z = [z;z];
    c = z;
    linestyle = '-';
  else                          % X, Y, and LINESTYLE given
    linestyle = z;
    z = zeros(2,n);
    c = y;
  end
elseif nargin == 4              % X, Y, and Z, C, or LINESTYLE given.
  [m,n] = size(x);
  x = [x;x];
  y = [y;y];
  if isstr(c)                   % 2-D plot with X, Y, 
                                %C, and LINESTYLE
    linestyle = c;
    c = z;
    z = zeros(2,n);
  else                          % 3-D plot with X, Y, 
                                % Z, and C or LINESTYLE
    linestyle = '-';
    z = [z;z];
    c = [c;c];
  end
elseif nargin == 5              % Everything given.
  [m,n] = size(x);
  x = [x;x];
  y = [y;y];
  z = [z;z];
  c = [c;c];
end
h = mesh(x,y,z,c);
set(h,'LineStyle',linestyle);
if all(z == 0), view(2), end
if nargout == 1
  handle = h;
end

(c) Copyright 1994 by The MathWorks, Inc.