Q: How to plot a line with varying color?
Unfortunately, the PLOT function will not help you if you goal is something like the plot on the right.
However, you can emulate desired effect using PATCH objects (sacrificing drawing speed), the method employed by the CPLOT function (below).
Update: Matlab 6 and above includes the SCATTER function, which does the job (in a similar way).
This plot has been produced by the following commands:
x=-4:.1:4; cplot(x,sin(x),':') hold on cplot(x,cos(x),'-','linewidth',5) x=x(1:2:end); cplot(x,cos(x),-cos(x),'o',... 'markerfacecolor','flat',... 'markeredgecolor','w')
function h=cplot(x,y,varargin)
%CPLOT colored linear plot
% CPLOT(X,Y,C) plots a line (Y vs. X) with the color specified by C.
% If X is a matrix, one line per column is created (Y&C should match its size then)
% Colors are interpolated according to current colormap & caxis.
% CPLOT(X,Y) is equivalent to CPLOT(X,Y,Y).
% CPLOT(...,linespec) specifies the style of the line used (cf. PLOT)
% all other parameters are passed to the PATCH object (e.g. MarkerSize, etc.)
% H=CPLOT(...) returns handle(s) of PATCH object.
%
% Example: cplot(-5:.1:5,cos(-5:.1:5));
%
% Note: you can use ('edgecolor','interp'), but neither line thickness,
% nor line style will work (at least with Matlab 5.3Win)
% Note: PATCH objects are much slower than LINEs. Be patient with larger plots(~1e6 points)
% 5/21/2001 ashcherbina@ucsd.edu
arg=varargin;
if isempty(arg) | isstr(arg{1})
c=y;
else
c=arg{1};
arg={arg{2:end}};
end
% get the linestyle
line=[];
marker=[];
if ~isempty(arg)
[line,marker]=lstyle(arg{1});
if (~isempty(line) | ~isempty(marker))
if length(arg)>1,
arg={arg{2:end}};
else
arg={};
end
end
end
if (isempty(line) & ~isempty(marker)) line='none';
elseif (~isempty(line) & isempty(marker)) marker='none';
elseif (isempty(line) & isempty(marker)) line='-';marker='none';end
if any(size(x)==1)
x=[x(:);nan];
y=[y(:);nan];
c=[c(:);nan];
else
x=[x;x(1,:)*nan];
y=[y;y(1,:)*nan];
c=[c;c(1,:)*nan];
end
cax = newplot;
hh=patch(x,y,0);
set(hh,'cdata',c,'LineStyle',line,'Marker',marker);
set(hh,'facecolor','none','edgecolor','flat');
if (~isempty(arg))
set(hh,arg{:});
end
box on;
if nargout>0, h=hh;end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [line,marker]=lstyle(s)
% decode the linestyles
line=[];marker=[];
markers='+o*.xsd^v><ph';
if length(s)>3, return;end; % just in case a property was passed
for k=1:length(markers);
if ~isempty(findstr(s,markers(k)))
marker=markers(k);
break
end
end
s=[s,' '];
if ~isempty(findstr(s,'--'))
line='--';
elseif ~isempty(findstr(s,'-.'))
line='-.';
if (length(findstr(s,'.'))<2 & marker=='.'), marker=[];end;
elseif ~isempty(findstr(s,':'))
line=':';
elseif ~isempty(findstr(s,'-'))
line='-';
end