R基础绘图,你真的会了么?
学徒和学员已经陆续出师,是时候把生信技能树的舞台交给后辈了!
老板扔给我的一堆带有代码的可实现单细胞图文复现资料,又是学习的一周,本次在学习的过程中再次遇到了基础绘图的高手,下面分享给大家我的快乐,是真的很快乐哈哈哈。
首先,奉上文章信息:
**标题:A conserved dendritic-cell regulatory program limits antitumour immunity(一个保守的树突细胞调节程序限制抗肿瘤免疫)
DOI(url): 10.1038/s41586-020-2134-y
**日期及杂志:Epub 2020 Mar 25,Nature
**作者及单位:Miriam Merad,西奈山伊坎医学院(Icahn School of Medicine at Mount Sinai)
**关键词:dendritic-cell,antitumour immunity
代码:https://github.com/effiken/Maier_et_al_nature_2020
相关文献解读,请移步到《单细胞天地》公众号!
代码和数据都在GitHub上,可以自行前往下载进行学习。我这里只进行一张图的讲解:
就是下面这个看起来平平无奇的热图!
首先,作者将此图划分成了3行2列的区域,然后在每个区域里使用基础绘图函数进行填充,你没看错,这幅图里面的文字,方框,甚至坐标都是一个一个单独画进来的。其实,这个很考验基本功,特别是基础绘图函数的坐标,有时候很难搞。代码:
# 使用layout函数,每个区域还设置了高度heighs和宽度widths
layout(matrix(1:6,nrow=3,ncol=2),widths=c(10,4),heights=c(.5,10,.5))
然后绘制第一列的第一行区域
使用了par设置oma,mar图的边距
image绘制颜色格子,输入数据是一个矩阵,xaxt和yaxt设置不绘制坐标轴
box对图片绘图区域添加一个方框
abline添加颜色格子中间的两条红色的线
mtext添加行注释和列注释
axis再在颜色格子上方添加坐标刻度
#column 1
# 使用了par设置oma,mar图的边距
par(oma=c(1,5,1.5,.1))
par(mar=c(0,0,0,0))
# image绘制颜色格子,输入数据是一个矩阵,xaxt和yaxt设置不绘制坐标轴
image(as.matrix(as.numeric(cell2annot)),xaxt="n",yaxt="n",col=lin_col)
# box对图片绘图区域添加一个方框
box()
# abline添加颜色格子中间的两条红色的线
abline(v=breaks,col="red")
# mtext添加行注释和列注释
mtext(at=mid_clusts,c("mregDC","DC1","DC2"),cex=.7,line=.25)
mtext("Annotation",font=2,side=2,las=2,line=.25,cex=.6)
# axis再在颜色格子上方添加坐标刻度
axis(side=3,at=mid_clusts,labels=F,tck=-.2)
绘制结果:
接着,绘制第一列第2行灰色表达矩阵部分,依然使用了image,xart,yaxt,box,abline,metxt这些基础函数。这部分代码中有一个颜色rgb(s,s,s)值得收录一下。
# image绘制表达谱矩阵,使用了rgb设置颜色
image(t(log2(1+as.matrix(mat))),col=rgb(s,s,s),xaxt="n",yaxt="n")
# 矩阵外面添加盒子
box()
# 添加两条红色的直线
abline(v=breaks,col="red")
# 添加行基因名字
mtext(gene_list,side=2,at=seq(0,1,1/(length(gene_list)-1)),las=2,line=.25,font=3,cex=.6)
绘制结果:
接着,绘制第一列第3行的样本注释条,方框还是使用的image函数,颜色rgb,直线abline,文字mtext
# 通过全局par函数设置图片边距mar
par(mar=c(0,0,0,0))
# 绘制样本注释条颜色矩阵
image(as.matrix(as.numeric(factor(cell2sample,c("Naive","KP")))),col=c(rgb(255,192,203,max=255),rgb(165,75,42,max=255)),xaxt="n",yaxt="n")
# 添加直线
abline(v=breaks,col="red")
# 添加盒子
box()
# 添加样本行注释
mtext("Sample type",font=2,side=2,las=2,line=.25,cex=.6)
绘制结果:
接着绘制第二列的内容了:相对前面来说使用了新的plot.new(),大于等于4的表示"\u22654",图例legend中的legend的使用。
#column 2
# 设置绘图边距
par(mar=c(0,0,0,0))
# 第一行绘制空白
plot.new()
# 第2行图片边距
par(mar=c(5,1.5,5,1.5))
# 第二行的矩阵为色度条
image(t(matrix(1:50)),col=rgb(s,s,s),xaxt="n",yaxt="n")
# 添加盒子
box()
# 添加注释条的文字
mtext(c("0","\u22654"),at=c(0,1),las=2,side=4,cex=.7,line=.25)
mtext("Log2\n1+#UMI per 2000",side=3,line=.5,cex=.4)
# 第三行内容,为样本legend
par(mar=c(0,0,0,0))
plot.new()
legend(x = 0,y=2,legend = c("Naive","KP"),fill = c(rgb(255,192,203,max=255),rgb(165,75,42,max=255)),bty="n",cex=.8,xpd=NA)
绘制结果:
以上全部合在一起就是一张完整的好看的图片了,可见作者是多么喜欢使用基础函数进行图片绘制了。
高手!
文末友情推荐
。如果大家没有时间自行慢慢摸索着学习,可以考虑我们生信技能树官方举办的学习班。