Можно ли удалить группы, нанесенные в виде точечной геометрии, из легенды ggplot, которая содержит данные как линейной, так и точечной геометрии?

#r #ggplot2 #legend

Вопрос:

Привет, у меня есть ggplot с точечными и линейными геометриями на одном графике. Меня попросили изменить легенду, чтобы данные о точках не представлялись в виде точки с проходящей линией. Я перепробовал много способов, но не могу заставить это работать.

Вот кадр с некоторыми фиктивными данными, а под ним несколько попыток

 x_observed <- rep(c(100, 125,  140,  150, 180, 200,  300,  400), 50)
x_predict <- 0:399

y_observed <- rep(c(800, 1000, 2000, 3000, 4000, 4500, 6000, 7000), 50)
y_predict1 <-  25*(x_predict - 45)
y_predict2 <-  24*(x_predict - 60)
y_predict3 <-  20*(x_predict - 110)

obs <- (rep(paste("obs"), 400))
pred1 <- (rep(paste("pred1"), 400))
pred2 <-  (rep(paste("pred2"), 400))
pred3 <-  (rep(paste("pred3"), 400))


x <- c(x_observed, x_predict1, x_predict2, x_predict3)
y <- c(y_observed, y_predict1, y_predict2, y_predict3)
group <- c(obs, pred1, pred2, pred3)

dat <- data.frame(x, y, group)
 

Графики

это нормально, если не считать легенды о том, что у «obs» есть строка
 ggplot(dat,aes(x= x , y = y, colour = group))  
  geom_point(data = subset(dat, group == "obs"))  
  geom_line(size=1.3,data = subset(dat, group == "pred1")) 
  geom_line(size=1.3,data = subset(dat, group == "pred2"))  
  geom_line(size=1.3,data = subset(dat, group == "pred3"))
 
Попытался удалить легенду только из точечных данных (просто удалите «obs» из легенды было бы нормально)
 ggplot(dat,aes(x= x , y = y, group = group))  
  geom_point(data = subset(dat, group == "obs"), colour = "blue", show.legend = F)  
  geom_line(size=1.3,data = subset(dat, group == "pred1"), colour = "red", show.legend = T) 
  geom_line(size=1.3,data = subset(dat, group == "pred2"), colour = "black")  
  geom_line(size=1.3,data = subset(dat, group == "pred3"), colour = "grey")
 
под легендой в виде фигур все в порядке, но затем линия строится через «obs», которая должна быть только точечной
 ggplot(dat, aes(x=x, y=y, group = group, colour=group, shape=group))  
  geom_line ( show.legend = FALSE)  
  geom_point( )   
  labs( shape = "group", colour = "group")
 
снова у нас есть строка в легенде «obs», хотя я пытался ее удалить
 ggplot(dat, aes(x=x, y=y, group = group, colour=group))  
  geom_line (data = subset(dat, group != "obs"))  
  geom_point(data = subset(dat, group == "obs" , show.legend = FALSE))   
  labs(  colour = "group")
 

Если кто-нибудь сможет помочь, мы будем очень признательны!

Ответ №1:

Может быть, это то, чего вы пытаетесь достичь. Для настройки легенды вы можете использовать override.aes аргумент guide_legend , который позволяет вам вручную задавать linetype и для shape каждой записи легенды. Однако имейте в виду, что вы должны установить значения в том порядке, в котором записи отображаются в вашей легенде. Кроме того, я добавил a scale_color_manual для установки цветов:

 library(ggplot2)

ggplot(dat,aes(x= x , y = y, colour = group))  
  geom_point(data = subset(dat, group == "obs"))  
  geom_line(size=1.3, data = subset(dat, !group == "obs"))  
  scale_color_manual(values = c(obs = "blue", pred1 = "red", pred2 = "black", pred3 = "grey"))  
  guides(color = guide_legend(
    override.aes = list(
      linetype = c("blank", rep("solid", 3)),
      shape = c(16, rep(NA, 3)))))
 

Комментарии:

1. Спасибо тебе именно за то, что мне было нужно.

2. Также для тех, кто хотел его запустить, в векторе x была ошибка, должно быть x Еще раз спасибо, Стефан очень признателен.