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_sort
或 gtools::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)))
我目前正尝试在巨大的样本量上制作漂亮的 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_sort
或 gtools::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)))