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.

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.


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


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)))
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.