function map = lbmap(n,scheme)
%LBMAP Returns specified Light-Bertlein colormap.
%
%   LBMAP(N,SCHEME) returns an Nx3 colormap. SCHEME can be one of the
%   following strings:
%
%       'Blue'       Single-hue progression to purlish-blue (default)
%       'BlueGray'   Diverging progression from blue to gray
%       'BrownBlue'  Orange-white-purple diverging scheme
%       'RedBlue'    Modified spectral scheme
%
%   If N is not specified, the size of the colormap is determined by the
%   current figure. If no figure exists, MATLAB creates one.
%
%Example 1: 7-color single-hue blue (default)
%   load penny
%   imagesc(P)
%   colormap(lbmap(7))
%   colorbar
%
%Example 2: 11-color modified spectrum
%   load penny
%   imagesc(P)
%   colormap(lbmap(11,'RedBlue'))
%   colorbar
%
%   See also HSV, GRAY, HOT, BONE, COPPER, PINK, FLAG, COLORMAP, RGBPLOT.

% Reference:
% A. Light & P.J. Bartlein, "The End of the Rainbow? Color Schemes for
% Improved Data Graphics," Eos,Vol. 85, No. 40, 5 October 2004.
% http://geography.uoregon.edu/datagraphics/EOS/Light&Bartlein_EOS2004.pdf

% Copyright 2007-2010 The MathWorks, Inc.

%defensive programming
error(nargchk(0,2,nargin))
error(nargoutchk(0,1,nargout))

%defaults
if nargin<2
	scheme = 'Blue';
end
if nargin<1
	n = size(get(gcf,'colormap'),1);
end

%valid schemes
switch lower(scheme)
	case 'blue'
		baseMap = BlueMap;
	case 'bluegray'
		baseMap = BlueGrayMap;
	case 'brownblue'
		baseMap = BrownBlueMap;
	case 'redblue'
		baseMap = RedBlueMap;
	otherwise
		error(['Invalid scheme ' scheme])
	end
	idx1 = linspace(0,1,size(baseMap,1));
	idx2 = linspace(0,1,n);
	map = interp1(idx1,baseMap,idx2);

function baseMap = BlueMap
	baseMap = [243 246 248;
	224 232 240;
	171 209 236;
	115 180 224;
	35 157 213;
	0 142 205;
	0 122 192]/255;

function baseMap = BlueGrayMap
	%DivergingBlueGray
	baseMap = [  0 170 227;
	53 196 238;
	133 212 234;
	190 230 242;
	217 224 230;
	146 161 170;
	109 122 129;
	65  79  81]/255;

function baseMap = BrownBlueMap
	baseMap = [144 100  44;
	187 120  54;
	225 146  65;
	248 184 139;
	244 218 200;
	241 244 245;
	207 226 240;
	160 190 225;
	109 153 206;
	70  99 174;
	24  79 162]/255;

function baseMap = RedBlueMap
	baseMap = [175  53  71;
	216  82  88;
	239 133 122;
	245 177 139;
	249 216 168;
	242 238 197;
	216 236 241;
	154 217 238;
	68 199 239;
	0 170 226;
	0 116 188]/255;
