67

我在用 ggplot2 绘制数据框的子集时遇到问题。我的 df 就像:

df = data.frame(ID = c('P1', 'P1', 'P2', 'P2', 'P3', 'P3'),
                Value1 = c(100, 120, 300, 400, 130, 140),
                Value2 = c(12, 13, 11, 16, 15, 12))

我现在如何仅针对s和进行Value1绘图?例如我试过:Value2ID'P1''P3'

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

但我总是收到错误消息。

4

9 回答 9

76

这里有 2 个子集选项:

subset从基础 R使用:

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

使用subset的参数geom_line(注意我使用plyr包来使用特殊.功能)。

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

您还可以使用互补子集:

subset(dat,ID != "P2")
于 2013-08-10T19:47:58.463 回答
27

还有另一种我觉得很有用的解决方案,尤其是当我想绘制同一对象的多个子集时:

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"))
于 2015-11-26T10:07:49.530 回答
13

@agstudy 的答案中的选项 2 现在已弃用,使用函数定义数据会很方便。

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

如果您希望在同一个图中重用数据集,这种方法会派上用场,例如,您不想在 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"), ]})
于 2016-10-31T17:37:09.357 回答
10

@agstudy 的答案不适用于我的最新版本ggplot2,但是使用maggritr管道可以:

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

它之所以有效,是因为如果geom_line看到那data是一个函数,它将使用继承的版本调用该函数,并将该函数data的输出用作data.

于 2018-11-12T15:05:38.810 回答
8

您是否正在寻找以下情节:

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

在此处输入图像描述

于 2013-08-10T19:45:19.557 回答
4

你的表述几乎是正确的。你要:

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

其中|('pipe')表示'或'。您的解决方案 ,ID=="P1 & P3"正在寻找 ID 字面意思的情况"P1 & P3"

于 2013-08-10T19:55:50.453 回答
2

尝试过滤以仅对 P1 和 P3 的行进行子集化

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

比你可以绘制Value1。与价值 2。

于 2017-01-18T15:32:36.117 回答
0

在 ggplot 中使用子集

ggplot(data = subset(df, ID == "P1" | ID == "P2") +
   aes(Value1, Value2, group=ID, colour=ID) +
   geom_line()
于 2019-06-24T04:00:05.143 回答
0

与@nicolaskruchten 的回答类似,您可以执行以下操作:

require(ggplot2)

df = data.frame(ID = c('P1', 'P1', 'P2', 'P2', 'P3', 'P3'),
                Value1 = c(100, 120, 300, 400, 130, 140),
                Value2 = c(12, 13, 11, 16, 15, 12))

ggplot(df) + 
  geom_line(data = ~.x[.x$ID %in% c("P1" , "P3"), ],
            aes(Value1, Value2, group = ID, colour = ID))
于 2020-11-06T11:05:12.540 回答