function [h,ch]=plot3c(varargin)
% A 2d scatter plot to display 3d data, with the color of each point
% indicating the third dimension. Requires x,y,z data and a value "c" to
% show how many linearly spaced colour bins required. Otherwise a vector
% can be given, containing the edges of the colour bins. If a vector is
% used and is padded by a single nan's, the nan's will be replaced by the
% min and max value of z.
%
% This is the first function I've written to accept parameter and and value
% pairs to allow properties of the plot to be changed.
%
% Hard coded into this is colormap, marker, markersize and linestyle, with
% defaults being jet, '.', 4, and 'none'
%
% Jonathan Tinker 14/06/06
%
% e.g.
% x=rand(100,1)
% y=sin(x)
% z=cos(x)
% c=10;
%
% [h,ch]=plot3c(x,y,z,c)
if nargin<3
disp('Insufficient input variables, needs x,y,z')
return
else
x=varargin{1};
y=varargin{2};
z=varargin{3};
end
if nargin==3
c=linspace(min(z),max(z),6)
else
c=varargin{4};
end
if logical(((nargin/2-floor(nargin/2))*2)==1)&(nargin>3)
disp('Parameter and values must be paired')
end
if length(c)==1
n=c;
minz=min(z);
maxz=max(z);
zedges=linspace(minz,maxz,n+1);
else
zedges=c;
if ~isempty(z)
if isnan(zedges(1))
zedges(1)=min(z);
end
if isnan(zedges(end))
zedges(end)=max(z)+eps;
end
else
if isnan(zedges(1))
zedges(1)=zedges(1)-1;
end
if isnan(zedges(end))
zedges(1)=zedges(end)+1+eps;
end
end
end
cnt=1;
zlabel='';
for i=5:2:length(varargin)
if strcmp(varargin{i},'colormap')
C=colormap(varargin{i+1});
elseif strcmp(varargin{i},'markersize')
mksz=varargin{i+1};
elseif strcmp(varargin{i},'marker')
mk=varargin{i+1}
elseif strcmp(varargin{i},'linestyle')
linsty=varargin{i+1};
elseif strcmp(varargin{i},'zlabel')
zlabel=varargin{i+1};
else
param{cnt}=varargin{i};
value{cnt}=varargin{i+1};
end
cnt=cnt+1;
end
if exist('C')~=1
C=colormap;
end
if exist('mksz')==0
mksz=4;
end
if exist('mk')==0
mk='.';
end
if exist('linsty')==0
linsty='none';
end
zpnts=mean([zedges(1:end-1)' zedges(2:end)' ]');
cpnts=sort([zedges zpnts])';
c=C(round(linspace(1,64,length(cpnts))),:);
c=c(2:2:end,:);
hold on
for i=1:length(zedges)-1
ind=(z>=zedges(i))&(z<zedges(i+1));
tmph=plot(x(ind),y(ind),'color',c(i,:),'markersize',mksz,'marker',mk,'linestyle',linsty);
if ~isempty(tmph)
h(i)=tmph;
else
h(i)=nan;
end
end
if exist('param')~=0
for i=1:length(param)
set(gca,param{1},value{i})
end
end
caxis([zedges(1) zedges(end)])
ch=colorbar;
clabs=num2str(cpnts);
clabs(2:2:end,:)=' ';
set(ch,'ytick',cpnts,'YTickLabel',clabs)
set(get(ch,'ylabel'),'string',zlabel)
hold off