Ordenar varias variables de factor en -axis ggplot [duplicar]
He visto varias preguntas sobre el orden de las marcas del eje x, pero aún así, ninguna de ellas pudo resolver mi problema. Estoy tratando de hacer una gráfica que cuente 10 variables en dos diferentes. Mis variables son un factor, y la estructura es algo así:
crime_1 crime_2 ...... crime_10
Yes No Yes
Yes Yes No
No Yes No
He usado este código:
new_data %>%
pivot_longer(cols = starts_with("crime")) %>%
filter(value != 0) %>%
unite(crime,name, value) %>%
ggplot(aes(x = crime )) +
geom_bar(aes(fill = wave), position = position_dodge2(preserve = "single"))+ theme(axis.text.x=element_text(angle=90,hjust=1))+ggtitle("Crime")
La salida NO es crimen_1, crimen_2, ......., crimen_10, y es crimen_1, crimen_10, crimen_2, ,,,,. He usado scale_x_discrete(drop = FALSE )y fct_inorder ().
Necesito hacer las variables según el orden. Gracias
Respuestas
Como notó, el orden en el eje x está en orden alfabético y no en orden numérico. Aquí hay un enfoque para solucionarlo.
Usando la str_sortfunción del stringrpaquete puedes tomar:
vec <- c("sb_1_x", "sb_10_b", "sb_11_c", "sb_2_y")
vec
[1] "sb_1_x" "sb_10_b" "sb_11_c" "sb_2_y"
y ordene por el número del medio:
str_sort(vec, numeric = T)
[1] "sb_1_x" "sb_2_y" "sb_10_b" "sb_11_c"
En este caso, asegúrese de que sbsea un factor y utilícelo str_sortpara establecer los niveles del factor. También cambié el nombre de la etiqueta del eje x (puede reemplazarla por la que necesite). Poniendolo todo junto:
library(tidyverse)
library(ggplot2)
library(stringr)
df %>%
pivot_longer(cols = starts_with("sb")) %>%
filter(value != 0) %>%
unite(sb, name, value) %>%
ggplot(aes(x = factor(sb, levels = str_sort(unique(sb), numeric = TRUE)))) +
geom_bar(aes(fill = wave), position = position_dodge2(preserve = "single")) +
xlab("x-axis label")
Trama
Haz crimeun factor con niveles ordenados. No puedo ver el conjunto de datos completo, por lo que es posible que tenga que cambiar sus niveles si no se trata solo de crime_1, crime_2, ..., crime_10
new_data %>%
pivot_longer(cols = starts_with("crime")) %>%
filter(value != 0) %>%
unite(crime,name, value) %>%
# make crime a factor with ordered levels crime_1,crime_2,...,crime_10
mutate(crime = factor(crime,levels = paste('crime',1:10,sep='_')) %>%
ggplot(aes(x = crime )) +
geom_bar(aes(fill = wave), position = position_dodge2(preserve = "single"))+ theme(axis.text.x=element_text(angle=90,hjust=1))+ggtitle("Crime")
``