我有一个问题是使用ggplot2绘制数据框的子集.我的df就像:
ID Value1 Value2
P1 100 12
P1 120 13
...
P2 300 11
P2 400 16
...
P3 130 15
P3 140 12
...
Run Code Online (Sandbox Code Playgroud)
我现在如何仅为ID P1和P3绘制Value1与Value2的关系?例如我试过:
ggplot(subset(df,ID=="P1 & P3") + geom_line(aes(Value1, Value2, group=ID, colour=ID)))
Run Code Online (Sandbox Code Playgroud)
但我总是收到一个错误.
ps我也试过很多与P1和P3的组合,但我总是失败..
ags*_*udy 64
这里有两个子集选项:
使用subset基数R:
library(ggplot2)
ggplot(subset(dat,ID %in% c("P1" , "P3"))) +
geom_line(aes(Value1, Value2, group=ID, colour=ID))
Run Code Online (Sandbox Code Playgroud)
使用subset参数geom_line(注意我使用的plyr包使用特殊.功能).
library(plyr)
ggplot(data=dat)+
geom_line(aes(Value1, Value2, group=ID, colour=ID),
,subset = .(ID %in% c("P1" , "P3")))
Run Code Online (Sandbox Code Playgroud)
您还可以使用互补子集:
subset(dat,ID != "P2")
Run Code Online (Sandbox Code Playgroud)
小智 17
还有另一个我觉得有用的解决方案,特别是当我想绘制同一个对象的多个子集时:
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"))
Run Code Online (Sandbox Code Playgroud)
您在寻找以下情节:
library(ggplot2)
l<-df[df$ID %in% c("P1","P3"),]
myplot<-ggplot(l)+geom_line(aes(Value1, Value2, group=ID, colour=ID))
Run Code Online (Sandbox Code Playgroud)

由于@ agstudy的答案现在已弃用,因此使用函数定义数据非常方便.
library(plyr)
ggplot(data=dat) +
geom_line(aes(Value1, Value2, group=ID, colour=ID),
data=function(x){x$ID %in% c("P1", "P3"))
Run Code Online (Sandbox Code Playgroud)
如果您希望在同一个图中重用数据集,这种方法会派上用场,例如,您不希望在data.frame中指定新列,或者您希望在一个图层中明确地绘制一个数据集:
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"), ]})
Run Code Online (Sandbox Code Playgroud)
@agstudy的答案不适用于最新版本的ggplot2,但是使用maggritr管道却有效:
ggplot(data=dat)+
geom_line(aes(Value1, Value2, group=ID, colour=ID),
data = . %>% filter(ID %in% c("P1" , "P3")))
Run Code Online (Sandbox Code Playgroud)
之所以有效geom_line,data是因为如果看到这是一个函数,它将使用的继承版本调用该函数,并将该函数data的输出用作data。