web-dev-qa-db-fra.com

geom_point () et geom_line () pour plusieurs jeux de données sur le même graphique dans ggplot2

J'essaie de tracer trois ensembles de données sur le même graphique. Un ensemble de données doit apparaître sur le graphique comme un ensemble de points non connectés, tandis que les deux autres doivent apparaître comme des points de données connectés. Je peux construire le graphique en utilisant le code suivant ci-dessous:

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")

Comme indiqué dans le code, il y a deux ensembles de points qui sont tracés avec le type "o", ce qui signifie que les points sont connectés par une ligne, alors qu'un ensemble de points n'est pas connecté par une ligne. J'essayais de recréer cela dans ggplot2. Je fais ce qui suit dans 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"))

En faisant ce qui précède, j'obtiens les trois ensembles de points dans trois couleurs différentes, mais bien sûr, les points rouge et bleu ne sont pas connectés respectivement. Si je veux connecter les points, je peux ajouter geom_line () à la commande ci-dessus afin d'avoir les éléments suivants:

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

Bien sûr, cela se traduit par des lignes reliant tous les points, de sorte que tous les points rouges sont connectés les uns aux autres, tous les points bleus sont connectés les uns aux autres et tous les points verts sont connectés les uns aux autres. Cependant, alors que je veux que les points rouges et bleus soient connectés, je ne veux pas que les points verts soient connectés. Y a-t-il un moyen de faire cela?

Je pourrais faire ce qui suit (ou similaire):

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")

Avec cette commande, les points rouges sont connectés, le bleu est connecté et le vert est déconnecté. Cependant, je ne veux pas faire cela car je veux pouvoir faire apparaître toutes les couleurs de points dans la légende (et aucune légende n'apparaît dans cette solution).

32
MZT

L'astuce est que chaque couche peut avoir son propre ensemble de données. Vous devez donc sous-définir les données pour exclure L1=="p1" à partir des données fournies à 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

36
Andrie

Vous pouvez alimenter un jeu de données différent dans chaque géom. Vous pouvez donc passer un jeu de données excluant p1 dans la couche geom_line. Quelque chose comme ça devrait fonctionner:

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")) 
10
Chase