2012-04-01 14 views
56

Czy można grupować według dwóch kolumn? Tak więc produkt krzyżowy jest rysowany przez geom_point() i geom_smooth()?grupa według dwóch kolumn w ggplot2

jak np

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

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

taka, że ​​punkty 6 i 12 Udział grupy, ale nie 3.

Odpowiedz

23

Dlaczego nie tylko paste te dwie kolumny razem i używać , że zmienna jako grupy?

frame$grp <- paste(frame[,1],frame[,2]) 

nieco bardziej formalny sposób, aby to zrobić byłoby użyć funkcji interaction.

+11

myślę, że nie należy zmodyfikować 'data.frame' dla celów wykresu. "Spisek" powinien wykreślić twój df, a nie odwrotnie. – clemlaflemme

+1

Zgadzam się, odpowiedź Blue Magister jest lepsza. – JestonBlu

+2

@clemlaflemme Myślę, że odpowiedź BlueMagister jest w porządku, chociaż myślę, że rozróżnienie w tym przypadku jest niewielkie. Jednak ogólne stanowisko, że nie należy modyfikować ramek danych dla fabuły, jest ciekawym wyborem, jeśli chcesz użyć ** ggplot2 **, którego cały projekt opiera się na jawnej strukturze danych do pracy z semantyką ggplota. – joran

52

na przykład:

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

biorąc przykład z this question korzystając interaction połączyć dwie kolumny do nowego czynnika:

# 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 example

Powiązane problemy