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