Ancho consistente para geom_bar en caso de que falten datos

Resuelto tcash21 asked hace 54 años • 3 respuestas

¿Hay alguna manera de establecer un ancho constante geom_bar()en caso de que falten datos en el siguiente ejemplo de serie temporal? Intenté instalarme widthsin aes()suerte. Compare el ancho de las barras de mayo del 11 con el del 11 de junio en el gráfico debajo del ejemplo de código.

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)

trama

tcash21 avatar Jan 01 '70 08:01 tcash21
Aceptado

Algunas opciones nuevas position_dodge()y las nuevas position_dodge2()introducidas en ggplot2 3.0.0 pueden ayudar.

Puedes usar preserve = "single"in position_dodge()para basar los anchos de un solo elemento, de modo que los anchos de todas las barras sean los mismos.

ggplot(data = d, aes(x = Month, y = Quota, color = "Quota")) + 
     geom_line(size = 1) + 
     geom_col(data = d[c(-1:-5),], aes(y = Sepal.Width, fill = Species), 
              position = position_dodge(preserve = "single") ) + 
     scale_fill_manual(values = colours)

El uso position_dodge2()cambia la forma en que se centran las cosas, centrando cada conjunto de barras en cada ubicación del eje x. Tiene algunos paddingincorporados, así que utilícelos padding = 0para eliminarlos.

ggplot(data = d, aes(x = Month, y = Quota, color = "Quota")) + 
     geom_line(size = 1) + 
     geom_col(data = d[c(-1:-5),], aes(y = Sepal.Width, fill = Species), 
              position = position_dodge2(preserve = "single", padding = 0) ) + 
     scale_fill_manual(values = colours)

aosmith avatar Aug 07 '2018 15:08 aosmith

La forma más sencilla es complementar su conjunto de datos para que todas las combinaciones estén presentes, incluso si tienen NAun valor. Tomando un ejemplo más simple (ya que el suyo tiene muchas características innecesarias):

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")

ingrese la descripción de la imagen aquí

Esto muestra el comportamiento que intentas evitar: en el grupo "B", no existe el grupo "a", por lo que las barras son más anchas. Complemente datcon un marco de datos con todas las combinaciones de ay 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")  

ingrese la descripción de la imagen aquí

Brian Diggs avatar Jun 13 '2012 19:06 Brian Diggs