grouper par deux colonnes dans ggplot2

90

Est-il possible de grouper par deux colonnes? Ainsi, le produit croisé est dessiné pargeom_point() et geom_smooth()?

Comme exemple:

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

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

Tels que les points 6et 12partager un groupe, mais pas avec 3.

Reactormonk
la source

Réponses:

32

Pourquoi ne pas simplement pasteutiliser ces deux colonnes ensemble et utiliser cette variable comme groupes?

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

Une manière un peu plus formelle de faire ceci serait d'utiliser la fonction interaction.

joran
la source
27
Je pense que vous ne devriez pas modifier votre data.framepour un complot. Le plotdevrait tracer votre df et non le contraire.
ClementWalter
3
Je suis d'accord, la réponse de Blue Magister est meilleure.
Jeston
6
@clemlaflemme Je pense que la réponse de BlueMagister est bonne, même si je pense que la distinction dans ce cas est assez mineure. Mais la position générale selon laquelle il ne faut pas modifier votre bloc de données pour un tracé est curieuse étant donné votre choix d'utiliser ggplot2 , dont la conception entière est fondée sur la structuration explicite de vos données pour travailler avec la sémantique de ggplot.
joran
Un inconvénient de pasteest que lorsque l'entrée est un facteur, il rejette les niveaux, où interactionpréserve l'ordre des facteurs d'origine. Cela signifie que les groupes sont plus naturellement ordonnés avec l' interactionapproche.
Kota Mori
169

En prenant l'exemple de cette question , en utilisant interactionpour combiner deux colonnes en un nouveau facteur:

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

exemple de ggplot

Magister bleu
la source
Cela fonctionne pour moi:ggplot(df) + geom_violin(aes(class1, metric.var, group = interaction(class1, class2)), position = position_dodge(width=.5))
ivan866
58

par exemple:

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