2

Вопрос по r, ggplot2 – Как показывать directlabels после geom_smooth, а не после geom_line?

Я использую directlabels, чтобы аннотировать мой сюжет. Как вы можете видеть на этой картинке, метки идут после geom_line, но я хочу их после geom_smooth. Это поддерживается directlabels? Или есть другие идеи, как этого добиться? Заранее спасибо!

enter image description here

Это мой код:

library("ggplot2")
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))
  • Да, пожалуйста. Задача этого форума (по крайней мере для меня) - найти лучшее решение проблемы в доступном для поиска формате. иногда мы строим ответы других и улучшаем их.

    от
  • Спасибо! Немного утомительно вручную настраивать каждую метку, если я использую это для наборов данных с большим количеством групп. Но я использовал вашу идею, чтобы создать функцию, которая сделает это автоматически. Я опубликую это как ответ на мой собственный вопрос, надеюсь, это правильный этикет.

    от celt-Ail
  • 1

    Code:

    # use stat smooth with geom_dl to get matching direct labels.
    span <- 0.3
    ggplot(df.2, aes(year, match_count, group=n_gram, color=n_gram)) +
      geom_line(alpha = I(7/10), color="grey") +
      stat_smooth(size=2, span=span, se=F) +
      geom_dl(aes(label=n_gram), method = "last.qp", stat="smooth", span=span) +
      xlim(c(100,220))+
      guides(colour="none")
    

  • -3

    Я собираюсь ответить на свой вопрос здесь

    так как я понял это благодаря ответу Тайлера Ринкера.

    Вот как я решил это с помощью loess (), чтобы получить позиции меток.

     # 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)
    

    Который будет генерировать этот сюжет:http://i.stack.imgur.com/FGK1w.png

  • -1

    Это не то

    о чем вы просили, поскольку я не знаю, как это сделать, но это может быть более полезным для вас, так как вы потеряете меньше площади для надписей:

    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) 
    
    mymethod <- list(
        "top.points", 
        dl.move("word1", hjust=-6.65, vjust=13),
        dl.move("word2", hjust =-7.9, vjust=20.25)
    )
    
    direct.label(PLOT, mymethod)
    

    который дает:

    enter image description here

    Вы также можете попробовать:

    mymethod <- list(
        "top.points", 
        dl.move("word1", hjust=-6, vjust=14),
        dl.move("word2", hjust =-7.1, vjust=19.5)
    )
    
    ggplot(df.2, aes(year, match_count, group=n_gram, color=n_gram)) +
      geom_line(alpha = I(7/10), color="grey", show_guide=F) +
      xlim(c(100,220))+
      stat_smooth(size=2, span=0.3, se=F, show_guide=F) +
      geom_dl(aes(label=n_gram), method = mymethod, show_guide=F)
    

    который дает:

    enter image description here

    ПРИМЕЧАНИЕ. Для печати на других графических устройствах (это был Windows rgui) вам потребуется настроить параметры в соответствии с требованиями. Но если бы был более прямой путь, это было бы лучше.