优秀学员考试题
题目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()

可以看到非常丑,根据给出的示例图片进行美(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()

题目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) #设置两行,代码看着很笨重,但没什么优化的思路
这里发现一个问题,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()
}
看了答案以后学了一种更加简便的拼图方式
wrap_plots(result,nrow = 2,guides = "collect")