ggplot2 和 dplyr,可视化一个字符列

ggplot2 and dplyr, visualize a column which is a character

我目前正尝试在巨大的样本量上制作漂亮的 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 号样本,第 3 号样本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 轴上的间隙吗? 谢谢

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

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