r - 在-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()。
我需要根据顺序制作变量。谢谢
解决方案
如您所述,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")
阴谋
推荐阅读
- python - CORS 在 Django 中不起作用,但设置似乎正确
- python - 如何在python字典中添加具有多个值的新键
- python - AttributeError 异常值:“IntegerField”对象没有属性“max_length”
- reactjs - 使用一个而不是多个 makeStyles 钩子
- plotly - Plotly add_hline() 不适用于 simple_white 模板
- algorithm - 无法理解区域 DP 的选择
- r - 接受字符串的函数
- ios - 如何在请求中使用自定义 json 数据创建多部分请求?
- javascript - 动态创建的按钮如何定位单个元素
- java - 删除(或使透明)由路径包围的画布区域