# 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.