[R] Covered Labels

Jim Lemon bitwrit at ozemail.com.au
Thu Jun 24 06:05:09 CEST 2004


Martina Renninger wrote:
> Dear All!
>
>
>
> How can I cope with overlapping or covered labels (covered by labels
> from other data points) in plots?

This doesn't solve every such problem, but it has helped me in the past.
You will probably have to expand the xlim and ylim a bit to fit the extreme 
labels onto the plot.

Also, there seems to be a typo in the HTML help for dist(), mentioning 
as.matrix.dist() which should be as.matrix().

Jim
-------------- next part --------------
# thigmophobe returns the direction (as n|e|s|w) _away_ from
# the nearest point where x and y are vectors of 2D coordinates

thigmophobe<-function(x,y) {
 # get the current upper and lower limits of the plot
 plot.span<-par("usr")
 x.span<-plot.span[2] - plot.span[1]
 y.span<-plot.span[4] - plot.span[3]
 # if either axis is logarithmic, transform the values into logarithms
 if(par("xlog")) x<-log(x)
 if(par("ylog")) y<-log(y)
 # scale the values to the plot span
 # this avoids the numerically larger
 # axis dominating the distance measure
 x<-x/x.span
 y<-y/y.span
 # get the distance matrix as a full matrix
 xy.dist<-as.matrix(dist(cbind(x,y)))
 lenx<-length(x)
 nearest.index<-rep(0,lenx)
 for(index in 1:lenx)
  nearest.index[index]<-as.numeric(names(which.min(xy.dist[-index,index])))
 # get the x and y differences for each point to the nearest point
 xdiff<-x - x[nearest.index]
 ydiff<-y - y[nearest.index]
 # first set the east/west direction
 dir.ew<-ifelse(xdiff > 0,"e","w")
 # now do the north/south
 dir.ns<-ifelse(ydiff > 0,"n","s")
 dir.away<-ifelse(abs(xdiff)>abs(ydiff),dir.ew,dir.ns)
 return(dir.away)
}

# thigmophobe.labels positions labels at points so that they
# are most distant from the nearest other point, where the
# points are described as x and y coordinates.

thigmophobe.labels<-function(x,y,labels,...) {
 if(!missing(x) && !missing(y)) {
  lenx<-length(x)
  if(missing(labels)) labels<-as.character(1:lenx)
  dir.away<-thigmophobe(x,y)
  xadjust<-strwidth("M")
  yadjust<-strheight("M")*1.5
  text.adj<-rep(0,lenx)
  for(i in 1:lenx) {
   if(dir.away[i] == "n") {
    y[i]<-y[i]+yadjust
    text.adj[i]<-0.5
   }
   if(dir.away[i] == "e") {
    x[i]<-x[i]+xadjust
    text.adj[i]<-0
   }
   if(dir.away[i] == "s") {
    y[i]<-y[i]-yadjust
    text.adj[i]<-0.5
   }
   if(dir.away[i] == "w") {
    x[i]<-x[i]-xadjust
    text.adj[i]<-1
   }
  }
  text(x,y,labels,...)
 }
 else
  cat("Usage: thigmophobe.labels(x,y,labels=1:length(x),...)\n")
}


More information about the R-help mailing list