0%

生信学习笔记番外——学员考试题

优秀学员考试题

题目1

使用循环,对iris的1到4列分别画点图(用基础包画图函数plot)

##先用第一列画一下,基本形状对了,根据第5列再加入颜色
 plot(iris[,1],col = iris[,5])  
##开始写循环,1到4共循环4次
 x <-c(1:4)   #设置一个向量
 for (i in x) {
 plot(iris[,i],col = iris[,5])
 }
##运行后发现一个问题,4张图都堆叠在一起,查阅plot函数小图拼贴的方法后修改
 par(mfrow=c(2,2)) #画的图以2行2列展示
 x <-c(1:4)
 png("zuoye.png")
 par(mfrow=c(2,2))
 for (i in x) {
 plot(data[,i],col = data[,5])
 }
 dev.off()

ggplot-1

可以看到非常丑,根据给出的示例图片进行美(chou)化(hua)

x <-c(1:4)
png("zuoye.png",width = 800, height = 400)
par(mfrow=c(2,2))
for (i in x) {
plot(data[,i],col = data[,5],pch = 16)
}
dev.off()

ggplot-1

题目2

生成一个随机数(rnorm)组成的10行6列的矩阵,列名为sample1,sample2….sample6,行名为gene1,gene2…gene10,分组为sample1、2、3属于A组,sample4、5、6属于B组。用循环对每个基因画ggplot2箱线图,并拼图(禁止使用宽变长)。

##构建随机矩阵
 set.seed(2022)
 data <-matrix(rnorm(60),nrow=10)   #10行
 colnames(data)<- paste0("sample",c(1:6))  
 rownames(data)<- paste0("gene",c(1:10))  
 data = data.frame(t(data)) #将矩阵转换为数据框,否则下一步报错
 data$group <- c("A组","A组","A组","B组","B组","B组")
##老样子写循环前试一下gene1能不能走通
 ggplot(data = data,mapping = aes(x = group, y = data[,1]))+
   geom_boxplot(mapping = aes(fill = group))
##循环
 for(i in 1:10){
 ggplot(data = data,mapping = aes(x = group, y = data[,i]))+
  geom_boxplot(mapping = aes(fill = group)) 
 }
#这里有个问题,plot中的拼接函数在ggplot中不管用,那就准备每个循环中生成一个变量,最后用patchwork去拼接
 result = list() #存放结果
 for(i in 1:10){
 result[[i]] = ggplot(data = data,mapping = aes(x = group, y = data[,[i]]))+
  geom_boxplot(mapping = aes(fill = group)) 
 }
#开始拼接图
 library(patchwork)
 result[[1]]+result[[2]]+result[[3]]+result[[4]]+result[[5]]+
 result[[6]]+result[[7]]+result[[8]]+result[[9]]+result[[10]]+
 plot_layout(nrow = 2)  #设置两行,代码看着很笨重,但没什么优化的思路

ggplot-1

这里发现一个问题,10张图都是一样的,到底是哪里出了问题
##手动替换i为1,2,3,生成的图都是不同,主体应该没问题
##改为i in 8:10,发现图也没有变化,说明i 这个变量在循环中直接当成i这字母而非变量
##猜测aes只能接受固定变量名,遂百度寻找新的函数
##aes()需要填入变量名;字符向量的循环,aes_string函数可以将字符变量映射为ggplot所需的输入参数
for(i in 1:10){
  result[[i]] = ggplot(data = data,aes_string(x = "group",y=colnames(data)[i]))+
    geom_boxplot(aes(fill = group))+
    theme_bw()
}

ggplot-1
看了答案以后学了一种更加简便的拼图方式

wrap_plots(result,nrow = 2,guides = "collect")