Here's what I do, I'm open to any suggestions and improvements...
seq.log=function(x1,x2="1"){ if(length(x1)==2){x2=x1[2];x1=x1[1];} n1=floor(log(x1)/log(10)) n2=floor(log(x2)/log(10)) suff=NULL; if(x1==1000){n1=n1+1;} if(x2==1000){suff=1000;} if(n2-(log(x2)/log(10))==0){ n2=n2-1; suff=x2; } dn=n2-n1+1 return(c(as.vector( t(10^(log(matrix(1:9,dn,9,byrow=T) )/log(10)+matrix(n1:n2,dn,9) ))),suff)) } nextint=function(v){ w=numeric(length(v)) for(i in 1:length(v)){ if(v[i]<0){ w[i]=floor(v[i]); }else{ w[i]=ceiling(v[i]); } } return(w) } range.log=function(X){ return(10^nextint(log(range(X,na.rm=T))/log(10))) } range.decade=function(X){ return(nextint(log(range(X,na.rm=T))/log(10))) } plot.loglog=function(X,Y,majorgrid=T,minorgrid=T,ygrid=Y,xlim=range(X),ylim=range(Y),...){ ### Work on axis, ticks and labels rX=range(xlim,na.rm=T) rY=range(ylim,na.rm=T) #minor grid xmgrid=seq.log(rX) ymgrid=seq.log(rY) #Major grid px=nextint(log(rX)/log(10)) Vpx=px[1]:px[2]; xMgrid=10^(Vpx) py=nextint(log(rY)/log(10)) Vpy=py[1]:py[2]; yMgrid=10^(Vpy) xlim=range(xMgrid); ylim=range(yMgrid); ### Plotting plot.empty(rX,rY,log="xy",xlim=xlim,ylim=ylim,...) # grid if(minorgrid){ abline(v=xmgrid,col="lightgray") abline(h=ymgrid,col="lightgray") } if(majorgrid){ abline(v=xMgrid,col="gray") abline(h=yMgrid,col="gray") } par(new=T) # plot plot(X,Y,log="xy",axes=F,frame.plot=T,ylim=ylim,xlim=xlim,...) #labels #par(las=1) #horizontal for(px in pretty(Vpx)){ axis(1,at=10^px,bquote(10^.(px))) } for(py in pretty(Vpy)){ axis(2,at=10^py,bquote(10^.(py))) } } #plot.loglog(f,S,type="o",col=4,pch="",xaxs="i",yaxs="i"); -- View this message in context: http://n4.nabble.com/nice-log-log-plots-tp793534p1592527.html Sent from the R help mailing list archive at Nabble.com. ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.