web-dev-qa-db-fra.com

Sous-ensemble et ggplot2

J'ai un problème pour tracer un sous-ensemble d'une trame de données avec ggplot2. Mon df est comme:

ID Value1 Value2
P1 100 12
P1 120 13
...
P2 300 11
P2 400 16
...
P3 130 15
P3 140 12
...

Comment puis-je maintenant tracer Value1 vs Value2 uniquement pour les ID P1 et P3? Par exemple j'ai essayé:

ggplot(subset(df,ID=="P1 & P3") + geom_line(aes(Value1, Value2, group=ID, colour=ID)))

mais je reçois toujours une erreur.

p.s. J'ai aussi essayé plusieurs combinaisons avec P1 et P3 mais j'ai toujours échoué.

52
matteo

Voici 2 options de sous-paramétrage:

En utilisant subset à partir de la base R:

library(ggplot2)
ggplot(subset(dat,ID %in% c("P1" , "P3"))) + 
         geom_line(aes(Value1, Value2, group=ID, colour=ID))

En utilisant subset l'argument de geom_line (Notez que j'utilise le package plyr pour utiliser le programme spécial . une fonction).

library(plyr)
ggplot(data=dat)+ 
  geom_line(aes(Value1, Value2, group=ID, colour=ID),
                ,subset = .(ID %in% c("P1" , "P3")))

Vous pouvez également utiliser le sous-ensemble complémentaire:

subset(dat,ID != "P2")
62
agstudy

Il existe une autre solution que je trouve utile, en particulier lorsque je souhaite tracer plusieurs sous-ensembles du même objet:

myplot<-ggplot(df)+geom_line(aes(Value1, Value2, group=ID, colour=ID))
myplot %+% subset(df, ID %in% c("P1","P3"))
myplot %+% subset(df, ID %in% c("P2"))
15
Nick Isaac

La réponse de @ agstudy n'a pas fonctionné pour moi avec la dernière version de ggplot2, mais cela s’est fait avec maggritr pipes:

ggplot(data=dat)+ 
  geom_line(aes(Value1, Value2, group=ID, colour=ID),
                data = . %>% filter(ID %in% c("P1" , "P3")))

Cela fonctionne parce que si geom_line voit que data est une fonction, il l'appellera avec la version héritée de data et utilisera le résultat de cette fonction comme data.

7
nicolaskruchten

Cherchez-vous l'intrigue suivante:

library(ggplot2) 
l<-df[df$ID %in% c("P1","P3"),]
myplot<-ggplot(l)+geom_line(aes(Value1, Value2, group=ID, colour=ID))

enter image description here

7
Metrics

Avec l'option 2 dans la réponse de @ agstudy maintenant obsolète, définir des données avec une fonction peut être pratique.

library(plyr)
ggplot(data=dat) + 
  geom_line(aes(Value1, Value2, group=ID, colour=ID),
            data=function(x){x$ID %in% c("P1", "P3"))

Cette approche est pratique si vous souhaitez réutiliser un jeu de données dans le même graphique, par exemple. vous ne souhaitez pas spécifier une nouvelle colonne dans le fichier data.frame, ou vous souhaitez explicitement tracer un ensemble de données dans une couche au-dessus de l'autre:

library(plyr)
ggplot(data=dat, aes(Value1, Value2, group=ID, colour=ID)) + 
  geom_line(data=function(x){x[!x$ID %in% c("P1", "P3"), ]}, alpha=0.5) +
  geom_line(data=function(x){x[x$ID %in% c("P1", "P3"), ]})
6
Dave

Votre formulation est presque correcte. Tu veux:

subset(dat, ID=="P1" | ID=="P3") 

Où le | _ ("tuyau") signifie "ou". Votre solution, ID=="P1 & P3", recherche un cas où ID est littéralement "P1 & P3"

3
Drew Steen

Essayez le filtre pour ne sous-définir que les lignes de P1 et de P3

df2 <- filter(df, ID == "P1" | ID == "P3")

Que vous pouvez tracer Value1. ou Value2.

2
CSV

Utiliser un sous-ensemble dans ggplot

ggplot(data = subset(df, ID == "P1" | ID == "P2") + aes(Value1, Value2, group=ID, colour=ID) + geom_line()

0
hizjamali