linux for循环套for循环格式_为什么for循环和aes八字不合

e2da5be17ab9aaa2ba4e954917899e16.png5f18b96568c5c5e7be211b4490b6cefd.png 今天是生信星球陪你的第599天e2da5be17ab9aaa2ba4e954917899e16.png


   大神一句话,菜鸟跑半年。我不是大神,但我可以缩短你走弯路的半年~

   就像歌儿唱的那样,如果你不知道该往哪儿走,就留在这学点生信好不好~

   这里有豆豆和花花的学习历程,从新手到进阶,生信路上有你有我!

d83d063739892ef62adffd4c85011d38.png

前面写过这篇:批量绘制箱线图https://www.jianshu.com/p/ec9034fe9a2c
今天发现了新问题。是aes和for循环的八字不合的诡异现象,来分析一下大家看看,能不能破:

1.示例数据

mat 60),nrow=

mat2长这样:

28878e0e70878afc8a8733c7528a89bc.png

我们的目的是对对每一个基因画箱线图,这可以通过gather+分面或者for循环+aes_string来实现,这个没有问题。

尝试1:当不用for循环的时候

p1 = ggplot(data=mat2)+
  geom_boxplot(aes(x=group,y=mat2[,1],color = group))
p2 = ggplot(data=mat2)+
  geom_boxplot(aes(x=group,y=mat2[,2],color = group))
library(patchwork)
p1+p2
e37ac2e1341284dc63f1be0873ab285f.png

成功了。

尝试2:把1和2替换成i,传参试试

i=1
p1 = ggplot(data=mat2)+
  geom_boxplot(aes(x=group,y=mat2[,i],color = group))
i=2
p2 = ggplot(data=mat2)+
  geom_boxplot(aes(x=group,y=mat2[,i],color = group))
library(patchwork)
p1+p2
5ad0ca334c46d5247c153327c096d8f7.png

所以放进for循环也是一样的,会出10张一样的图
p=list()
for(i in 1:10){
  p[[i]]=ggplot(data=mat2)+
    geom_boxplot(aes(x=group,y=mat2[,i],color = group))
}
wrap_plots(p,nrow=2,guides = 'collect')
c647907cd9b20078a10cba302e6cd098.png

所有图都一样,所以失败了。

尝试3:换apply试试呢?

1:
bade14c6ff064c24ea890f1a08927b4b.png

所以你说,aes它不能传参吗?是不能,大佬们说需要传参就改成aes_string,它确实可以。但我好奇是为什么apply就能做出来。可能是因为它的循环方式和for循环不一样?

把这个apply的循环方式原样替换到for循环里,仍然是不行的:

p = list()
n = 0
for(i in mat2[,1:10]){
  n = n+1
  p[[n]]=ggplot(data=mat2)+
    geom_boxplot(aes(x=group,y=i,color = group))
}
wrap_plots(p,nrow=2,guides = 'collect')
6889f99984299db4dc30a063fc259b68.png
失败+1

But,如果我非要用for循环实现呢?

什么叫倔强,可能我撞了南墙才会回头吧,可能我见了黄河才会死心吧~aaa,想用,那就是有办法的。实在不行,我们每次改完数据再作图就好了!

一个知识点,当gene这一列不存在于mat2的时候,mat2$gene = i表示新增一列,列名为gene,内容为i。当gene这一列存在于mat2的时候,mat2$gene = i表示修改gene这一列的内容,改为i。

p = list()
n = 0
for(i in mat2[,1:10]){
  n = n+1
  mat2$gene = i
  p[[n]]=ggplot(data=mat2)+
    geom_boxplot(aes(x=group,y=gene,color = group))
}
wrap_plots(p,nrow=2,guides = 'collect')
42d69c13dc16f45706169caf24453c30.png

一个意义不大的问题引起了我的兴趣,两个小时又木有了。没办法,谁叫我对R语言兴趣至深,爱得深沉 哈哈。

当你即将放弃,其实彼岸已经在眼前

小郭发来aes帮助文档里的一段例子:

f8c5bf787b2f031b6c43c23f2aa084f9.png

我们都在惊叹,两个叹号是什么操作???
p=list()
for(i in 1:10) {
  p[[i]] = ggplot(data = df, aes(x = group, y = !!df[, i])) +
    geom_boxplot(aes(color = group))
}
library(patchwork)
wrap_plots(p, nrow = 2, guides = 'collect')
614fbbdcd896f15ef49bc01bbd3222de.png

问题就这么解决了!你说诡异不诡异。ggplot2博大精深,大佬们玩的很深沉,表示十分佩服。
ps:你会看到每种方法出来的列名都是不一样的,但那个可以改,加个labels参数就行了。

插个小广告!

生信零基础入门学习小组

全国巡讲全球听(生信线上直播课)

数据挖掘线上班来袭(两天变三周,实力加量)

一起来学单细胞吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值