0001 function s=xyzticksi(ax,ah)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034 if nargin<2
0035 ah=gca;
0036 if nargin<1
0037 ax=1;
0038 end
0039 end
0040 axfield={'XLim' 'YLim' 'ZLim'; 'XTick' 'YTick' 'ZTick'; 'XMinorTick' 'YMinorTick' 'ZMinorTick'; 'XTickLabel' 'YTickLabel' 'ZTickLabel'; 'XScale' 'YScale' 'ZScale'};
0041 tryglobal=nargout>0;
0042 digith=1;
0043 digitw=0.5;
0044
0045 prefix={'y','z','a','f','p','n','µ','m','','k','M','G','T','P','E','Z','Y'};
0046 marg=[2 0.5 0.25 0.25];
0047 ntreq=[3 2 2 1];
0048
0049 lgridtem={1; [1 20 1 50 1]; [1 20 4]; 9; [2 20 8]; [5 20 2 30 7]; [10 20 5 30 4 50 5]};
0050 ngrid=length(lgridtem);
0051 lgrid=cell(ngrid,1);
0052 agrid=zeros(ngrid,1);
0053
0054 for i=1:ngrid
0055 igridtem=[lgridtem{i} 100];
0056 igrid=zeros(1,sum(igridtem(1:2:end)));
0057 ntem=length(igridtem)/2;
0058 k=0;
0059 tick0=10;
0060 for j=1:ntem
0061 nstep=igridtem(2*j-1);
0062 igrid(k+1:k+nstep)=tick0+(0:nstep-1)*(igridtem(2*j)-tick0)/igridtem(2*j-1);
0063 k=k+nstep;
0064 tick0=igridtem(2*j);
0065 end
0066 agrid(i)=sum(log10([igrid(2:end) 100]./igrid).^2);
0067 lgrid{i}=igrid';
0068 end
0069 minsubsp=1;
0070 delcheck=[log10(2) log10(5) 2];
0071 delval=[1 2 5];
0072 dosubtick=0;
0073
0074 ngrid=length(lgrid);
0075 loggrid=cell(ngrid,1);
0076 for i=1:ngrid
0077 loggrid{i}=log10(lgrid{i})-1;
0078 end
0079
0080 getgca=get(ah);
0081 set(ah,'Units','points','FontUnits','points');
0082 getgcac=get(ah);
0083 set(ah,'Units',getgca.Units,'FontUnits',getgca.FontUnits);
0084 if ax==1
0085 widthc=getgcac.Position(3)/getgcac.FontSize;
0086 axdir=[1 0];
0087 else
0088 widthc=2*getgcac.Position(4)/getgcac.FontSize;
0089 axdir=[0 1];
0090 end
0091 axdir=max(abs(axdir),1e-10);
0092 a=getgca.(axfield{1,ax})(1);
0093 b=getgca.(axfield{1,ax})(2);
0094
0095 ntick=0;
0096 tickint=[];
0097 tickdp=[];
0098 ticksi=[];
0099 subtick=[];
0100 if strcmp(getgca.(axfield{5,ax}),'log')
0101 width10=widthc/log10(b/a);
0102 ai3=3*ceil(log10(a)/3);
0103 bi3=3*floor(log10(b)/3);
0104 if ai3>=-24 && bi3<=24
0105
0106 if tryglobal && a>=10^(bi3-1)
0107 gi=bi3;
0108 s=prefix{9+gi/3};
0109 globalsi=1;
0110 else
0111 gi=0;
0112 globalsi=0;
0113 s='';
0114
0115 end
0116 g=10^gi;
0117 ag=a/g;
0118 bg=b/g;
0119 al=log10(ag);
0120 bl=log10(bg);
0121 ai=ceil(al);
0122 bi=floor(bl);
0123 ai3=3*ceil(ai/3);
0124 bi3=3*floor(bi/3);
0125 for ipan=1:4
0126
0127 margin=marg(ipan);
0128 incsi=3*ceil(min((2*digitw+margin)/axdir(1),(digith+margin)/axdir(2))/(3*width10));
0129 switch ipan
0130 case {1,2}
0131 ticksi=incsi*ceil(ai/incsi):incsi:incsi*floor(bi/incsi);
0132 case {3,4}
0133 ticksi=ai3:incsi:bi3;
0134 end
0135 ntick=length(ticksi);
0136 tickint=ones(1,ntick);
0137 tickdp=zeros(1,ntick);
0138 if width10>0.25
0139 ticki=ai:bi;
0140 subtick=10.^(ticki(ticki~=3*fix(ticki/3)));
0141 end
0142 if incsi==3
0143 ci=floor(al);
0144 cibi=ci:bi;
0145 ndec=bi-ci+1;
0146 if globalsi
0147 siq0=zeros(1,ndec);
0148 else
0149 siq0=3*floor((cibi)/3);
0150 end
0151 siw0=siq0~=0;
0152 dpq0=max(siq0-cibi+1,1);
0153 for jgrid=1:ngrid
0154 igrid=jgrid-(ipan<=2)*(2*jgrid-ngrid-1);
0155 lgridi=lgrid{igrid};
0156 ngridi=length(lgridi);
0157 intq=reshape(repmat(lgridi,1,ndec).*repmat(10.^(cibi+dpq0-siq0-1),ngridi,1),1,[]);
0158 dpq=reshape(repmat(dpq0,ngridi,1),1,[]);
0159 msk=dpq>0 & rem(intq,10)==0;
0160 intq(msk)=intq(msk)/10;
0161 dpq(msk)=dpq(msk)-1;
0162 widq=1+floor(log10(intq));
0163 widq=digitw*(widq+(dpq>0).*max(1,dpq+2-widq)+reshape(repmat(siw0,ngridi,1),1,[]));
0164 logvq=reshape(repmat(loggrid{igrid},1,ndec)+repmat(ci:ndec+ci-1,ngridi,1),1,[]);
0165
0166 msk=logvq>=al & logvq<=bl;
0167 widq=widq(msk);
0168 logvq=logvq(msk);
0169
0170 if numel(widq)>=ntreq(ipan) && all(min((widq(1:end-1)+widq(2:end)+2*margin)/axdir(1),2*(digith+margin)/axdir(2))<=2*width10*(logvq(2:end)-logvq(1:end-1)))
0171
0172 ntick=numel(widq);
0173 tickint=intq(msk);
0174 tickdp=dpq(msk);
0175 siq=reshape(repmat(siq0,ngridi,1),1,[]);
0176 ticksi=siq(msk);
0177 subtick=[];
0178 dosubtick=igrid>1;
0179 break;
0180 end
0181 end
0182
0183 if ntick<5
0184 ldeltamin=log10(bg- bg*10^(-min((digitw+margin)/axdir(1),(digith+margin)/axdir(2))/width10));
0185 ildelta=floor(ldeltamin);
0186 ix=find(ldeltamin-ildelta<=delcheck,1);
0187 jx=ildelta*3+ix;
0188 while 1
0189 deltax=floor(jx/3);
0190 deltav=delval(jx-3*deltax+1);
0191 delta=deltav*10^deltax;
0192 multq=ceil(ag/delta):floor(bg/delta);
0193 ntickq=numel(multq);
0194 if ntickq<=ntick || ntickq<ntreq(ipan)
0195 break;
0196 end
0197 intq=deltav*multq;
0198 lintq=floor(log10(intq));
0199 siq=3*floor((lintq+deltax)/3);
0200 dpq=siq-deltax;
0201 msk=dpq<0;
0202 intq(msk)=intq(msk).*10.^(-dpq(msk));
0203 dpq(msk)=0;
0204 msk=rem(intq,10)==0 & dpq>0;
0205 while any(msk)
0206 dpq(msk)=dpq(msk)-1;
0207 intq(msk)=intq(msk)/10;
0208 msk=rem(intq,10)==0 & dpq>0;
0209 end
0210 widq=1+floor(log10(intq));
0211 widq=digitw*(widq+(dpq>0).*max(1,dpq+2-widq)+(siq~=0));
0212 logvq=log10(multq)+log10(deltav)+deltax;
0213
0214 if all(min((widq(1:end-1)+widq(2:end)+2*margin)/axdir(1),2*(digith+margin)/axdir(2))<=2*width10*(logvq(2:end)-logvq(1:end-1)))
0215 ntick=ntickq;
0216 tickint=intq;
0217 tickdp=dpq;
0218 ticksi=siq;
0219 dosubtick=1;
0220 break
0221 end
0222 jx=jx+1;
0223 end
0224 end
0225 end
0226 if ntick>=ntreq(ipan)
0227 break
0228 end
0229 end
0230 end
0231 if ntick
0232 tickexp=gi+ticksi-tickdp;
0233 tickpos=tickint .* 10.^tickexp;
0234 ratthresh=10^(minsubsp/width10);
0235 if dosubtick
0236 subtick=[];
0237 if ntick>1
0238 stepexp=min(tickexp(1:end-1),tickexp(2:end))-1;
0239 stepint=round((tickpos(2:end)-tickpos(1:end-1)).*10.^(-stepexp));
0240 stepleft=tickint(1:end-1).*10.^(tickexp(1:end-1)-stepexp);
0241 subbase=10.^ceil(log10(stepint)-1);
0242 substep=[-1 -3 5]*((1+[1; 2; 5]*(subbase./stepleft))>ratthresh);
0243 substep(stepint~=10*substep)=max(2-substep(stepint~=10*substep),0);
0244 substep=substep.*subbase;
0245 for i=1:ntick-1
0246 ss=substep(i);
0247 sl=stepleft(i);
0248 if ss
0249 subtick=[subtick (sl+(ss:ss:stepint(i)-ss))*10^stepexp(i)];
0250 if i==1 && sl/(sl-ss)>ratthresh
0251 subtick=[subtick (sl-(ss:ss:floor((tickpos(1)-a)/(ss*10^stepexp(i)))*ss))*10^stepexp(i)];
0252 elseif i==ntick-1 && (1+ss/(sl+stepint(1)))>ratthresh
0253 subtick=[subtick (sl+stepint(i)+(ss:ss:floor((b-tickpos(end))/(ss*10^stepexp(i)))*ss))*10^stepexp(i)];
0254 end
0255 end
0256 end
0257 end
0258 end
0259 [tps,ix]=sort([tickpos subtick]);
0260 nticks=length(tps);
0261 ticklab=cell(nticks,1);
0262 for j=1:nticks
0263 i=ix(j);
0264 if i>ntick
0265 ticklab{j}='';
0266 else
0267 ticklab{j}=sprintf(sprintf('%%.%df%%s',tickdp(i)),tickint(i)*10^(-tickdp(i)),prefix{ticksi(i)/3+9});
0268 end
0269 end
0270 if width10<2.5
0271 set(ah,axfield{3,ax},'off');
0272 end
0273 set(ah,axfield{2,ax},tps);
0274 set(ah,axfield{4,ax},ticklab);
0275 end
0276
0277 else
0278 for ipan=1:4
0279 margin=marg(ipan);
0280
0281 if tryglobal
0282 gi=3*floor(log10(max(abs(a),abs(b)))/3);
0283 s=prefix{9+gi/3};
0284
0285 else
0286 gi=0;
0287 s='';
0288 end
0289 g=10^gi;
0290 ag=a/g;
0291 bg=b/g;
0292 width1=widthc/(bg-ag);
0293 ldeltamin=log10(min((digitw+margin)/axdir(1),(digith+margin)/axdir(2))/width1);
0294 ildelta=floor(ldeltamin);
0295 ix=find(ldeltamin-ildelta<=delcheck,1);
0296 jx=ildelta*3+ix;
0297 while 1
0298 deltax=floor(jx/3);
0299 deltav=delval(jx-3*deltax+1);
0300 delta=deltav*10^deltax;
0301 multq=ceil(ag/delta):floor(bg/delta);
0302 ntickq=numel(multq);
0303 if ntickq<ntreq(ipan)
0304 break;
0305 end
0306 intq=deltav*multq;
0307 lintq=floor(log10(abs(intq)+(intq==0)));
0308 siq=3*floor((lintq+deltax)/3)*~tryglobal;
0309 dpq=siq-deltax;
0310 msk=dpq<0;
0311 intq(msk)=intq(msk).*10.^(-dpq(msk));
0312 dpq(msk)=0;
0313 msk=rem(intq,10)==0 & dpq>0;
0314 while any(msk)
0315 dpq(msk)=dpq(msk)-1;
0316 intq(msk)=intq(msk)/10;
0317 msk=rem(intq,10)==0 & dpq>0;
0318 end
0319 widq=1+floor(log10(abs(intq)+(intq==0)));
0320 widq=digitw*(widq+(dpq>0).*max(1,dpq+2-widq)+(siq~=0).*(intq~=0)+(intq<0));
0321
0322 if all((widq(1:end-1)+widq(2:end)+2*margin)<=2*axdir(1)*width1*delta) || (digith+margin<=axdir(2)*width1*delta);
0323 ntick=ntickq;
0324 tickint=intq;
0325 tickdp=dpq;
0326 ticksi=siq;
0327 if deltav>1 && width1*delta>0.5*deltav
0328 mults=ceil(ag*deltav/delta):floor(bg*deltav/delta);
0329 subtick=(mults(deltav*fix(mults/deltav)~=mults))*delta/deltav;
0330 else
0331 subtick=[];
0332 end
0333 break
0334 end
0335 jx=jx+1;
0336 end
0337 if ntick>=ntreq(ipan)
0338 break
0339 end
0340 end
0341 if ntick
0342 tickexp=gi+ticksi-tickdp;
0343 tickpos=tickint .* 10.^tickexp;
0344 [tps,ix]=sort([tickpos subtick*10^gi]);
0345 nticks=length(tps);
0346 ticklab=cell(nticks,1);
0347 for j=1:nticks
0348 i=ix(j);
0349 if i>ntick
0350 ticklab{j}='';
0351 else
0352 ticklab{j}=sprintf(sprintf('%%.%df%%s',tickdp(i)),tickint(i)*10^(-tickdp(i)),prefix{(ticksi(i)/3)*(tickint(i)~=0)+9});
0353 end
0354 end
0355 set(ah,axfield{2,ax},tps);
0356 set(ah,axfield{4,ax},ticklab);
0357 set(ah,axfield{3,ax},'on');
0358 end
0359 end