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é.
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")
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"))
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
.
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))
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"), ]})
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"
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.
Utiliser un sous-ensemble dans ggplot
ggplot(data = subset(df, ID == "P1" | ID == "P2") + aes(Value1, Value2, group=ID, colour=ID) + geom_line()