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

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 .


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í


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


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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.