rggplot2direct-labels

How to show directlabels after geom_smooth and not after geom_line?


I'm using directlabels to annotate my plot. As you can see in this picture the labels are after geom_line but I want them after geom_smooth. Is this supported by directlabels? Or any other ideas how to achieve this? Thanks in advance!

enter image description here

This is my code:

library(ggplot2)
library(directlabels)

set.seed(124234345)

# Generate data
df.2 <- data.frame("n_gram" = c("word1"),
                   "year" = rep(100:199),
                   "match_count" = runif(100 ,min = 1000 , max = 2000))

df.2 <- rbind(df.2, data.frame("n_gram" = c("word2"),
                      "year" = rep(100:199),
                      "match_count" = runif(100 ,min = 1000 , max = 2000)) )

# plot
ggplot(df.2, aes(year, match_count, group=n_gram, color=n_gram)) +
  geom_line(alpha = I(7/10), color="grey", show_guide=F) +
  stat_smooth(size=2, span=0.3, se=F, show_guide=F) +
  geom_dl(aes(label=n_gram), method = "last.bumpup", show_guide=F) +
  xlim(c(100,220))

Solution

  • I'm gonna answer my own question here, since I figured it out thanks to a response from Tyler Rinker.

    This is how I solved it using loess() to get label positions.

     # Function to get last Y-value from loess
    funcDlMove <- function (n_gram) {
    
      model <- loess(match_count ~ year, df.2[df.2$n_gram==n_gram,], span=0.3)
      Y <- model$fitted[length(model$fitted)]
      Y <- dl.move(n_gram, y=Y,x=200)
      return(Y)
    }
    
    index <- unique(df.2$n_gram)
    mymethod <- list(
      "top.points", 
      lapply(index, funcDlMove)
      )
    
    # Plot
    
    PLOT <- ggplot(df.2, aes(year, match_count, group=n_gram, color=n_gram)) +
      geom_line(alpha = I(7/10), color="grey", show_guide=F) +
      stat_smooth(size=2, span=0.3, se=F, show_guide=F)
    
    direct.label(PLOT, mymethod)
    

    Which will generate this plot: https://i.sstatic.net/FGK1w.png