agrupar por duas colunas em ggplot2

90

É possível agrupar por duas colunas? Portanto, o produto vetorial é desenhado por geom_point()e geom_smooth()?

Por exemplo:

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

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

De modo que os pontos 6e 12compartilham um grupo, mas não com 3.

Reactormonk
fonte

Respostas:

32

Por que não apenas pasteessas duas colunas juntas e usar essa variável como grupos?

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

Uma maneira um pouco mais formal de fazer isso seria usar a função interaction.

Joran
fonte
27
Eu acho que você não deve modificar o seu data.framepara o propósito de um enredo. O plotdeve plotar seu df e não o oposto.
ClementWalter
3
Eu concordo, a resposta do Blue Magister é melhor.
Jeston
6
@clemlaflemme Acho que a resposta do BlueMagister é boa, embora eu ache que a diferença neste caso é bem menor. Mas a posição geral de que não se deve modificar seu quadro de dados para um gráfico é curiosa, dada a sua escolha de usar ggplot2 , cujo design inteiro tem como premissa estruturar explicitamente seus dados para trabalhar com a semântica do ggplot.
joran
Uma desvantagem do pasteé que quando a entrada é um fator, ele descarta os níveis, onde interactionpreserva a ordem dos fatores originais. Isso significa que os grupos são mais naturalmente ordenados com a interactionabordagem.
Kota Mori
168

Pegando o exemplo desta pergunta , usando interactionpara combinar duas colunas em um novo fator:

# 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()

exemplo ggplot

Blue Magister
fonte
Isso funciona para mim:ggplot(df) + geom_violin(aes(class1, metric.var, group = interaction(class1, class2)), position = position_dodge(width=.5))
ivan866
58

por exemplo:

 qplot(round, price, data=firm, group=id, color=id, geom='line') +  
      geom_smooth(aes(group=interaction(size, type)))
Davoud Taghawi-Nejad
fonte