2010-08-14 18 views
12

¿Hay alguna manera de crear un diagrama de caja en R que muestre con el recuadro "N = (tamaño de muestra)"? La lógica de varwidth ajusta el ancho del cuadro en función del tamaño de muestra, pero eso no permite comparaciones entre diferentes gráficos.crea un diagrama de caja en R que etiqueta un cuadro con el tamaño de muestra (N)

Fwiw, estoy usando el comando diagrama de caja de la siguiente manera, en 'F1' es un factor:

boxplot(xvar ~ f1, data=frame, xlab="input values", horizontal=TRUE) 

Respuesta

23

Aquí hay un código ggplot2. Mostrará el tamaño de muestra en la media de la muestra, ¡haciendo que la etiqueta sea multifuncional!

En primer lugar, una función simple para fun.data

give.n <- function(x){ 
    return(c(y = mean(x), label = length(x))) 
} 

Ahora, para demostrar con los datos de diamantes

ggplot(diamonds, aes(cut, price)) + 
    geom_boxplot() + 
    stat_summary(fun.data = give.n, geom = "text") 

Puede que tenga que jugar con el tamaño del texto para que se vea bien, pero ahora tiene una etiqueta para el tamaño de muestra que también da una idea de la inclinación.

+0

Funciona muy bien, y se ve hermoso. ¡Gracias! –

+3

¿Qué sucede si estoy haciendo ggploting con 'geom_boxplot (aes (fill = factor (f2)))' donde f2 es un segundo factor? ¿Hay alguna variación en stat_summary que permita que los 'subcajas' reciban su propia N ? –

+2

Código de ejemplo para ahorrar espacio: 'ggplot (mpg, aes (fabricante, hwy, fill = factor (año))) + geom_boxplot() + stat_summary (fun.data = give.n, geom =" text ", position = position_dodge (alto = 0, ancho = 0.75), tamaño = 3) 'Puede que tenga que ajustar manualmente el valor pasado a' ancho' en 'position_dodge()' – JoFrhwld

9

Usted puede utilizar el parámetro names para escribir el n junto a cada nombre de los factores.

Si no desea calcular el n mismo podría utilizar este pequeño truco:

# Do the boxplot but do not show it 
b <- boxplot(xvar ~ f1, data=frame, plot=0) 
# Now b$n holds the counts for each factor, we're going to write them in names 
boxplot(xvar ~ f1, data=frame, xlab="input values", names=paste(b$names, "(n=", b$n, ")")) 
+0

¡Basura resbaladiza! Gracias por el truco. –

+0

¿Cómo puedo poner el número n arriba de la barra horizontal del diagrama de cajas para cada barra? – Dinesh

+0

@Dinesh: use la función 'text'. Puede encontrar el valor de la mediana mirando el parámetro 'stats'. Por ejemplo: 'text (seq_along (f1), b $ stats [3,], b $ n)' – nico

0

El paquete gplots proporciona boxplot.n, que según la documentación produce un diagrama de caja anotado con el número de observaciones.

4

Para obtener el n en la parte superior de la barra, se puede usar text con los stat detalles proporcionados por diagrama de caja de la siguiente manera

b <- boxplot(xvar ~ f1, data=frame, plot=0) 
text(1:length(b$n), b$stats[5,]+1, paste("n=", b$n)) 

El campo de las estadísticas de b es una matriz, cada columna contiene el extremo de el bigote inferior, la bisagra inferior, la mediana, la bisagra superior y el extremo del bigote superior para un grupo/parcela.

+1

Gracias, Funciona de maravilla –

0

Descubrí una solución con el paquete Envstats. Este paquete necesita ser descargado, cargado y activado usando:

library(Envstats) 

El Stripchart (diferente de Stripchart) se le añade a la tabla de algunos valores, como los valores de n. Primero tracé mi diagrama de caja. Luego usé add = T en stripChart. Obviamente, muchas cosas estaban ocultas en el código stripChart para que no aparezcan en el diagrama de caja. Aquí está el código que utilicé para que stripChart oculte la mayoría de los artículos.

Boxplot con Stripchart integrada para mostrar n valores:

stripChart(data.frame(T0_G1,T24h_G1,T96h_G1,T7d_G1,T11d_G1,T15d_G1,T30d_G1), show.ci=F,axes=F,points.cex=0,n.text.line=1.6,n.text.cex=0.7,add=T,location.scale.text="none") 

Así diagrama de caja

boxplot(data.frame(T0_G1,T24h_G1,T96h_G1,T7d_G1,T11d_G1,T15d_G1,T30d_G1),main="All Rheometry Tests on Egg Plasma at All Time Points at 0.1Hz,0.1% and 37 Set 1,2,3", names=c("0h","24h","96h","7d ", "11d", "15d", "30d"),boxwex=0.6,par(mar=c(8,4,4,2))) 

Entonces Stripchart

stripChart(data.frame(T0_G1,T24h_G1,T96h_G1,T7d_G1,T11d_G1,T15d_G1,T30d_G1), show.ci=F,axes=F,points.cex=0,n.text.line=1.6,n.text.cex=0.7,add=T,location.scale.text="none") 

Siempre se puede ajustar el alto de los números (n valores) para que quepan donde quieras.

Cuestiones relacionadas