#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 Еще раз спасибо, Стефан очень признателен.