2013-09-26 11 views
8

Sono diventato molto affezionato grafici a scatole in cui jittered punti sono overlain sopra i grafici a scatole per rappresentare i dati effettivi, come di seguito:È possibile combinare position_jitter con position_dodge?

set.seed(7) 
l1 <- gl(3, 1, length=102, labels=letters[1:3]) 
l2 <- gl(2, 51, length=102, labels=LETTERS[1:2]) # Will use this later 
y <- runif(102) 
d <- data.frame(l1, l2, y) 

ggplot(d, aes(x=l1, y=y)) + 
    geom_point(position=position_jitter(width=0.2), alpha=0.5) + 
    geom_boxplot(fill=NA) 

enter image description here

(Questi sono particolarmente utili quando ci sono molto diversi numeri di punti dati in ciascuna casella.)

Mi piacerebbe utilizzare questa tecnica quando sto anche (implicitamente) utilizzando position_dodge per separare i grafici a scatole da una seconda variabile, ad es.

ggplot(d, aes(x=l1, y=y, colour=l2)) + 
    geom_point(position=position_jitter(width=0.2), alpha=0.5) + 
    geom_boxplot(fill=NA) 

enter image description here

Tuttavia, non si può capire come schivare i punti dal colour variabile (qui, l2) e li tremare.

+1

avete già ricevuto alcune risposte belle, quindi questo commento è più di un piccolo sfondo. Quando ho faticato un problema simile da qualche tempo, sono inciampato in [questa presentazione] (http://dl.dropbox.com/u/42707925/ggplot2/ggplot2slides.pdf). Controlla l'esempio a pag. 19-20. La combinazione di 'geom_jitter' e' dodge' apparentemente funzionava in una versione precedente di 'ggplot'. Non più ... – Henrik

+1

Mi piace molto anche mostrare i punti reali insieme ai miei boxplot, ma tendo ad usare i dot plot. Evitano il problema di nervosismo e possono dare un buon senso della forma dei dati in ogni gruppo. In questo caso, comunque, devi ancora elaborare il 'dodge' appropriato in' geom_dotplot'. – aosmith

risposta

6

Ecco un approccio che esegue manualmente il jitter e lo schivare.

# a plot with no dodging or jittering of the points 
dp <- ggplot(d, aes(x=l1, y=y, colour=l2)) + 
    geom_point(alpha=0.5) + 
    geom_boxplot(fill=NA) 

# build the plot for rendering 
foo <- ggplot_build(dp) 
# now replace the 'x' values in the data for layer 1 (unjittered and un-dodged points) 
# with the appropriately dodged and jittered points 
foo$data[[1]][['x']] <- jitter(foo$data[[2]][['x']][foo$data[[1]][['group']]],amount = 0.2) 
# now draw the plot (need to explicitly load grid package) 
library(grid) 
grid.draw(ggplot_gtable(foo)) 
# note the following works without explicitly loading grid 
plot(ggplot_gtable(foo)) 

enter image description here

+1

Mi è piaciuta molto la parte 'foo $ data [[2]] [['x']] [pippo $ data [[1]] [['gruppo']]] parte. Stavo per iniziare una grande operazione di unione per gruppo. +1! – Henrik

4

Non penso che ti piacerà, ma non ho mai trovato un modo per aggirare questo tranne per produrre i tuoi valori x per i punti. In questo caso:

d$l1.num <- as.numeric(d$l1) 
d$l2.num <- (as.numeric(d$l2)/3)-(1/3 + 1/6) 
d$x <- d$l1.num + d$l2.num 

ggplot(d, aes(l1, y, colour = l2)) + geom_boxplot(fill = NA) + 
    geom_point(aes(x = x), position = position_jitter(width = 0.15), alpha = 0.5) + theme_bw() 

enter image description here

E 'certamente una lunga strada da ideale, ma diventa routine abbastanza rapidamente. Se qualcuno ha una soluzione alternativa, sarei molto felice!

0

Un'altra opzione sarebbe quella di utilizzare sfaccettature:

set.seed(7) 
    l1 <- gl(3, 1, length=102, labels=letters[1:3]) 
    l2 <- gl(2, 51, length=102, labels=LETTERS[1:2]) # Will use this later 
    y <- runif(102) 
    d <- data.frame(l1, l2, y) 

    ggplot(d, aes(x=l1, y=y, colour=l2)) + 
    geom_point(position=position_jitter(width=0.2), alpha=0.5) + 
    geom_boxplot(fill=NA) + 
    facet_grid(.~l2) + 
    theme_bw() 

Siamo spiacenti, non disponiamo abbastanza punti per inviare il grafico risultante.

3

Il nuovo position_jitterdodge() funziona per questo. Tuttavia, esso richiede il riempimento estetica per dirgli come punti di gruppo, in modo da avere per specificare un riempimento manuale per ottenere scatole incolore:

ggplot(d, aes(x=l1, y=y, colour=l2, fill=l2)) + 
    geom_point(position=position_jitterdodge(width=0.2), alpha=0.5) + 
    geom_boxplot() + scale_fill_manual(values=rep('white', length(unique(l2)))) 
Problemi correlati