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 |