source: issm/trunk/src/m/plot/manualcb.m@ 22758

Last change on this file since 22758 was 22758, checked in by Mathieu Morlighem, 7 years ago

merged trunk-jpl and trunk for revision 22757

  • Property svn:executable set to *
File size: 5.1 KB
Line 
1function manualcb(zmin,zmax,cmap,varargin)
2%MANUALCB - custom colorbar
3%
4% Usage:
5% manualcb(min,max,colormap,options)
6%
7% Available options:
8% - 'fontsize' : default is 12
9% - 'fontcolor' : default is 'k'
10% - 'smallbars' : bars next to each tick (default is false)
11% - 'position' : colorbar position in normalized units
12% - 'orientation' : 'vertical' (default) or 'horizontal'
13% - 'title' : colorbar title
14% - 'tick' : specified values of tick labels
15% - 'ticksep' : spacing between ticks
16% - 'inverttickposition' : put ticks on the left hand side for vertical cb
17
18%check inputs
19if nargin<3,
20 help manualcb
21 error('bad usage');
22end
23if zmin>zmax,
24 error('zmin should be smaller than zmax');
25end
26
27%Get plot axes
28mainaxes = gca;
29
30%process options
31options = pairoptions(varargin{:});
32if exist(options,'tick') & exist(options,'ticksep'),
33 error('only one of tick or ticksep can be specified');
34end
35fontsize = getfieldvalue(options,'fontsize',12);
36fontcolor = getfieldvalue(options,'fontcolor','k');
37smallbars = getfieldvalue(options,'smallbars',false);
38
39%Colorbar position
40if ~exist(options,'position'),
41 position = plotboxpos;
42 xstart = position(1)+position(3)+0.01;
43 ystart = position(2);
44 width = .02;
45 height = position(4);
46else
47 position = getfieldvalue(options,'position');
48 xstart = position(1);
49 ystart = position(2);
50 width = position(3);
51 height = position(4);
52end
53axes('Units','normalized','Position',[xstart ystart width height],'XTickLabel','','YTickLabel','','Visible','on');
54xlim([0 1]);
55ylim([0 1]);
56
57%Prepare ticks
58if ~exist(options,'log'),
59 deltaz = getfieldvalue(options,'ticksep',dtick(zmax-zmin));
60 ztick = getfieldvalue(options,'tick',(deltaz*ceil(zmin/deltaz)):deltaz:zmax);
61 if (any(ztick>zmax) | any(ztick<zmin)),
62 error('one or more specified tick values falls outside of [zmin,zmax]');
63 end
64 ytick = (ztick-zmin)/(zmax-zmin);
65else
66 %old method
67 ztick = getfieldvalue(options,'tick',round( logspace(log10(zmin),log10(zmax),8) ));
68 ytick = linspace(0,1,numel(ztick));
69
70 %New method
71 test=logspace(-10,10,21);
72 pos=find(test>=zmin & test<=zmax);
73 ztick= test(pos);
74 ytick= (log(ztick) - log(zmin))/(log(zmax) - log(zmin));
75end
76
77%Display colorbar
78hold on
79numcolors=size(cmap,1);
80if 1,
81 %disappears somtimes
82 if strcmpi(getfieldvalue(options,'orientation','vertical'),'vertical'),
83 image_rgb = ind2rgb(repmat((1:numcolors)',1,10),cmap);
84 else
85 image_rgb = ind2rgb(repmat((1:numcolors),10,1),cmap);
86 end
87
88 imagesc([0 1],[0 1],image_rgb);
89else
90 %Creates triangles when exported as pdf
91 if strcmpi(getfieldvalue(options,'orientation','vertical'),'vertical'),
92 for i=1:numcolors,
93 patch([0,0,1,1],[(i-1)/numcolors,i/numcolors,i/numcolors,(i-1)/numcolors],0,'FaceColor',cmap(i,:),'Clipping','off','EdgeColor','none')
94 end
95 else
96 for i=1:numcolors,
97 patch([(i-1)/numcolors,i/numcolors,i/numcolors,(i-1)/numcolors],[0,0,1,1],0,'FaceColor',cmap(i,:),'Clipping','off','EdgeColor','none')
98 end
99 end
100end
101patch([0,0,1,1],[0,1,1,0],fontcolor,'FaceColor','none','Clipping','off','Edgecolor',fontcolor)
102
103%Add ticks
104if strcmpi(getfieldvalue(options,'orientation','vertical'),'vertical'),
105 %Use FOR LOOP otherwise numbers are not correcly centered
106 if getfieldvalue(options,'inverttickposition',0)==1,
107 for i=1:length(ytick), text(-0.5,ytick(i),num2str(ztick(i)),'HorizontalAlignment','right','VerticalAlignment','middle','FontSize',fontsize,'Color',fontcolor); end
108 else
109 for i=1:length(ytick), text(1.5,ytick(i),num2str(ztick(i)),'HorizontalAlignment','left','VerticalAlignment','middle','FontSize',fontsize,'Color',fontcolor); end
110 end
111 if smallbars,
112 for i=1:numel(ztick)
113 patch([0.8 1.0],[ytick(i) ytick(i)],fontcolor,'Edgecolor',fontcolor)
114 patch([0.0 0.2],[ytick(i) ytick(i)],fontcolor,'Edgecolor',fontcolor)
115 end
116 end
117else
118 %Use FOR LOOP otherwise numbers are not correcly centered
119 for i=1:length(ytick), text(ytick(i),-0.5,num2str(ztick(i)),'HorizontalAlignment','center','VerticalAlignment','top','FontSize',fontsize,'Color',fontcolor); end
120 if smallbars,
121 for i=1:numel(ztick)
122 patch([ytick(i) ytick(i)],[0.8 1.0],[ytick(i) ytick(i)],fontcolor,'Edgecolor',fontcolor)
123 patch([ytick(i) ytick(i)],[0.0 0.2],[ytick(i) ytick(i)],fontcolor,'Edgecolor',fontcolor)
124 end
125 end
126end
127
128if exist(options,'title'),
129 title(getfieldvalue(options,'title'),'FontSize',getfieldvalue(options,'titlefontsize',fontsize),'Color',fontcolor);
130end
131if exist(options,'ylabel'),
132 if strcmpi(getfieldvalue(options,'orientation','vertical'),'horizontal'),
133 th=title(getfieldvalue(options,'title'),'FontSize',fontsize,'Color',fontcolor);
134 set(th,'Position',[ytick(end)+0.075,-0.3]);
135 else
136 ylabel(getfieldvalue(options,'ylabel'),'FontSize',fontsize,'Color',fontcolor);
137 end
138end
139
140%Back to original axes
141if getfieldvalue(options,'showregion',0)==0,
142 axes(mainaxes);
143end
144
145function delta = dtick(range)
146%Tick intervals
147m = 10^floor(log10(range));
148p = ceil(range/m);
149if p <= 1, delta = .1*m;
150elseif p == 2, delta = .2*m;
151elseif p <= 5, delta = .5*m;
152else delta = m;
153end
Note: See TracBrowser for help on using the repository browser.