[R] nice log-log plots

ElManuelito emmanuel.branlard at gmail.com
Sun Mar 14 17:12:38 CET 2010


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.



More information about the R-help mailing list