ggplot2 mantener gráficos de barras de niveles no utilizados

101

Quiero trazar niveles no utilizados (es decir, niveles donde el recuento es 0) en mi diagrama de barras, sin embargo, los niveles no utilizados se eliminan y no puedo averiguar 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 C trazado 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

Ulrik
fuente

Respuestas:

68

Debe establecer drop = FALSE en ambas escalas (relleno yx) 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 group y la posición = 'esquivar'! Solo pega y prueba. Stat_bin trata con bins con cero recuentos. Consulte los documentos .

Jarretinha
fuente
Creo que esta debería ser la respuesta a la pregunta del PO. La respuesta también se ocupa del nivel de caída en la leyenda.
SavedByJESUS
cuando hago esto, cambia los colores de mis barras. ¿Existe alguna forma de conservar los colores originales?
morgan121
71

¿Hace esto lo que quieres?

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

ingrese la descripción de la imagen aquí

smillig
fuente
9

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 trama:

ingrese la descripción de la imagen aquí

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:

ingrese la descripción de la imagen aquí

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

Ulrik
fuente
1

también puede utilizar "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)
Yan Zhang
fuente