Ordenar varias variables de factor en -axis ggplot [duplicar]

Nov 17 2020

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

1 Ben Nov 18 2020 at 00:02

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

cookesd Nov 17 2020 at 23:16

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