In the R Documentation for top.line in staxlab in plotrix: top.line is: Distance from the axis to place the first line of text.
Notice that in the original runnable code in this thread for the two axes at the bottom of the graph: prdAxDistDown=0; frqAxDistDown=3.5; axis(1,tick=TRUE,line=prdAxDistDown,..... staxlab(1,top.line=(prdAxDistDown),..... axis(1,tick=TRUE,line=frqAxDistDown,..... staxlab(1,top.line=(frqAxDistDown),..... resulting in: labels on the first axis to be too low and labels on the second axis to be too high. Also it seems to me that top.line=(frqAxDistDown) is wrong because it is supposed to be the distance from the axis, not from the plot. Then if those lines are modified to: prdAxDistDown=0; frqAxDistDown=3.5; axis(1,tick=TRUE,line=prdAxDistDown,..... staxlab(1,top.line=(prdAxDistDown-0.8),..... axis(1,tick=TRUE,line=frqAxDistDown,..... staxlab(1,top.line=(frqAxDistDown+0.8),..... then the result is much closer the desirable result. Next if I move the second axis closer to the first by changing the 3.5 to 2.0 and keeping the same 0.8's: prdAxDistDown=0; frqAxDistDown=2.0; axis(1,tick=TRUE,line=prdAxDistDown,..... staxlab(1,top.line=(prdAxDistDown-0.8),..... axis(1,tick=TRUE,line=frqAxDistDown,..... staxlab(1,top.line=(frqAxDistDown+0.8),..... then the labels move away from the second axis. It seems to me that such shouldn't happen. But if I remove the +0.8 for the second axis, results improve: prdAxDistDown=0; frqAxDistDown=2.0; axis(1,tick=TRUE,line=prdAxDistDown,..... staxlab(1,top.line=(prdAxDistDown-0.8),..... axis(1,tick=TRUE,line=frqAxDistDown,..... staxlab(1,top.line=(frqAxDistDown),..... I can't understand why this should happen. I must be coding it incorrectly. Here is the modified code making a result close to desired, of course still needing improvement, but perhaps all wrong: #trying for both period-labeled and frequency labeled horizontal axis rm(list=ls(all=TRUE)) install.packages('plotrix') library(plotrix) staxlab<-function(side=1,at,labels,nlines=2,top.line=0.5, line.spacing=0.8,srt=NA,ticklen=0.03,adj=1,...) { if(missing(labels)) labels<-at nlabels<-length(labels) if(missing(at)) at<-1:nlabels axislim<-par("usr")[3:4-2*side%%2] if(any(at < axislim[1]) || any(at > axislim[2])) warning("Some axis labels are off the plot") if(is.na(srt)) { linepos<-rep(top.line,nlines) for(i in 2:nlines) linepos[i]<-linepos[i-1]+line.spacing linepos<-rep(linepos,ceiling(nlabels/nlines))[1:nlabels] axis(side=side,at=at,labels=rep("",nlabels)) mtext(text=labels,side=side,line=linepos,at=at,...) } else { linewidth<-strheight("M") xylim<-par("usr") if(side == 1) { xpos<-at if(par("ylog")) ypos<-10^(xylim[3]-ticklen*(xylim[4]-xylim[3])) else ypos<-xylim[3]-ticklen*(xylim[4]-xylim[3])-top.line*linewidth } if(side == 3) { xpos<-at if(par("ylog")) ypos<-10^(xylim[4]+ticklen*(xylim[4]-xylim[3])) else ypos<-xylim[4]+ticklen*(xylim[4]-xylim[3])+top.line*linewidth } if(side == 2) { ypos<-at if(par("xlog")) xpos<-10^(xylim[1]-ticklen*(xylim[2]-xylim[1])) else xpos<-xylim[1]-ticklen*(xylim[2]-xylim[1])-top.line*linewidth } if(side == 4) { ypos<-at if(par("xlog")) xpos<-10^(xylim[2]+ticklen*(xylim[2]-xylim[1])) else xpos<-xylim[2]+ticklen*(xylim[2]-xylim[1])+top.line*linewidth } par(xpd=TRUE) text(xpos,ypos,labels,srt=srt,adj=adj,...) par(xpd=FALSE) } } horAxisLims=c(0,7213); print(horAxisLims) par(mar=c(8,4,4,2)+.1,lheight=0.7) #margins=c(bot,lef,top,rit); default:c(5,4,4,2)+.1 #vertical text space = char height * character expansion * lheight #set only by par():ask,fig,fin,lheight,mai,mar,mex,mfcol,mfrow,mfg,new,oma,omd,omi,pin,plt,ps,pty,usr,xlog,ylog,ylbias prdAxDistDown=0; frqAxDistDown=2.0; verData=c(1,365,809,1252,1753,2191,2922,3409,3896,4383,4819,5255,5691,6128,6564,7000) #not fussy horData=c(1,300,800,1200,1700,2100,2900,3400,3800,4300,4800,5200,5600,6100,6500,7000) #not at tics prdTicLocs=c(1,365.,1252,1461,1753,2191,2922,4383,7000) prdLabels=c("1Yr","1Da","7Hr","6Hr","5Hr","4Hr","3Hr","2Hr","1.25\nHr"); print(prdLabels) nFrqTicInvls=9; frqTicLocs <- vector(length=nFrqTicInvls+1); frqLabels <- vector(length=nFrqTicInvls+1); frqInvl=(horAxisLims[2]-horAxisLims[1])/nFrqTicInvls for(i in 1:(nFrqTicInvls+1))frqTicLocs[i]=horAxisLims[1]+(i-1)*frqInvl for(i in 1:(nFrqTicInvls+1))frqLabels[i]=format(round(frqTicLocs[i]),digits=4,trim=TRUE,scientific=FALSE) print(frqLabels) #default mgp=c(3,1,0) margin line in mex units c(axisTitle,axisLabel,axisLine) las=2; #las=2 makes axis labels perpendicular to axis plot(horData,verData,xaxt='n',xlim=horAxisLims,xlab="") #tck if >= 0.5 then fraction of relevant side; if =1 then gridlines axis(1,tick=TRUE,line=prdAxDistDown,at=prdTicLocs,labels=rep("",length(prdLabels)),padj=0,tck=-.08) staxlab(1,top.line=(prdAxDistDown-0.8),at=prdTicLocs,labels=prdLabels,srt=90,adj=c(1,0)) axis(1,tick=TRUE,line=frqAxDistDown,at=frqTicLocs,labels=rep("",length(frqLabels)),padj=0,tck=-.08) staxlab(1,top.line=(frqAxDistDown),at=frqTicLocs,labels=frqLabels,srt=90,adj=c(1,0)) title(xlab="Cycles/Yr",line=6) -- View this message in context: http://r.789695.n4.nabble.com/How-do-I-move-the-axis-labels-precisely-tp4691082p4691168.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.