2009-09-27 11 views
6

Diciamo che avete il seguente set di dati:Aggiunta di statistiche di riepilogo (o anche punti di dati grezzi) per i grafici a scatole di posizione schivato

trt <- ifelse(runif(100)<0.5,"drug","placebo") 
inj.site <- ifelse(runif(100)<0.5,"ankle","wrist") 
relief <- 20 + 0.5*(inj.site=="ankle") + 0.5*(trt=="drug") + rnorm(100) 
to.analyze <- data.frame(trt,inj.site,relief) 

Ora, l'idea è di fare un grafico a scatole con il sito infortunio sul ascisse e scatole per trattamento side-by-side:

bplot <- ggplot(to.analyze,aes(inj.site,relief,fill=trt)) + geom_boxplot(position="dodge") 

Abbastanza facile. Ma ora voglio aggiungere punti dati grezzi in cima alle scatole. Se non avessi scatole con position="dodge", questo sarebbe facile:

bplot + geom_point(aes(colour=trt)) 

Tuttavia, questo attira i punti tra le scatole, e l'aggiunta di un position="dodge" a questa geometria non sembra funzionare. Come aggiusto questo in modo che i punti siano disegnati sopra le scatole?

Bonus: stessa situazione con l'utilizzo di stat_summary(blah,y.fun=mean,shape="+") per sovrascrivere il mezzo, che ha lo stesso problema.

+0

sollievo <- 20 + 0,5 * (inj.site == caviglia) + 0,5 * (TRT == "droga") + RNorm (100) dovrebbe essere: sollievo <- 20 + 0.5 * (inj.site == "caviglia") + 0.5 * (trt == "farmaco") + rnorm (100) – Paolo

+0

e, sì, corretto. –

risposta

3

Hadley senza dubbio mi corregga se sbaglio qui ...

Ecco la sintassi naturale:

bplot + geom_point(aes(colour=trt), position=position_dodge(width=.5)) 

(posizione = "schivare" farà la stessa cosa, senza il parametro.)

Quando lo traccia, ottengo qualcosa che assomiglia ad un position_jitter(), che è presumibilmente quello che ottieni anche tu.

Curioso, sono andato a cercare nella fonte, dove ho trovato la funzione pos_dodge(). (Tipo pos_dodge ad una richiesta R vederla ...) Ecco la fine di esso:

within(df, { 
    xmin <- xmin + width/n * (seq_len(n) - 1) - diff * (n - 1)/(2 * n) 
    xmax <- xmin + d_width/n 
    x <- (xmin + xmax)/2 
}) 

n è il numero di righe di trama di dati. Quindi sembra che stia schivando i singoli punti per una frazione indicizzata dalla riga! Quindi il primo punto è schivato larghezza/n, il secondo è schivato 2 * larghezza/n, e l'ultimo è schivato n * larghezza/n.

Questo ovviamente non è quello che si dire, anche se è quello che si detto. Potresti essere bloccato a ricreare manualmente il boxplot schivato, o usando una visualizzazione diversa, come la sfaccettatura forse?

ggplot(to.analyze,aes(inj.site,relief)) + geom_boxplot() + facet_wrap(~ trt) 
+0

In sfaccettatura, funziona perfettamente. Tuttavia, per visualizzare le ragioni, preferirei piuttosto aver eluso la posizione, anche se potrei provare a sfiorare su inj.site? –

Problemi correlati