在练习做题的过程中遇到了一个问题,并找到了合适的解决方式,遂记录之。
注:题目来源于生信技能树
题目:生成一个随机数(rnorm)组成的10行6列的矩阵,列名为sample1,sample2...sample6,行名为gene1,gene2...gene10,分组为sample1、2、3属于control组,sample4,5,6属于treat组,用循环对每个基因画ggplot2箱线图,并尝试拼图。
目前循环语句没吃透,还不太会,计划先使用ggplot的分面功能来实现
rm(list = ls()) # 清空环境变量
library(dplyr)
library(tidyr)
library(ggplot2)
a <- matrix(rnorm(60),ncol = 6)
colnames(a) <- paste0("sample",1:6)
rownames(a) <- paste0("gene",1:10)
a <- data.frame(t(a))
a <- mutate(a, group=rep(c("A","B"),each = 3))
dat = gather(a,key = "gene",value = "expression",-group)
# dat$gene <- factor(dat$gene, levels = paste0("gene",1:10))
ggplot(data = dat, mapping = aes(x = group, y = expression, color = group))+
geom_boxplot()+
geom_jitter()+
facet_wrap(~gene,nrow = 2)
以上代码得到如下图
可以看到分面默认的排序是不对的,gene1后面不是接的gene2而是gene10。所以为了按照gene1~10的顺序进行排列(或者你可以按你想展示的顺序进行排列),该如何实现呢?
dat$gene <- factor(dat$gene, levels = paste0("gene",1:10))
ggplot(data = dat, mapping = aes(x = group, y = expression, color = group))+
geom_boxplot()+
geom_jitter()+
facet_wrap(~gene,nrow = 2)
可以按以上代码(前面的代码同)给gene这一列加上levels,这样就有了固定顺序,再画图时候就可以按照想要顺序进行排列了(levels的顺序是可以用向量自定义的哦~)。按以上解决方法得到了下图:
因此这个问题解决了,赞👍,继续积累,一个一个问题的解决,一个一个的积累,相信时间的力量!