2012-09-28 21 views
9

Estoy creando diagramas de caja usando ggplot y me gustaría representar el tamaño de muestra que contribuye a cada cuadro. En la función base plot existe la opción varwidth. ¿Tiene un equivalente en ggplot?¿Hay un equivalente en ggplot a la opción varwidth en la gráfica?

Por ejemplo, en la parcela de base

data <- data.frame(rbind(cbind(rnorm(700, 0,10), rep("1",700)), 
         cbind(rnorm(50, 0,10), rep("2",50)))) 
data[ ,1] <- as.numeric(as.character(data[,1])) 
plot(data[,1] ~ as.factor(data[,2]), varwidth = TRUE) 

enter image description here

+3

me parece recordar a alguien que preguntaba esto en la lista de correo hace bastante tiempo y les dijeron que w como no es posible No veo nada que haga referencia a esto en los problemas de github, por lo que podría no ser posible. (Una alternativa es usar colores de relleno). – joran

+0

No es posible con ggplot, si solo está generando un gráfico, posiblemente podría modificarlo en Illustrator o algo similar – by0

+1

@joran He aprendido de la amarga experiencia que llamar cualquier cosa en R es imposible sirve como cebo para que alguien te pruebe mal. En este caso, migthy @ kohske proporcionó una solución alternativa. – Andrie

Respuesta

7

No es elegante, pero se puede hacer eso por:

data <- data.frame(rbind(cbind(rnorm(700, 0,10), rep("1",700)), 
                         cbind(rnorm(50, 0,10), rep("2",50)))) 
data[ ,1] <- as.numeric(as.character(data[,1])) 
w <- sqrt(table(data$X2)/nrow(data)) 
ggplot(NULL, aes(factor(X2), X1)) + 
    geom_boxplot(width = w[1], data = subset(data, X2 == 1)) + 
    geom_boxplot(width = w[2], data = subset(data, X2 == 2)) 

enter image description here

Si tiene varios niveles para X2 , entonces puedes prescindir de h ardcoding todos los niveles:

ggplot(NULL, aes(factor(X2), X1)) + 
    llply(unique(data$X2), function(i) geom_boxplot(width = w[i], data = subset(data, X2 == i))) 

También puedes publicar una solicitud de función: https://github.com/hadley/ggplot2/issues

2

Las versiones actuales de ggplot2 (V 2.1.0) contiene ahora una opción varwidth:

data <- data.frame(rbind(cbind(rnorm(700, 0,10), rep("1",700)), 
        cbind(rnorm(50, 0,10), rep("2",50)))) 
data$X1 <- as.numeric(as.character(data$X1)) 
ggplot(data = data, aes(x = X2, y = X1)) + 
    geom_boxplot(varwidth = TRUE) 

Example output plot from ggplot2

Cuestiones relacionadas