2012-06-13 10 views
29

¿Hay alguna manera de establecer un ancho constante para geom_bar() en caso de que falten datos en el ejemplo de series de tiempo a continuación? Intenté configurar width en aes() sin suerte. Compare el ancho de las barras entre mayo de 2011 y junio de 2011 en el diagrama debajo del ejemplo de código.Ancho uniforme para geom_bar en caso de datos faltantes

colours <- c("#FF0000", "#33CC33", "#CCCCCC", "#FFA500", "#000000") 
iris$Month <- rep(seq(from=as.Date("2011-01-01"), to=as.Date("2011-10-01"), by="month"), 15) 

colours <- c("#FF0000", "#33CC33", "#CCCCCC", "#FFA500", "#000000") 
iris$Month <- rep(seq(from=as.Date("2011-01-01"), to=as.Date("2011-10-01"), by="month"), 15) 
d<-aggregate(iris$Sepal.Length, by=list(iris$Month, iris$Species), sum) 
d$quota<-seq(from=2000, to=60000, by=2000) 
colnames(d) <- c("Month", "Species", "Sepal.Width", "Quota") 
d$Sepal.Width<-d$Sepal.Width * 1000 
g1 <- ggplot(data=d, aes(x=Month, y=Quota, color="Quota")) + geom_line(size=1) 
g1 + geom_bar(data=d[c(-1:-5),], aes(x=Month, y=Sepal.Width, width=10, group=Species, fill=Species), stat="identity", position="dodge") + scale_fill_manual(values=colours) 

plot

+1

Existe un problema similar [aquí] (https://github.com/hadley/ggplot2/issues/235) sin embargo, se trata solo de 'stats' que no pueden manejar el parámetro de ancho. 'position = 'dodge'' parece tener la misma falla. Alguien con un poco más de conocimiento sobre 'ggplot' puede querer subir de peso, pero esto suena como un posible error. – Justin

+0

Me encontré con ese problema también. Bueno saber. Por ahora, usaré la solución publicada a continuación completando los valores con NA. – tcash21

+0

En su respuesta a https://github.com/tidyverse/ggplot2/issues/1776, Hadley dice: _ Así es como funciona el esquivar. En su lugar, puede probar facetar. Por cierto, este problema ya se ha abordado varias veces en SO: [aquí] (http://stackoverflow.com/q/12806260/3817004) y [aquí] (http: // stackoverflow .com/q/15367762/3817004), por ejemplo – Uwe

Respuesta

24

La forma más fácil es para complementar el conjunto de datos de manera que cada combinación está presente, incluso si tiene NA como su valor. Tomando un ejemplo más simple (como el suyo tiene un montón de características que no sean necesarios):

dat <- data.frame(a=rep(LETTERS[1:3],3), 
        b=rep(letters[1:3],each=3), 
        v=1:9)[-2,] 

ggplot(dat, aes(x=a, y=v, colour=b)) + 
    geom_bar(aes(fill=b), stat="identity", position="dodge") 

enter image description here

Esto muestra el comportamiento que usted está tratando de evitar: en el grupo "B", no hay un grupo "a" , entonces los barrotes son más anchos Suplemento dat con una trama de datos con todas las combinaciones de a y b:

dat.all <- rbind(dat, cbind(expand.grid(a=levels(dat$a), b=levels(dat$b)), v=NA)) 

ggplot(dat.all, aes(x=a, y=v, colour=b)) + 
    geom_bar(aes(fill=b), stat="identity", position="dodge") 

enter image description here

+0

Gracias, es una buena solución que hará el truco. – tcash21

+2

Obtengo el mismo problema cuando uso el diagrama de caja, pero este enfoque al rellenar con NA no soluciona mi problema de cajas desiguales de ancho. Las NA se acaban de caer. Relleno con 0 parece funcionar, pero eso lo convierte en una poderosa trama fea que incluye datos inapropiados. ¿Alguna sugerencia? –

+0

@ EtienneLow-Décarie No fuera de casa. Pídale una nueva pregunta (haz referencia a esta y muestra cómo no funciona para las gráficas de caja) y tal vez alguien más pueda ayudar. –

2

he tenido el mismo problema, pero estaba buscando una solución que funciona con el tubo (%>%). Usando tidyr::spread y tidyr::gather del tidyverse hace el truco. Yo uso los mismos datos que @ Brian Diggs, pero con los nombres de variables en mayúsculas para no terminar con los nombres dobles variables a la hora de transformar amplia:

library(tidyverse) 

dat <- data.frame(A = rep(LETTERS[1:3], 3), 
        B = rep(letters[1:3], each = 3), 
        V = 1:9)[-2, ] 
dat %>% 
    spread(key = B, value = V, fill = NA) %>% # turn data to wide, using fill = NA to generate missing values 
    gather(key = B, value = V, -A) %>% # go back to long, with the missings 
    ggplot(aes(x = A, y = V, fill = B)) + 
    geom_col(position = position_dodge()) 
Cuestiones relacionadas