Ancho consistente para geom_bar en caso de que falten datos
¿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 width
sin 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)
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 padding
incorporados, así que utilícelos padding = 0
para 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)
La forma más sencilla es complementar su conjunto de datos para que todas las combinaciones estén presentes, incluso si tienen NA
un 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")
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 dat
con un marco 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")