How to make geom_text plot within the canvas's bounds

前端 未结 4 1205
无人及你
无人及你 2020-11-29 03:55

Using geom_text to label outlying points of scatter plot. By definition, these points tend to be close to the canvas edges: there is usually at least one word that overlaps

4条回答
  •  不知归路
    2020-11-29 04:23

    I'm sure someone could come up with a way to program this a bit faster, but here's an answer that could be used especially with multiple facets that all have different ranges - I modified the data.frame to have two facets on different x and y scales:

    df <- data.frame(word = c("bicycle", "tricycle", "quadricycle"),
                     n.wheels = c(2,3,4, .2, .3, .4),
                     utility = c(10,6,7, 1, .6, .7),
                     facet = rep(c("one", "two"), each = 3))
    

    Then, I create a dummy data frame that determines the breadth of the range x and y for each facet (e.g., diff(range(n.wheels))), divides that breadth by a suitable number (depending on the length of your labels, I chose 8), and adds that padding to the minimum and maximum x- and y-value for each facet:

    pad <- rbind(ddply(df, .(facet), summarize,
                 n.wheels = min(n.wheels) - diff(range(n.wheels))/8, 
                 utility = min(utility) - diff(range(utility))/8),
    ddply(df, .(facet), summarize,
                 n.wheels = max(n.wheels) + diff(range(n.wheels))/8,
                 utility = max(utility) + diff(range(utility))/8))
    pad$word <- NA
    

    Then, you can add that layer to your plot with the colour set as NA:

    ggplot(data=df, aes(x=n.wheels, y=utility, label = word))  + 
       geom_text() + 
       geom_point(data = pad, aes(x = n.wheels, y = utility), colour = NA) +
       facet_wrap(~facet, ncol = 1, scales = "free") 
    

    Result: a reproducible, "automated" plot without cut-off labels (you may choose later to alter the scales to be prettier...)

提交回复
热议问题