superponer - porcentaje en y lab en un diagrama de barras ggplot facetado?
superponer graficas en r ggplot (6)
Aquí hay un método dentro de ggplot
, usando ..count..
y ..PANEL..
:
ggplot(test, aes(test2)) +
geom_bar(aes(y = (..count..)/tapply(..count..,..PANEL..,sum)[..PANEL..])) +
facet_grid(~test1)
Como esto se calcula sobre la marcha, debe ser robusto a los cambios en los parámetros de la gráfica.
haciendo facetas en ggplot A menudo me gustaría usar el porcentaje en lugar de conteos.
p.ej
test1 <- sample(letters[1:2], 100, replace=T)
test2 <- sample(letters[3:8], 100, replace=T)
test <- data.frame(cbind(test1,test2))
ggplot(test, aes(test2))+geom_bar()+facet_grid(~test1)
Esto es muy fácil, pero si N es diferente en la faceta A en comparación con la faceta B, sería mejor, creo, comparar porcentajes, de modo que cada faceta sume al 100%.
¿Cómo lograrías esto?
Espero que mi pregunta tenga sentido.
Sinceramente.
Aquí hay una solución que debería ayudarte a avanzar en la dirección correcta. Tengo curiosidad por ver si hay formas más eficientes de hacer esto, ya que esto parece un poco hacky y complicado. Podemos usar el argumento construido en ..density..
para la y aesthetic
, pero los factores no funcionan allí. Entonces también necesitamos usar scale_x_discrete
para etiquetar apropiadamente el eje una vez que convertimos test2
en un objeto numérico.
ggplot(data = test, aes(x = as.numeric(test2)))+
geom_bar(aes(y = ..density..), binwidth = .5)+
scale_x_discrete(limits = sort(unique(test$test2))) +
facet_grid(~test1) + xlab("Test 2") + ylab("Density")
Pero dale un giro y dime lo que piensas.
Además, puede acortar la creación de datos de prueba de esa manera, lo que evita los objetos adicionales en su entorno y los tiene que unir:
test <- data.frame(
test1 = sample(letters[1:2], 100, replace = TRUE),
test2 = sample(letters[3:8], 100, replace = TRUE)
)
Gracias por compartir el "consejo" del PANEL en el método ggplot
.
Para información: puede generar porcentajes en y lab
, en el mismo gráfico de barras, usando count
y group
en el método ggplot
:
ggplot(test, aes(test2,fill=test1))
+ geom_bar(aes(y = (..count..)/tapply(..count..,..group..,sum)[..group..]), position="dodge")
+ scale_y_continuous(labels = percent)
Me ocupo de situaciones similares con bastante frecuencia, pero adopto un enfoque muy diferente que utiliza dos de los otros paquetes de Hadley, concretamente, remodelar y plyr. Principalmente porque prefiero ver las cosas como barras 100% apiladas (cuando suman 100%).
test <- data.frame(sample(letters[1:2], 100, replace=T), sample(letters[3:8], 100, replace=T))
colnames(test) <- c("variable","value")
test <- cast(test, variable + value ~ .)
colnames(test)[3] <- "frequ"
test <- ddply(test,"variable", function(x) {
x <- x[order(x$value),]
x$cfreq <- cumsum(x$frequ)/sum(x$frequ)
x$pos <- (c(0,x$cfreq[-nrow(x)])+x$cfreq)/2
x$freq <- (x$frequ)/sum(x$frequ)
x
})
plot.tmp <- ggplot(test, aes(variable,frequ, fill=value)) + geom_bar(stat="identity", position="fill") + coord_flip() + scale_y_continuous("", formatter="percent")
Prueba esto:
# first make a dataframe with frequencies
df <- as.data.frame(with(test, table(test1,test2)))
# or with count() from plyr package as Hadley suggested
df <- count(test, vars=c(''test1'', ''test2''))
# next: compute percentages per group
df <- ddply(df, .(test1), transform, p = Freq/sum(Freq))
# and plot
ggplot(df, aes(test2, p))+geom_bar()+facet_grid(~test1)
También podría agregar + scale_y_continuous(formatter = "percent")
al gráfico para ggplot2 versión 0.8.9, o + scale_y_continuous(labels = percent_format())
para la versión 0.9.0.
Una forma muy simple:
ggplot(test, aes(test2)) +
geom_bar(aes(y = (..count..)/sum(..count..))) +
facet_grid(~test1)
Así que solo cambié el parámetro de geom_bar a aes(y = (..count..)/sum(..count..))
. Después de establecer ylab en NULL y especificar el formateador, puede obtener:
ggplot(test, aes(test2)) +
geom_bar(aes(y = (..count..)/sum(..count..))) +
facet_grid(~test1) +
scale_y_continuous('''', formatter="percent")
Actualización Tenga en cuenta que mientras el formatter = "percent")
funciona para ggplot2 versión 0.8.9, en 0.9.0 querrá algo como scale_y_continuous(labels = percent_format())
.