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];
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
%
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.