2012-04-26 6 views
27

Estoy haciendo una barra de barras esquivada en ggplot2 y una agrupación tiene un conteo de cero que quiero mostrar. Recordé haber visto esto en HERE hace un tiempo y pensé que el scale_x_discrete(drop=F) funcionaría. No parece funcionar con barras esquivas. ¿Cómo puedo hacer que se muestren los recuentos cero?No soltar cuenta cero: barra de barras esquivada

Por ejemplo, (código a continuación) en el siguiente diagrama, type8 ~ group4 no tiene ejemplos. Me gustaría que la trama muestre el espacio vacío para el conteo cero en lugar de eliminar la barra. ¿Cómo puedo hacer esto?

enter image description here

mtcars2 <- data.frame(type=factor(mtcars$cyl), 
    group=factor(mtcars$gear)) 

m2 <- ggplot(mtcars2, aes(x=type , fill=group)) 
p2 <- m2 + geom_bar(colour="black", position="dodge") + 
     scale_x_discrete(drop=F) 
p2 

Respuesta

10

La única forma que conozco es comprobar la validez de calcular los conteos y añadir una fila ficticia:

dat <- rbind(ddply(mtcars2,.(type,group),summarise,count = length(group)),c(8,4,NA)) 

ggplot(dat,aes(x = type,y = count,fill = group)) + 
    geom_bar(colour = "black",position = "dodge",stat = "identity") 

enter image description here

pensé que el uso de stat_bin(drop = FALSE,geom = "bar",...) lugar sería trabajo, pero aparentemente no es así.

+0

tan fácil como esperaba, pero no pude encontrar una respuesta apropiada en mi búsqueda así que debería haber imaginado que tomaría algunos retoques. Gracias Joran. Funcionó muy bien +1 –

+0

@TylerRinker Honestamente, me siento como 'stat_bin (drop = FALSE, geom =" bar ", position =" dodge ", ...)' _debe hacer esto; al menos, la documentación sugiere fuertemente que lo haría. Estaría muy curioso de saber de personas más conocedoras en la lista de correo por qué no lo hace. – joran

+0

Estoy trabajando en un proyecto en este momento pero lo incluiré en la lista más tarde e informaré aquí. –

15

Actualizadogeom_bar() necesidades stat = "identity"

Por lo que vale la pena: La tabla de recuentos, DAT, anterior contiene NA. A veces, es útil tener un 0 explícito en su lugar; por ejemplo, si el siguiente paso es poner conteos por encima de las barras. El siguiente código hace precisamente eso, aunque probablemente no sea más simple que el de Joran. Implica dos pasos: obtener una tabla de contingencia de conteos usando dcast, luego derrita la tabla usando melt, seguido por ggplot() como de costumbre.

library(ggplot2) 
library(reshape2) 
mtcars2 = data.frame(type=factor(mtcars$cyl), group=factor(mtcars$gear)) 

dat = dcast(mtcars2, type ~ group, fun.aggregate = length) 
dat.melt = melt(dat, id.vars = "type", measure.vars = c("3", "4", "5")) 
dat.melt 

ggplot(dat.melt, aes(x = type,y = value, fill = variable)) + 
    geom_bar(stat = "identity", colour = "black", position = position_dodge(width = .8), width = 0.7) + 
    ylim(0, 14) + 
    geom_text(aes(label = value), position = position_dodge(width = .8), vjust = -0.5) 

enter image description here

+0

Esto terminó siendo un poco mejor. Ya había completado el gráfico y me llevó algo de basura, pero esto resolvió esos problemas. Buena respuesta. +1 –

7

hice esta misma pregunta, pero yo sólo quería utilizar data.table, ya que es una solución más rápida para los conjuntos de datos mucho más grandes. Incluí notas sobre los datos para que los que tienen menos experiencia y quieren entender por qué hice lo que hice puedan hacerlo fácilmente. Aquí es cómo manipuló el conjunto de datos mtcars:

library(data.table) 
library(scales) 
library(ggplot2) 

mtcars <- data.table(mtcars) 
mtcars$Cylinders <- as.factor(mtcars$cyl) # Creates new column with data from cyl called Cylinders as a factor. This allows ggplot2 to automatically use the name "Cylinders" and recognize that it's a factor 
mtcars$Gears <- as.factor(mtcars$gear) # Just like above, but with gears to Gears 
setkey(mtcars, Cylinders, Gears) # Set key for 2 different columns 
mtcars <- mtcars[CJ(unique(Cylinders), unique(Gears)), .N, allow.cartesian = TRUE] # Uses CJ to create a completed list of all unique combinations of Cylinders and Gears. Then counts how many of each combination there are and reports it in a column called "N" 

Y aquí es la llamada que produjo la gráfica

ggplot(mtcars, aes(x=Cylinders, y = N, fill = Gears)) + 
       geom_bar(position="dodge", stat="identity") + 
       ylab("Count") + theme(legend.position="top") + 
       scale_x_discrete(drop = FALSE) 

y produce este gráfico:

Cylinder Graph

Por otra parte, si hay datos continuos, como el del conjunto de datos diamonds (gracias a mnel):

library(data.table) 
library(scales) 
library(ggplot2) 

diamonds <- data.table(diamonds) # I modified the diamonds data set in order to create gaps for illustrative purposes 
setkey(diamonds, color, cut) 
diamonds[J("E",c("Fair","Good")), carat := 0] 
diamonds[J("G",c("Premium","Good","Fair")), carat := 0] 
diamonds[J("J",c("Very Good","Fair")), carat := 0] 
diamonds <- diamonds[carat != 0] 

Luego, usar CJ funcionaría también.

data <- data.table(diamonds)[,list(mean_carat = mean(carat)), keyby = c('cut', 'color')] # This step defines our data set as the combinations of cut and color that exist and their means. However, the problem with this is that it doesn't have all combinations possible 
data <- data[CJ(unique(cut),unique(color))] # This functions exactly the same way as it did in the discrete example. It creates a complete list of all possible unique combinations of cut and color 
ggplot(data, aes(color, mean_carat, fill=cut)) + 
      geom_bar(stat = "identity", position = "dodge") + 
      ylab("Mean Carat") + xlab("Color") 

darnos este gráfico:

Diamonds Fixed

0

Puede explotar la función de la función table(), que calcula el número de ocurrencias de un factor de todos sus niveles

# load plyr package to use ddply 
library(plyr) 

# compute the counts using ddply, including zero occurrences for some factor levels 
df <- ddply(mtcars2, .(group), summarise, 
types = as.numeric(names(table(type))), 
counts = as.numeric(table(type))) 

# plot the results 
ggplot(df, aes(x = types, y = counts, fill = group)) + 
geom_bar(stat='identity',colour="black", position="dodge") 

Results graph

3

Así es cómo puede hacerlo sin hacer tablas de resumen primero.
No funcionó en mi versioin de CRAN (2.2.1) pero en la última versión de desarrollo de ggplot (2.2.1.900) no tuve problemas.

ggplot(mtcars, aes(factor(cyl), fill = factor(vs))) + 
    geom_bar(position = position_dodge(preserve = "single")) 

http://ggplot2.tidyverse.org/reference/position_dodge.html

No
Cuestiones relacionadas