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