在 -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")
情节
我已经看到几个关于 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")
情节