1

我目前正试图在一个巨大的样本量上制作一个漂亮的 geom_col 图。样本的名称(应该在 x 轴上)是数字和字符,因为我包含“N”表示阴性对照。

sample_names <- c(100,22,4,5,6,"N")
size <- c(3,2,3,4,2,3)

现在我想以一个漂亮的顺序排列它,从最低的 sample_name(意思是从 4 号样品开始,然后是 5 号样品,然后是 6 号样品,22 号样品,100 号样品)到最高并以N. 由于列中的值被标识为字符,因此它始终以样本 100 开头(因为 1-0-0 在 2-2 之前)。

d <- data.frame(sample_names,size) %>%
     arrange(a)

在此处输入图像描述

这导致我的问题是,图中的数据以一种不太好的方式排序。 在此处输入图像描述

以 N 结尾的升序排列会更令人愉悦。

我已经尝试将此列转换为数字并将结果 NA(代替“N”)替换为 0。

问题在于,该图包含样本之间的巨大差距:

d <- data.frame(sample_names,size) %>%
   arrange(a) %>%
   mutate(sample_names = as.numeric(sample_names))%>%
   replace_na(list(sample_names = 0))

在此处输入图像描述

所以我的问题是:您是否知道如何将字符列排序为“正确”的升序方式,或者您是否知道如何缩小 ggplot2 中 x 轴上的间隙? 谢谢

4

1 回答 1

2

条形的顺序由数据中的因素控制。要自动化因子生成代码,您可以使用正则表达式提取仅是数字的值,将它们更改为数字,对它们进行排序并在末尾附加非数字值。

num <- grep('^\\d+$', d$sample_names)

d$sample_names <- factor(d$sample_names, 
                 c(sort(unique(as.numeric(d$sample_names[num]))), 
                        unique(d$sample_names[-num])))

library(ggplot2)

ggplot(d, aes(sample_names, size)) + geom_col()

@Rui Barradas 建议的一种更简单的方法是使用stringr::str_sortgtools::mixedsort-

d$sample_names <- factor(d$sample_names, stringr::str_sort(unique(d$sample_names), numeric = TRUE))

d$sample_names <- factor(d$sample_names, gtools::mixedsort(unique(d$sample_names)))
于 2021-06-04T09:34:47.123 回答