2012-05-08 10 views
19

Sto tentando di ricreare una figura da un seminario GGplot2 http://dl.dropbox.com/u/42707925/ggplot2/ggplot2slides.pdf.ggplot2 - jitter e position dodge together

In questo caso, sto cercando di generare l'Esempio 5, con punti di dati jitter soggetti a schivata. Quando eseguo il codice, i punti sono centrati attorno alla linea corretta, ma non hanno jitter.

Ecco il codice direttamente dalla presentazione.

set.seed(12345) 
hillest<-c(rep(1.1,100*4*3)+rnorm(100*4*3,sd=0.2), 
     rep(1.9,100*4*3)+rnorm(100*4*3,sd=0.2)) 
rep<-rep(1:100,4*3*2) 
process<-rep(rep(c("Process 1","Process 2","Process 3","Process 4"),each=100),3*2) 
memorypar<-rep(rep(c("0.1","0.2","0.3"),each=4*100),2) 
tailindex<-rep(c("1.1","1.9"),each=3*4*100) 
ex5<-data.frame(hillest=hillest,rep=rep,process=process,memorypar=memorypar, tailindex=tailindex) 
stat_sum_df <- function(fun, geom="crossbar", ...) {stat_summary(fun.data=fun, geom=geom, ...) } 

dodge <- position_dodge(width=0.9) 
p<- ggplot(ex5,aes(x=tailindex ,y=hillest,color=memorypar)) 
p<- p + facet_wrap(~process,nrow=2) + geom_jitter(position=dodge) +geom_boxplot(position=dodge) 
p 
+1

Dato che Didzis Elferts ha fornito una risposta migliore usando 'position_jitterdodge' disponibile in ggplot2 la versione 1.0.0, si dovrebbe non-accettare la mia risposta e accettare la risposta fornita da Didzis Elferts. –

risposta

27

EDIT: C'è una soluzione migliore con ggplot2 la versione 1.0.0 utilizzando position_jitterdodge. Vedi la risposta di @Didzis Elferts. Notare che dodge.width controlla la larghezza del dodging e jitter.width controlla la larghezza del jitter.

Non sono sicuro di come il codice ha prodotto il grafico nel pdf.

Ma qualcosa del genere ti avvicina a quello che cerchi?

Convertire da tailindex a memorypar in numerico; aggiungili insieme; e il risultato è la coordinata x per il livello geom_jitter. C'è probabilmente un modo più efficace per farlo. Inoltre, mi piacerebbe vedere come schivare geom_boxplot e geom_jitter, e senza alcun jitter, produrrà il grafico nel pdf.

library(ggplot2) 
dodge <- position_dodge(width = 0.9) 
ex5$memorypar2 <- as.numeric(ex5$tailindex) + 
    3 * (as.numeric(as.character(ex5$memorypar)) - 0.2) 

p <- ggplot(ex5,aes(x=tailindex , y=hillest)) + 
    scale_x_discrete() + 
    geom_jitter(aes(colour = memorypar, x = memorypar2), 
    position = position_jitter(width = .05), alpha = 0.5) + 
    geom_boxplot(aes(colour = memorypar), outlier.colour = NA, position = dodge) + 
    facet_wrap(~ process, nrow = 2) 
p 

enter image description here

+0

Grazie, mi piacerebbe che ci fosse un modo elegante all'interno di ggplot2, ma questa soluzione alternativa porta a termine tutto. Grazie ancora! – user1381239

40

In ggplot2 versione 1.0.0 c'è nuova posizione denominata position_jitterdodge() che è fatto per tale situazione. Questa posizione deve essere utilizzata all'interno dello geom_point() e ci dovrebbe essere fill= utilizzato all'interno dello aes() per mostrare con quale variabile evitare i dati. Per controllare l'ampiezza dell'argomento di schivata è necessario utilizzare dodge.width=.

ggplot(ex5,aes(x=tailindex ,y=hillest,color=memorypar,fill=memorypar)) + 
     facet_wrap(~process,nrow=2) + 
     geom_point(position=position_jitterdodge(dodge.width=0.9)) + 
     geom_boxplot(fill="white",outlier.colour = NA, 
         position = position_dodge(width=0.9)) 

enter image description here

+0

Grazie per questo post. questo è molto utile. Attualmente sto scrivendo il mio codice, che funziona bene. Ma, in qualche modo ottengo il colore nero per i valori anomali. Riuscite a indovinare quali potrebbero essere le potenziali cause? – jazzurro

+1

Il colore nero è il colore predefinito per i valori anomali. In questo codice per 'geom_boxplot()' 'outlier.colour =' è impostato su 'NA' per non mostrarli. –

+1

Ciao, ho appena trovato la soluzione. 'outlier.colour' deve essere il colore ortografato, non il colore. Sembra che l'incantesimo americano non sia favorito qui. Grazie per la tua risposta. :-) – jazzurro