Соответствие цвета geom_text элементам на графике и удаление заголовка легенды в ggplot2

У меня два вопроса:
- как сделать так, чтобы в geom_text был тот же цвет, что и в geom_point?
- как удалить заголовок легенды?

Предполагая следующий набор данных:

library(ggplot2)
library(reshape2)

speed <- c(0, seq(from = 30, to = 330, by = 60))
power1 <- c(75, 85, 88, 85, 94, 92, 95)
power2 <- c(72, 82, 78, 69, 74, 85, 89)
dt <- data.frame(speed=speed, power1=power1, power2=power2)
dt <- melt(data = dt, id.vars = c("speed"))

Я делаю сюжет с помощью следующего кода:

p <- ggplot(data = dt, aes(x = speed, y = value, fill = variable)) + 
    geom_point(aes(color=variable), size = 2) +
    stat_smooth(aes(color=variable), method = lm, formula = y ~ poly(x, 2), se = FALSE, size = 1) 

p <- p + geom_text(aes(x = 100, 
                       y = 93, 
                       label = lm_eqn(lm(formula = value ~ poly(speed,2), 
                                         data = subset(x = dt, subset = variable == "power1")
                                         )
                                      ) 
                       ),
                   color = "black",
                   parse = TRUE) +
    geom_text(aes(x = 250, 
                  y = 72, 
                  label = lm_eqn(lm(formula = value ~ poly(speed,2), 
                                    data = subset(x = dt, subset = variable == "power2")
                                    )
                                 )
                  ), 
              color = "black", 
              parse = TRUE)

p

Функция справки для ярлыка:

lm_eqn = function(m) {
    # from: 
    # https://stackoverflow.com/questions/7549694/ggplot2-adding-regression-line-equation-and-r2-on-graph

    l <- list(a = format(coef(m)[1], digits = 2),
              b = format(abs(coef(m)[2]), digits = 2),
              c = format(abs(coef(m)[3]), digits = 2),
              s1 = ifelse(test = coef(m)[2]>0, yes = "+", no = "-"),
              s2 = ifelse(test = coef(m)[3]>0, yes = "+", no = "-"),
              r2 = format(summary(m)$r.squared, digits = 3));

    eq <- substitute(italic(y) == a~~s1~~b %.% italic(x)^2 ~~s2~~c%.% italic(x)*","~~italic(r)^2~"="~r2,l)

    as.character(as.expression(eq));                 
}

А сюжет выглядит так:

ggplot2 plot

Итак, как:
- изменить цвет geom_text на такой же, как цвет точек?
- удалить заголовок легенды?


person AndriusZ    schedule 13.01.2015    source источник


Ответы (1)


Сначала просто добавьте color = "power1" и color = "power2" к соответствующим вызовам geom_text(). Это установит соответствующий цвет, но даст вам неприятную (но ожидаемую) отметку "a" в легенде. Чтобы удалить текст «а», добавьте show_guide=FALSE к каждому из вызовов geom_text().

Во-вторых, я считаю, что вы хотите, чтобы первый aes вызов имел group = variable not fill = variable. Это поможет избежать путаницы, когда вы попытаетесь удалить заголовок из легенды. Чтобы удалить заголовок из легенды, добавьте guides(color = guide_lengend(title=NULL)).

Код:

p <- ggplot(data = dt, aes(x = speed, y = value, group = variable)) + 
  geom_point(aes(color=variable), size = 2) +
  stat_smooth(aes(color=variable), method = lm, formula = y ~ poly(x, 2), se = FALSE, size = 1) +
  geom_text(aes(x=100, y=93, label="First Label", color="power1"), show_guide=F) +
  geom_text(aes(x=250, y=72, label="Second Label", color="power2"), show_guide=F) +
  guides(color = guide_legend(title=NULL))
p

Результат:

Результат

Примечание. Будьте осторожны с выходом за границы графика с geom_text() - см. Это сообщение и этот ответ для получения дополнительной информации и идей.

person JasonAizkalns    schedule 13.01.2015