Sequentially bump labels up, starting from the bottom, if they collide with the label underneath.
bumpup <- function(d,...){
d <- calc.boxes(d)[order(d$y),]
"%between%" <- function(v,lims)lims[1]<v&v<lims[2]
obox <- function(x,y){
tocheck <- with(x,c(left,(right-left)/2+left,right))
tocheck %between% with(y,c(left,right))
}
for(i in 2:nrow(d)){
dif <- d$bottom[i]-d$top[i-1]
## here we are trying to test if box i can possibly collide with
## the box below it! Originally we checked if the bottom points of
## this box fall in the box below it, but this causes problems
## since we are reassigning box positions. If all boxes start at
## the same place, 2 will get moved up, 3 will not since its
## bottom points are no longer inside box 2. Solution: Look at box
## left and right limits and see if they collide!
## GOTCHA: If all the boxes are exactly the same size, on top of
## each other, then if we only examine left and right points of
## each box, none of the boxes will be detected as
## overlapping. One way to fix this is change > to >= in %between%
## but this is a bad idea since you can have boxes right next to
## each other that we don't want to move, that would be detected
## as overlapping. Solution: use the midpoint of the box as well!
overlap <- c(obox(d[i,],d[i-1,]),obox(d[i-1,],d[i,]))
if(dif<0&&any(overlap)){
d$bottom[i] <- d$bottom[i]-dif
d$top[i] <- d$top[i]-dif
d$y[i] <- d$y[i]-dif
}
}
d
}
| Please contact Toby Dylan Hocking if you are using directlabels or have ideas to contribute, thanks! |
| Documentation website generated from source code version 2021.2.24 (git revision bb6db07 Mon, 14 Jun 2021 22:38:45 +0530) using inlinedocs. |
| validate |