porcentaje - superponer graficas en r ggplot
¿Cómo mostrar barras en ggplot2 en orden descendente de un vector numérico? (2)
df <- data.frame (Categories=c("Alpha Category", "Alpha Category",
"Alpha Category", "Bravo Category",
"Bravo Category", "Bravo Category",
"Charlie Category", "Charlie Category",
"Charlie Category"),
choices=c("alpha1", "alpha2", "alpha3", "bravo1",
"bravo2", "bravo3", "charlie1", "charlie2",
"charlie3") ,
ratings=c(20,60,40, 55,75,25,65,35,45))
df.plot <- ggplot(df, aes(Categories, ratings, fill = choices))
+ geom_bar(position="dodge", stat="identity")
+ coord_flip()
df.plot <- df.plot
+ theme_classic(base_size = 16, base_family = "")
+ scale_fill_brewer(palette="Paired")
df.plot <- df.plot
+ scale_y_continuous(breaks=seq(0,100,by=10),limits=c(0,80) )
+ ylab("Ratings")
+ theme(axis.text.y = element_text(size=16)) #change font size of y axis label
df.plot
Realmente apreciaría algo de ayuda
Lo que es más importante, me gustaría mostrar las "elecciones" dentro de cada "categoría" en orden descendente de sus "calificaciones", por ejemplo, aquí "Categoría Charlie" mostraría charlie1, luego charlie3, luego charlie2.
Sinceramente, busqué soluciones en línea durante aproximadamente una semana, pero no puedo encontrarlas. Mi opinión actual es que debería convertir las elecciones en factores, pero no he descubierto cómo hacerlo correctamente.
De importancia secundaria, sería genial si las "categorías" se pueden enumerar, de arriba hacia abajo, "Categoría Alfa", "Categoría Bravo", "Categoría Charlie" en lugar de en orden inverso como parece ocurrir cuando las coordenadas se voltean
Esta respuesta no hace uso de las posibilidades en ggplot
para transformar variables y escalas (ver la respuesta limpia de @Metric), sino que las variables se transforman de antemano.
Dentro de cada categoría, reordene las opciones según las calificaciones. Verifica que ''elecciones'' sea un character
. Si es un factor
, debe convertir a carácter con as.character
. Porque reordenar con un factor como entrada no nos da lo que queremos (ver a continuación).
str(df$choices)
# chr [1:9] "alpha1" "alpha2" "alpha3" ...
library(plyr)
df <- ddply(.data = df, .variables = .(Categories), mutate,
choices = reorder(choices, ratings))
Niveles inversos de ''Categorías''
df$Categories <- as.factor(df$Categories)
levels(df$Categories) <- rev(levels(df$Categories))
Trama
df.plot <- ggplot(df, aes(x = Categories, y = ratings, fill = choices)) +
geom_bar(position = "dodge", stat = "identity") +
coord_flip() +
theme_classic(base_size = 16, base_family = "") +
scale_fill_brewer(palette = "Paired") +
scale_y_continuous(breaks = seq(0, 100, by = 10), limits = c(0, 80)) +
ylab("Ratings") +
theme(axis.text.y = element_text(size = 16))
df.plot
Editar siguiendo un comentario de @Michael Bellhouse - "parece que la categoría alfa está clasificada pero no es bravo o charlie"
Cuando ''elecciones'' es un personaje, los niveles de factores que se generan y se reordenan en ddply
se basan en cada subconjunto de ''elecciones''. Lo cual funciona bien. Por otro lado, cuando ''elecciones'' es un factor en los datos originales, sus niveles se basan en todos los niveles presentes en los datos. En el ddply
subconjunto de ''opciones'', los niveles se reordenan, pero el reordenamiento tiene lugar dentro del conjunto completo de niveles. Esto lleva a tres conjuntos de niveles conflictivos y solo se usa el primero.
# reorder character version
ll <- dlply(.data = df, .variables = .(Categories), mutate,
choices.ro = reorder(choices, ratings))
# check levels
lapply(ll, function(x) levels(x$choices.ro))
# $`Alpha Category`
# [1] "alpha1" "alpha3" "alpha2"
#
# $`Bravo Category`
# [1] "bravo3" "bravo1" "bravo2"
#
# $`Charlie Category`
# [1] "charlie2" "charlie3" "charlie1"
# choices as factor
df$choices.fac <- as.factor(df$choices)
levels(df$choices.fac)
# [1] "alpha1" "alpha2" "alpha3" "bravo1" "bravo2" "bravo3" "charlie1" "charlie2"
# [9] "charlie3"
# reorder factor version
ll <- dlply(.data = df, .variables = .(Categories), mutate,
choices.fac.ro = reorder(choices.fac, ratings))
# reordering takes place _within_ each Category, but on the _full set_ of levels
# $`Alpha Category`
# [1] "alpha1" "alpha3" "alpha2" "bravo1" "bravo2" "bravo3" "charlie1" "charlie2"
# [9] "charlie3"
# This set of levels will be used in ggplot if you start with choices as a factor.
# Hence @Michael Bellhouse comment: "alpha category is ranked but not bravo or charlie"
# $`Bravo Category`
# [1] "bravo3" "bravo1" "bravo2" "alpha1" "alpha2" "alpha3" "charlie1" "charlie2"
# [9] "charlie3"
#
# $`Charlie Category`
# [1] "charlie2" "charlie3" "charlie1" "alpha1" "alpha2" "alpha3" "bravo1" "bravo2"
# [9] "bravo3"
# Because a factor only can have one set of levels,
# the first set is used - $`Alpha Category`
# Thus, relordered within category Alpha only.
library(ggplot2)
df.plot <- ggplot(df, aes(x=Categories,y=reorder(choices,ratings), fill = choices)) +
geom_bar(position = "dodge", stat = "identity") + coord_flip() +
scale_x_discrete(limits = rev(levels(df$Categories)))