2012-04-01 14 views
56

È possibile raggruppare per due colonne? Quindi il prodotto cross è disegnato per geom_point() e geom_smooth()?gruppo per due colonne in ggplot2

A titolo di esempio:

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

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

tale che i punti 6 e 12 condividono un gruppo, ma non con 3.

risposta

23

Perché non solo paste queste due colonne insieme e utilizzare quella variabile come gruppi?

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

Un modo un po 'più formale per farlo sarebbe quello di utilizzare la funzione interaction.

+11

Penso che non dovrebbe modificare la 'data.frame' ai fini di una trama. La 'trama' dovrebbe tracciare il tuo df e non il contrario. – clemlaflemme

+1

Sono d'accordo, la risposta di Blue Magister è migliore. – JestonBlu

+2

@clemlaflemme Penso che la risposta di BlueMagister sia soddisfacente, anche se penso che la distinzione in questo caso sia piuttosto piccola. Ma la posizione generale secondo cui non si dovrebbe modificare il frame dei dati per una trama è una scelta curiosa, data la scelta di utilizzare ** ggplot2 **, l'intero disegno del quale si basa sulla strutturazione esplicita dei dati per lavorare con la semantica di ggplot. – joran

52

ad esempio:

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

Prendendo l'esempio da this question, utilizzando interaction per combinare due colonne in un nuovo fattore:

# 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

Problemi correlati