可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have a problem to plot a subset of a data frame with ggplot2. My df is like:
ID Value1 Value2
P1 100 12
P1 120 13
...
P2 300 11
P2 400 16
...
P3 130 15
P3 140 12
...
How can I now plot Value1 vs Value2 only for IDs P1 and P3?
For example I tried:
ggplot(subset(df,ID=="P1 & P3") + geom_line(aes(Value1, Value2, group=ID, colour=ID)))
but I always receive an error.
p.s. I also tried many combination with P1 & P3 but I always failed..
回答1:
Here 2 options for subsetting:
Using subset
from base R:
library(ggplot2)
ggplot(subset(dat,ID %in% c("P1" , "P3"))) +
geom_line(aes(Value1, Value2, group=ID, colour=ID))
Using subset
the argument of geom_line
(Note I am using plyr
package to use the special .
function).
library(plyr)
ggplot(data=dat)+
geom_line(aes(Value1, Value2, group=ID, colour=ID),
,subset = .(ID %in% c("P1" , "P3")))
You can also use the complementary subsetting:
subset(dat,ID != "P2")
回答2:
There's another solution that I find useful, especially when I want to plot multiple subsets of the same object:
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"))
回答3:
Are you looking for the following plot:
library(ggplot2)
l<-df[df$ID %in% c("P1","P3"),]
myplot<-ggplot(l)+geom_line(aes(Value1, Value2, group=ID, colour=ID))
回答4:
With option 2 in @agstudy's answer now deprecated, defining data with a function can be handy.
library(plyr)
ggplot(data=dat) +
geom_line(aes(Value1, Value2, group=ID, colour=ID),
data=function(x){x$ID %in% c("P1", "P3"))
This approach comes in handy if you wish to reuse a dataset in the same plot, e.g. you don't want to specify a new column in the data.frame, or you want to explicitly plot one dataset in a layer above the other.:
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"), ]})
回答5:
@agstudy's answer didn't work for me with the latest version of ggplot2
, but this did, using maggritr
pipes:
ggplot(data=dat)+
geom_line(aes(Value1, Value2, group=ID, colour=ID),
data = . %>% filter(ID %in% c("P1" , "P3")))
It works because if geom_line
sees that data
is a function, it will call that function with the inherited version of data
and use the output of that function as data
.
回答6:
Your formulation is almost correct. You want:
subset(dat, ID=="P1" | ID=="P3")
Where the |
('pipe') means 'or'. Your solution, ID=="P1 & P3"
, is looking for a case where ID is literally "P1 & P3"
回答7:
Try filter to subset only the rows of P1 and P3
df2 <- filter(df, ID == "P1" | ID == "P3")
Than yo can plot Value1. vs Value2.
回答8:
Use subset within ggplot
ggplot(data = subset(df, ID == "P1" | ID == "P2") +
aes(Value1, Value2, group=ID, colour=ID) +
geom_line()