2010-07-02 17 views
13

L'uso di position_jitter crea un jitter casuale per impedire l'overplotting dei punti dati.È possibile far oscillare due geogram ggplot allo stesso modo?

Nel seguito ho utilizzato l'esempio delle statistiche del baseball per illustrare il mio problema. Quando traccio gli stessi dati con due livelli, la stessa chiamata di jitter fa tremare le geom in modo leggermente diverso. Questo ha senso perché presumibilmente genera il jitter casuale indipendentemente nelle due chiamate, ma produce il problema che puoi vedere nel mio grafico qui sotto.

p=ggplot(baseball,aes(x=round(year,-1),y=sb,color=factor(lg))) 
p=p+stat_summary(fun.data="mean_cl_normal",position=position_jitter(width=3,height=0))+coord_cartesian(ylim=c(0,40)) 
p+stat_summary(fun.y=mean,geom="line",position=position_jitter(width=3,height=0)) 

Sebbene i punti barre di errore e la linea riferiscono ai dati stessi, sono disgiunte-le linee ei punti non si connettono.

C'è una soluzione per questo? Ho pensato che la posizione schiva potrebbe essere la risposta, ma non sembra funzionare con questo tipo di trame. In alternativa, forse c'è un modo per ottenere la chiamata mean_cl_normal per aggiungere anche le linee? alt text http://img339.imageshack.us/img339/1807/screenshot20100702at943.png

risposta

7

Questo è un punto debole nell'attuale sintassi ggplot2 - non c'è modo di aggirare il problema tranne aggiungere il jitter da soli.

Oppure si potrebbe fare qualcosa di simile:

ggplot(baseball, aes(round(year,-1) + as.numeric(factor(lg)), sb, color = factor(lg))) + 
    stat_summary(fun.data="mean_cl_normal") + 
    stat_summary(fun.y=mean,geom="line") + 
    coord_cartesian(ylim=c(0,40)) 
+2

hadley: sono stati apportati aggiornamenti a ggplot2 da quando hai risposto a questo? – gvrocha

8

Credo modo, impostando il seme essere lo stesso nei due casi:

p=ggplot(baseball,aes(x=round(year,-1),y=sb,color=factor(lg))) 
myseed = 2010 
set.seed(myseed) 
p=p+stat_summary(fun.data="mean_cl_normal", 
    position=position_jitter(width=3,height=0))+coord_cartesian(ylim=c(0,40)) 
set.seed(myseed) 
p+stat_summary(fun.y=mean,geom="line", 
      position=position_jitter(width=3,height=0)) 

Ciò assicura che il generatore di numeri casuali viene inviato al stessa posizione di partenza è stato utilizzato nel chiamata iniziale. Tuttavia non so come sia possibile estrarre gli incrementi casuali aggiunti ai valori.

+0

buona idea, ma non ha funzionato! Ho pensato che avrebbe funzionato, perché sembra che position_jitter usi il jitter del pacchetto base, che mi sarei aspettato usasse lo stesso generatore di numeri casuali seminato da set.seed. Suppongo che una soluzione generale sarebbe quella di creare la mia versione jitter di x, ma spero che ci sia un modo migliore. –

+1

Ciò non funzionerà perché il jittering viene eseguito al momento del plot, non al momento della creazione. – hadley

+0

questo ha funzionato perfettamente per me. Forse qualcosa su una nuova versione da quando hadley ha commentato (4 anni fa). Questa dovrebbe essere la nuova risposta per quanto mi riguarda. – rcorty

1

ho finito per generare una distribuzione uniforme per risolvere questo problema.

Ho dovuto affrontare lo stesso problema di fondo oggi. Creo un grafico, facendo oscillare i punti, e quindi creo un secondo grafico che essenzialmente ingrandisce una sottosezione del primo. È dissonante e distraente se i punti si muovono.

Di seguito è una demo del problema e la mia soluzione. Non uso ggplot per questa trama, ma vale lo stesso concetto. Faccio una distribuzione uniforme, un valore per ogni valore che ho bisogno di jitter. Lo aggiungo al dataframe di origine in modo che ogni volta che prendo un sottoinsieme, il valore di jitter corrisponda allo stesso valore di dati originale.

data(airquality) 
someDataset= airquality 
someDataset$color="black" 
someDataset$color[someDataset$Month==8 & someDataset$Wind==9.7]="red" 
## jitter gives different results each time it's run 
for (fZoom in c(TRUE, FALSE)){ 
    if (fZoom) myAirQuality = someDataset[someDataset $Wind >7.5 & someDataset $Wind < 11.5,] 
    else myAirQuality = someDataset[someDataset $Wind >8.5 & someDataset $Wind < 10.5,] 
    quartz("Using Jitter") 
    plot(myAirQuality $Wind ~ jitter(myAirQuality $Month), col= myAirQuality$color) 
    } 

someDataset$MonthJit=runif(nrow(someDataset), min=-0.2, max=0.2) 
for (fZoom in c(TRUE, FALSE)){ 
    if (fZoom) myAirQuality = someDataset[someDataset $Wind >7.5 & someDataset $Wind < 11.5,] 
    else myAirQuality = someDataset[someDataset $Wind >8.5 & someDataset $Wind < 10.5,] 
    quartz("Using runif") 
    plot(myAirQuality $Wind ~ c(myAirQuality $Month + myAirQuality $MonthJit), col= myAirQuality$color) 
    } 
Problemi correlati