Подтвердить что ты не робот

Geom_point() и geom_line() для нескольких наборов данных на одном графике в ggplot2

Я пытаюсь построить три набора данных на одном графике. Один набор данных должен отображаться на графике как просто набор несвязанных точек, тогда как другие два должны отображаться как связанные точки данных. Я могу построить график, используя следующий код ниже:

x <- c(1,2,3,4)
y <- c(1.1,1.2,1.3,1.4)
y2 <- c(2.1,2.2,2.3,2.4)
x3 <- c(4,5,6,7)
y3 <- c(3.1,3.2,3.3,3.2)
p1 <- data.frame(x=x,y=y)
p2 <- data.frame(x=x,y=y2)
p3 <- data.frame(x=x3,y=y3)

plot(x,y,type="o", col="red")
points(x3,y3,col="darkgreen",pch=16)
points(x,y2,type="o",col="blue")

Как показано в коде, существует два набора точек, которые строятся с типом "o", что означает, что точки соединены линией, где один набор точек не связан линией. Я пытался воссоздать это в ggplot2. Я делаю следующее в ggplot2:

zz <- melt(list(p1=p1,p2=p2,p3=p3), id.vars="x")
ggplot(zz, aes(x.value, color = L1)) 
+ geom_point() + scale_color_manual("Dataset", 
values = c("p1" = "darkgreen", "p2" = "blue", "p3" = "red"))

Выполняя вышеизложенное, я получаю три набора точек в трех разных цветах, но, конечно, красные и синие точки не связаны соответственно. Если я хочу подключить точки, я могу добавить geom_line() в приведенную выше команду, чтобы у меня было следующее:

ggplot(zz, aes(x.value, color = L1)) + geom_point() + 
scale_color_manual("Dataset", values = 
c("p1" = "darkgreen", "p2" = "blue", "p3" = "red")) + geom_line()

Конечно, это приводит к линиям, соединяющим все точки, так что все красные точки связаны друг с другом, все синие точки связаны друг с другом, а все зеленые точки связаны друг с другом. Однако, хотя я хочу, чтобы красные и синие точки были подключены, я не хочу, чтобы зеленые точки были подключены. Есть ли способ сделать это?

Я мог бы сделать следующее (или подобное ему):

ggplot(p2, aes(x,y)) + geom_point(color = "blue") + geom_line(color="blue") 
+ geom_point(data=p3, color = "red") + 
geom_line(data=p3, color="red") + geom_point(data=p1, color = "darkgreen")

С помощью этой команды красные точки подключены, синий подключен, а зеленый отключен. Тем не менее, я не хочу этого делать, поскольку хочу, чтобы в легенде отображались все цвета точек (и в этом решении нет легенды).

4b9b3361

Ответ 1

Фокус в том, что каждый слой может иметь свой собственный набор данных. Таким образом, вы должны подмножить данные, чтобы исключить L1=="p1" из данных, предоставленных в geom_line:

ggplot(zz, aes(x, y=value, color=L1)) + 
  geom_point() + 
  geom_line(data=zz[zz$L1!="p1", ]) +
  scale_color_manual("Dataset", 
       values = c("p1" = "darkgreen", "p2" = "blue", "p3" = "red"))

enter image description here

Ответ 2

Вы можете подавать другой набор данных в каждую геометрию. Таким образом, вы можете передать в набор данных, исключая p1, в слой geom_line. Что-то вроде этого должно работать:

ggplot(zz, aes(x, value, color = L1)) + 
  geom_point() + 
  geom_line(data = subset(zz, L1 %in% c("p2", "p3")), aes(group = L1)) +
  scale_color_manual("Dataset", values = c("p1" = "darkgreen", "p2" = "blue", "p3" = "red"))