Добавьте directlabels в geom_smooth, а не в geom_line - PullRequest
0 голосов
/ 12 июня 2018

Я понимаю, что этот вопрос является точной копией этого , но решение там больше не работает (с использованием method="last.qp"), поэтому я задаю его снова.

Основная проблема заключается в том, что я хотел бы использовать directlabels (или эквивалент) для обозначения сглаженных средств для каждой группы (от stat_smooth()), а не фактических данных.Приведенный ниже пример показывает, насколько я близок, но метки не распознают группировку или даже сглаженную линию.Вместо этого я получаю ярлык на последнем месте.Что мне нужно, так это согласованный по цвету текст в конце каждой сглаженной строки, а не легенда в правой части графика.

Вот пример:

library(ggplot2)
library(directlabels)

## Data
set.seed(10)
d <- data.frame(x=seq(1,100,1), y=rnorm(100, 3, 0.5))
d$z <- ifelse(d$y>3,1,0)

## Plot
p <- ggplot(d, aes(x=x, y=y, colour=as.factor(z))) +
  stat_smooth(inherit.aes=T, se=F, span=0.8, show.legend = T) +
  geom_line(colour="grey50") +
  scale_x_continuous(limits=c(0,110)) +
  geom_dl(label="text", method="maxvar.points", inherit.aes=T)
p

, который делаетэтот участок: enter image description here

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Решение с использованием пакета ggrepel на основе этого ответа

library(tidyverse)
library(ggrepel)

set.seed(123456789)

d <- data.frame(x = seq(1, 100, 1), y = rnorm(100, 3, 0.5))
d$z <- ifelse(d$y > 3, 1, 0)

labelInfo <-
  split(d, d$z) %>%
  lapply(function(t){
    data.frame(
      predAtMax = loess(y ~ x, span = 0.8, data = t) %>%
        predict(newdata = data.frame(x = max(t$x)))
      , max = max(t$x)
    )}) %>%
  bind_rows

labelInfo$label = levels(factor(d$z))
labelInfo

#>   predAtMax max label
#> 1  2.538433  99     0
#> 2  3.293859 100     1

ggplot(
  d
  , aes(x = x, y = y, color = factor(z))
) + 
  geom_point(shape = 1) +
  geom_line(colour = "grey50") +
  stat_smooth(inherit.aes = TRUE, se = FALSE, span = 0.8, show.legend = TRUE) +
  geom_label_repel(data = labelInfo
                   , aes(x = max
                         , y = predAtMax
                         , label = label
                         , color = label
                         )
                   , nudge_x = 5,
                   ) +
  theme_classic()
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'

Создано в 2018-06-11 Представить пакет (v0.2.0).

0 голосов
/ 12 июня 2018

Вам нужно сообщить geom_dl, что вы хотите показать на своем графике.Код ниже должен просто соответствовать вашим потребностям:

p <- ggplot(d, aes(x=x, y=y, colour=as.factor(z))) +
  stat_smooth(inherit.aes=T, se=F, span=0.8, method = "loess", show.legend = F) +
  geom_line(colour="grey50") +
  scale_x_continuous(limits=c(0,110)) +
  geom_dl(label=as.factor(d$z), method="maxvar.points", inherit.aes=T)

Если вам нужен другой текст, а не 0 и 1, вам просто нужно сделать его на основе d$z и поставить его вместо as.factor(d$z).

enter image description here

Чтобы поместить метки рядом с последней точкой geom_smooth, а не с последними точками данных, я не смог найти какой-либо метод в geom_dl для этогоследовательно, придумали обходной путь:

p <- ggplot(d, aes(x=x, y=y, colour=as.factor(z))) +
  stat_smooth(inherit.aes=T, aes(label=as.factor(z)), se=F, 
              span=0.8, method = "loess", show.legend = F) +
  geom_line(colour="grey50") +
  scale_x_continuous(limits=c(0,110))


library(data.table)
smooth_dat <- setDT(ggplot_build(p)$data[[1]])
smooth_lab <- smooth_dat[smooth_dat[, .I[x == max(x)], by=group]$V1]


p + annotate("text", x = smooth_lab$x, y=smooth_lab$y, 
             label=smooth_lab$label,colour=smooth_lab$colour,
             hjust=-1)

enter image description here

...