2012-10-20 9 views
31

Vorrei mettere le linee perpendicolari alle estremità dei baffi come la funzione boxplot dà automaticamente.Mettere le estremità del baffo sul boxplot

+1

si può fare questo calcolando il quantile dove ggplot disegna le linee e disegnare il proprio 'geom_segment' o' geom_crossbar'. vedi [questa domanda] (http://stats.stackexchange.com/questions/8137/how-to-add-horizontal-lines-to-ggplot2-boxplot) – Justin

+1

C'è qualche ragione per cui questo deve essere fatto in ggplot2, e non usare 'boxplot' che fa già quello che vuoi, o è questa domanda di interesse puramente accademico ...? –

+0

@Justin Grazie, ho controllato quella domanda ma è troppo avanzato per me e continuo a ricevere errori, non so quali bit sostituire con cosa, mi dispiace:/ – user1762299

risposta

6

Potrebbe essere possibile utilizzare stat_boxplot per calcolare le estremità del baffo, ma non sono abbastanza una procedura guidata ggplot2, quindi per tale motivo utilizzo la funzione di base.

set.seed(42) 
df <- data.frame(cond = factor(rep(c("A","B"), each=500)), 
       value = c(rnorm(500,mean=1,sd=0.2),rnorm(500, mean=1.5,sd=0.1))) 


whisk <- function(df,cond_col=1,val_col=2) { 
    require(reshape2) 
    condname <- names(df)[cond_col] 
    names(df)[cond_col] <- "cond" 
    names(df)[val_col] <- "value" 
    b <- boxplot(value~cond,data=df,plot=FALSE) 
    df2 <- cbind(as.data.frame(b$stats),c("min","lq","m","uq","max")) 
    names(df2) <- c(levels(df$cond),"pos") 
    df2 <- melt(df2,id="pos",variable.name="cond") 
    df2 <- dcast(df2,cond~pos) 
    names(df2)[1] <- condname 
    df2 
} 



library(ggplot2) 

plot1 <- ggplot(df, aes(x=cond)) 
plot1 <- plot1 + geom_errorbar(aes(ymin=min,ymax=max),data=whisk(df),width = 0.5) 
plot1 <- plot1 + geom_boxplot(aes(y=value)) 
plot1 

boxplot with horizontal at whisker ends

45

Come accennato ma non eseguite dalle @Roland, è possibile utilizzare stat_boxplot per implementare questo. Il trucco chiama il numero _boxplot due volte e consente di impostare geom su errorbar per una delle chiamate.

Si noti che come R utilizza un approccio carta e penna, è consigliabile implementare le barre di errore prima di estrarre il tradizionale grafico a scatole sopra la parte superiore.

Utilizzando @ dati fittizi di Roland df

ggplot(df, aes(x=cond, y = value)) + 
stat_boxplot(geom ='errorbar') + 
geom_boxplot() # shorthand for stat_boxplot(geom='boxplot') 

enter image description here

L'aiuto per la stat_boxplot (?stat_boxplot) dettaglio i vari valori calcolati e salvati in un data.frame

+0

Grazie per aver dedicato del tempo per spiegare questo! :) – gaelgarcia

+1

come posso ridimensionare queste linee di baffatura se uso 'geom_boxplot (width = .2)'? – Produnis

+3

@ Produnis Per ridimensionare le linee dei baffi aggiungere l'argomento 'stat_params = list (width = 0.5)' all'interno della funzione: 'stat_boxplot'. Vedi il risultato nella mia risposta. – mpalanco

14

Per ridimensionare i baffi linee che possiamo utilizzare l'argomento width = 0.5 all'interno della funzione: stat_boxplot

set.seed(42) 
df <- data.frame(cond = factor(rep(c("A", "B"), each = 500)), 
       value = c(rnorm(500, mean = 1, sd = 0.2), 
          rnorm(500, mean = 1.5, sd = 0.1))) 

library(ggplot2) 
ggplot(df, aes(x = cond, y = value)) + 
     stat_boxplot(geom = "errorbar", width = 0.5) + 
     geom_boxplot() 

enter image description here

+0

Questo non sembra funzionare per me; Ricevo 'Errore: Parametri sconosciuti: stat_params'. Quale versione di R stai usando? – Will

+0

@Will ho modificato la risposta. La nuova versione di ggplo2 2.0.0 non accetta quell'argomento 'stat_params'. Ora dovrebbe funzionare. – mpalanco

+0

Ottimo, ha funzionato! Grazie! – Will

Problemi correlati