ggplot2 mantiene los niveles no utilizados barplot

Quiero trazar los niveles no utilizados (es decir, los niveles donde el recuento es 0) en mi diagtwig de barras, sin embargo, los niveles no utilizados se descartan y no puedo entender cómo mantenerlos

df <- data.frame(type=c("A", "A", "A", "B", "B"), group=rep("group1", 5)) df$type <- factor(df$type, levels=c("A","B", "C")) ggplot(df, aes(x=group, fill=type)) + geom_bar() 

En el ejemplo anterior, quiero ver una representación de C con un recuento de 0, pero está completamente ausente …

Gracias por cualquier ayuda Ulrik

Editar:

Esto hace lo que quiero

 df <- data.frame(type=c("A", "A", "A", "B", "B"), group=rep("group1", 5)) df1 <- data.frame(type=c("A", "A", "A", "B", "B", "A", "A", "C", "B", "B"), group=c(rep("group1", 5),rep("group2", 5))) df$type <- factor(df$type, levels=c("A","B", "C")) df1$type <- factor(df1$type, levels=c("A","B", "C")) df <- data.frame(table(df)) df1 <- data.frame(table(df1)) ggplot(df, aes(x=group, y=Freq, fill=type)) + geom_bar(position="dodge") ggplot(df1, aes(x=group, y=Freq, fill=type)) + geom_bar(position="dodge") 

Supongo que la solución es calcular las frecuencias usando la tabla () y luego trazar

Debe establecer drop = FALSE en ambas escalas (fill y x) de esta manera:

 library(ggplot2) df <- data.frame(type=c("A", "A", "A", "B", "B"), group=rep("group1", 5)) df1 <- data.frame(type=c("A", "A", "A", "B", "B", "A", "A", "C", "B", "B"), group=c(rep("group1", 5),rep("group2", 5))) df$type <- factor(df$type, levels=c("A","B", "C")) df1$type <- factor(df1$type, levels=c("A","B", "C")) plt <- ggplot(df, aes(x=type, fill=type)) + geom_bar(position='dodge') + scale_fill_discrete(drop=FALSE) + scale_x_discrete(drop=FALSE) plt1 <- ggplot(df1, aes(x=type, fill=type)) + geom_bar(position='dodge') + scale_fill_discrete(drop=FALSE) + scale_x_discrete(drop=FALSE) 

Editar:

Estoy bastante seguro de que esto funciona. Olvidé cambiar x para escribir en lugar de grupo y la posición = 'esquivar'! Solo pega y prueba. El stat_bin trata con contenedores con cero recuentos. Verifica los documentos .

¿Hace esto lo que quieres?

 ggplot(df, aes(x=type)) + geom_bar() + scale_x_discrete(drop=FALSE) 

enter image description here

Bajar niveles no funciona. Bajando niveles en el primer ejemplo

 library(ggplot2) df <- data.frame(type=c("A", "A", "A", "B", "B"), group=rep("group1", 5)) df$type <- factor(df$type, levels=c("A","B", "C")) ggplot(df, aes(x=group, fill=type)) + geom_bar(position="dodge") + scale_x_discrete(drop=FALSE) + scale_fill_discrete(drop=FALSE) 

resultados en esta ttwig:

enter image description here

La solución está en el segundo ejemplo donde las frecuencias se calculan manualmente:

 df <- data.frame(type=c("A", "A", "A", "B", "B"), group=rep("group1", 5)) df1 <- data.frame(type=c("A", "A", "A", "B", "B", "A", "A", "C", "B", "B"), group=c(rep("group1", 5),rep("group2", 5))) df$type <- factor(df$type, levels=c("A","B", "C")) df1$type <- factor(df1$type, levels=c("A","B", "C")) df <- data.frame(table(df)) df1 <- data.frame(table(df1)) df$plot = "A" df1$plot = "B" df <- rbind(df, df1) ggplot(df, aes(x=group, y=Freq, fill=type)) + geom_bar(position="dodge", stat="identity") + facet_wrap( ~ plot, scales="free") 

Resultados en esto:

enter image description here

El último es el más informativo ya que el espacio está ocupado por las categorías allí count = 0

también puedes usar “scale_fill_color” por ejemplo:

 plt <- ggplot(df, aes(x=type, fill=type)) + geom_bar(position='dodge') + scale_x_discrete(drop=FALSE)+ scale_fill_manual( values = c( "#ff6666", "#cc9900", "#cc9900", ),drop=FALSE)