varias superponer porcentaje los gráficos grafico graficas graficar ggplot escala ejes como cambiar barras r ggplot2 order rank

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)))