在ggplot2中按两列进行分组

119

能否按照两列分组?这样就可以使用geom_point()geom_smooth()绘制交叉图吗?

例如:

frame <- data.frame(
 series <- rep(c('a', 'b'), 6), 
 sample <- rep(c('glass','water', 'metal'), 4), 
 data <- c(1:12))

ggplot(frame, aes()) # ...

使得点612属于同一组,但不包括3

3个回答

229

这个问题的例子中,使用interaction将两列数据合并成一个新的因子:

# Data frame with two continuous variables and two factors 
set.seed(0)
x <- rep(1:10, 4)
y <- c(rep(1:10, 2)+rnorm(20)/5, rep(6:15, 2) + rnorm(20)/5)
treatment <- gl(2, 20, 40, labels=letters[1:2])
replicate <- gl(2, 10, 40)
d <- data.frame(x=x, y=y, treatment=treatment, replicate=replicate)

ggplot(d, aes(x=x, y=y, colour=treatment, shape = replicate,
  group=interaction(treatment, replicate))) + 
  geom_point() + geom_line()

ggplot示例


65
例如:
 qplot(round, price, data=firm, group=id, color=id, geom='line') +  
      geom_smooth(aes(group=interaction(size, type)))

39
为什么不只是将这两列粘贴在一起,然后使用该变量作为分组?
frame$grp <- paste(frame[,1],frame[,2])

一个稍微正式一点的做法是使用 interaction 函数。


30
我认为您不应该修改 data.frame 来进行绘图。绘图应该绘制您的数据框(df),而不是相反地。 - ClementWalter
4
我同意,Blue Magister的答案更好。 - Jeston
9
@clemlaflemme 我认为BlueMagister的回答很好,虽然我认为在这种情况下区别相当微小。但是,既然你选择使用ggplot2,它的整个设计都是基于明确地构造你的数据以与ggplot的语义相配合的,因此,有关不应修改数据框以进行绘图的一般观点是一个耐人寻味的观点。 - joran
paste 的一个缺点是,当输入为因子时,它会丢弃水平级别,而 interaction 保留原始因子的顺序。这意味着使用 interaction 方法可以更自然地对组进行排序。 - Kota Mori
1
interaction 的一个缺点是它可能会丢失 NA。考虑以下示例:paste(c("a","b", NA, NA), c(1,2,1,2)),它将生成四个不同的分组变量:"a 1" "b 2" "NA 1" "NA 2",而 interaction(c("a","b", NA, NA), c(1,2,1,2)) 只会生成三个分组变量。 - fabern
你可以在 aes(group = paste(treatment, replicate)) 中使用 paste,但不要修改 d - Nate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接