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

2

Я использую 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))

Ваш Ответ

3   ответа
-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) вам потребуется настроить параметры в соответствии с требованиями. Но если бы был более прямой путь, это было бы лучше.

Да, пожалуйста. Задача этого форума (по крайней мере для меня) - найти лучшее решение проблемы в доступном для поиска формате. иногда мы строим ответы других и улучшаем их.
Спасибо! Немного утомительно вручную настраивать каждую метку, если я использую это для наборов данных с большим количеством групп. Но я использовал вашу идею, чтобы создать функцию, которая сделает это автоматически. Я опубликую это как ответ на мой собственный вопрос, надеюсь, это правильный этикет. celt-Ail
-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

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

Похожие вопросы