首页 > 解决方案 > 在-axis ggplot中排序几个因子变量

问题描述

我已经看到了几个关于 x 轴标记顺序的问题,但仍然没有一个可以解决我的问题。我正在尝试绘制一个计算两个不同变量的 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_10, crime_2, ,,,, 。我用过scale_x_discrete(drop = FALSE ),和 fct_inorder()。

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

标签: rggplot2x-axis

解决方案


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

使用包中的str_sort功能,stringr您可以:

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

阴谋

按数字顺序绘制 x 轴


推荐阅读