在 -axis ggplot 中排序几个因子变量

Ordering Several factor variables in -axis ggplot

我已经看到几个关于 x 轴标记顺序的问题,但其中 none 仍然可以解决我的问题。我正在尝试绘制一个图,计算两个不同的 10 个变量。我的变量是一个因素,结构是这样的:

crime_1   crime_2 ......  crime_10
Yes         No               Yes
Yes         Yes              No
No          Yes              No

我用过这个代码:

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

输出不是 crime_1、crime_2、.......、crime_10,而是 crime_1、crime_1 0, crime_2,. 我用过 scale_x_discrete(drop = FALSE ) 和 fct_inorder().

我需要根据顺序制作变量。谢谢

使 crime 成为具有有序水平的因素。我看不到完整的数据集,所以如果不只是 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")
``

如您所述,x 轴上的顺序是按字母顺序,而不是数字顺序。这是解决该问题的一种方法。

使用 stringr 包中的 str_sort 函数,您可以获得:

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"

并按中间数字排序:

str_sort(vec, numeric = T)

[1] "sb_1_x"  "sb_2_y"  "sb_10_b" "sb_11_c"

在这种情况下,确保 sb 是一个因素,并使用 str_sort 设置因素的水平。我还重命名了 x 轴标签(您可以替换为您需要的)。把它们放在一起:

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

情节