【小技巧-1】ggplot2中分面facet_wrap如何排序?

在练习做题的过程中遇到了一个问题,并找到了合适的解决方式,遂记录之。
注:题目来源于生信技能树

题目:生成一个随机数(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的顺序是可以用向量自定义的哦~)。按以上解决方法得到了下图:


这个分面图的排列顺序对了

因此这个问题解决了,赞👍,继续积累,一个一个问题的解决,一个一个的积累,相信时间的力量!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。