instalar - No dejes caer la cuenta cero: barra de barras esquivada
ggplot2 descargar (6)
Así es cómo puede hacerlo sin hacer tablas de resumen primero.
No funcionó en mi versión 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"))
Estoy haciendo una barra de barras esquivada en ggplot2 y una agrupación tiene un recuento de cero que quiero mostrar. Recordé haber visto esto en HERE un tiempo y pensé que scale_x_discrete(drop=F)
funcionaría. No parece funcionar con barras esquivas. ¿Cómo puedo hacer que se muestren los recuentos cero?
Por ejemplo, (código a continuación) en el siguiente diagrama, escriba 8 ~ 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?
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
Hice esta misma pregunta, pero solo quería usar data.table
, ya que es una solución más rápida para 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. Así es como mtcars
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í está la llamada que produjo el gráfico
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:
Además, si hay datos continuos, como los del conjunto de datos de 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]
Entonces, usar CJ
también funcionaría.
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")
Dándonos este gráfico:
La única forma que conozco es precomputar los recuentos y agregar 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")
Pensé que usar stat_bin(drop = FALSE,geom = "bar",...)
lugar funcionaría, pero aparentemente no es así.
Puede aprovechar la función de la table()
, que calcula el número de apariciones de un factor para 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")
Usa count
y complete
desde dplyr
para hacer esto.
library(tidyverse)
mtcars %>%
mutate(
type = as.factor(cyl),
group = as.factor(gear)
) %>%
count(type, group) %>%
complete(type, group, fill = list(n = 0)) %>%
ggplot(aes(x = type, y = n, fill = group)) +
geom_bar(colour = "black", position = "dodge", stat = "identity")
Actualizado geom_bar()
necesita stat = "identity"
Por lo que vale: La tabla de conteos, dat, arriba 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 dcast
de recuentos usando dcast
, luego fundir la tabla con melt
, seguido de 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)