Cell 绘图复现 | 多级桑基图
在发表科研论文的过程中科研绘图是必不可少的而提升绘图水平最直接的方法就是跟着顶刊学习。为了便于使用本系列文章介绍的所有绘图都已收录到了CNSplot项目中获取方式TigerZ 生信宝库科研绘图资源合集 --- PlotOnePiecehttps://mp.weixin.qq.com/s?__bizMzkwMjM0MzA5MAmid2247494177idx1sna3641e1d1a28c523029145187c75a01ascene21poc_tokenHDqF8GmjcU4pgdaTC2iIS4lMi099EBMx8KYAxGEU本期我们复现的是 2022 年发表在Cell上的一篇期刊的Figure 2E。我们先来欣赏下期刊的原图期刊原图原图解读该图展示了 P8-P14-P17-P21-P28-P38 不同年龄的小鼠之间 V1 谷氨酸能神经元类型之间的转录组相似性。每个节点表示每个年龄的单个 V1 谷氨酸能神经元类型连线根据转录组相似性着色。1. 导入包我们首先导入本期绘图用到的 R 包library(ggplot2) library(tidyr) library(networkD3)2. 准备数据接下来我们导入绘图用到的数据在CNSplot中给大家提供了测试数据## 导入相似性矩阵 P8_P14 - read.csv(../data/011-plot/P8_P14.csv, row.names 1) df1 - P8_P14 P14_P17 - read.csv(../data/011-plot/P14_P17.csv, row.names 1) df2 - P14_P17 P17_P21 - read.csv(../data/011-plot/P17_P21.csv, row.names 1) df3 - P17_P21 P21_P28 - read.csv(../data/011-plot/P21_P28.csv, row.names 1) df4 - P21_P28 P28_P38 - read.csv(../data/011-plot/P28_P38.csv, row.names 1) df5 - P28_P38 ## 转换为长数据框格式 df1$source - rownames(df1) df1_long - pivot_longer(df1, !source, names_to target, values_to value) df1_long$source - paste(P8, df1_long$source, sep_) df1_long$target - paste(P14, df1_long$target, sep_) df2$source - rownames(df2) df2_long - pivot_longer(df2, !source, names_to target, values_to value) df2_long$source - paste(P14, df2_long$source, sep_) df2_long$target - paste(P17, df2_long$target, sep_) df3$source - rownames(df3) df3_long - pivot_longer(df3, !source, names_to target, values_to value) df3_long$source - paste(P17, df3_long$source, sep_) df3_long$target - paste(P21, df3_long$target, sep_) df4$source - rownames(df4) df4_long - pivot_longer(df4, !source, names_to target, values_to value) df4_long$source - paste(P21, df4_long$source, sep_) df4_long$target - paste(P28, df4_long$target, sep_) df5$source - rownames(df5) df5_long - pivot_longer(df5, !source, names_to target, values_to value) df5_long$source - paste(P28, df5_long$source, sep_) df5_long$target - paste(P38, df5_long$target, sep_) ## 设置nodes信息 nodes - c(unique(df1_long$source), unique(df2_long$source), unique(df3_long$source), unique(df4_long$source), unique(df5_long$source), unique(df5_long$target)) nodes - data.frame(namenodes) nodes$index - 0:(nrow(nodes) - 1) nodes$group - nodes$name ## 设置links信息 links - rbind(df1_long, df2_long, df3_long, df4_long, df5_long) links - links[links$value ! 0,] links - merge(links, nodes, by.xsource, by.yname) links - merge(links, nodes, by.xtarget, by.yname) links - links[,c(target, source, value, index.x, index.y)] colnames(links) - c(target,source,value,IDsource,IDtarget) links$group - 0.8 links$group[which(links$value0.5 links$value0.8)] - 0.5x≤0.8 links$group[which(links$value0.2 links$value0.5)] - 0.2x≤0.5 links$group[which(links$value0.2)] - ≤0.23. 准备配色接下来我们设置绘图用到的配色col1 - c(#ebfafa, #d0d5da, #c98bef, #6860ff) col2 - c(rep(#f4c3b1,2), rep(#a1d8da,3), rep(#c6e1f3,4), rep(#c0c6e9,6)) ## 设置sankeyNetwork函数colourScale参数配色 domain - c(≤0.2, 0.2x≤0.5, 0.5x≤0.8, 0.8, nodes$name) range - c(col1, col2, col2, c(#f4c3b1, col2), c(#f4c3b1, col2), c(#f4c3b1, col2), c(#f4c3b1, col2)) colourScale - paste(d3.scaleOrdinal() .domain([, domain[1], sep ) for (i in 2:length(domain)){ colourScale - paste(colourScale, , , domain[i], sep ) } colourScale - paste(colourScale, ]) .range([, sep ) colourScale - paste(colourScale, range[1], sep ) for (i in 2:length(range)){ colourScale - paste(colourScale,, , range[i], sep ) } colourScale - paste(colourScale,]), sep )4. 绘制图形接下来我们通过下面的代码来绘制图形p - sankeyNetwork( Links links, Nodes nodes, Source IDsource, Target IDtarget, Value value, NodeID name, colourScale colourScale, LinkGroupgroup, NodeGroupgroup, iterations 0, width 600, height 400, fontSize0, nodeWidth 25, nodePadding 15) p步骤15. 保存图形接下来我们通过下面的代码来保存绘制的图形saveNetwork(p, ../save/011/011-figure.html)打开这个html文件手动调整节点的位置对齐之后通过浏览器打印生成pdf文件。步骤26. Illustrator 修饰最后我们将保存的 pdf 文件导入 Adobe Illustrator稍加修饰即可。AI 修饰的详细步骤见视频video/011.mp4。我们添加文本注释并在下方添加图例步骤3完成后保存 pdf 文件Adobe Illustrator 修饰好的绘图都保存为 pdf 文件在 CNSplot 项目的 data 文件夹中给大家提供位于文件data/011-plot/011-figure.pdf通过 Adobe Illustrator 打开即可修改。我们看一下最后的绘图效果绘图复现由于绘图数据是根据原图生成的模拟数据因此跟原图可能不完全一致但是基本上已经成功复现了绘图。CNSplot 介绍CNSplot专门针对科研绘图中的高级复杂图形包含了以下内容①50个顶刊绘图复现包含各种高级复杂图形② 每个绘图都提供了测试数据/模板文件③ 每个绘图都配套了视频教程④ 配备一站式html文档代码一键复制交互式阅读提高用户体验往期推荐PlotOnePiece珍藏了 TigerZ 生信宝库的所有绘图资源想要我的宝藏吗我把它们全部都放在了这里☠️TigerZ 生信宝库科研绘图资源合集 --- PlotOnePieceCNSplot项目专门针对科研绘图中的高级复杂图形包含了50个顶刊绘图复现每个绘图都提供了测试数据/模板文件。所有绘图代码都整理到了一个html 文档中并且还配套了视频教程。详细信息见顶刊绘图复现模板 --- CNSplotsciRplot项目用于解决 R 语言中科研绘图的问题包含了100种绘图代码60种基础绘图40种进阶绘图。每个绘图都提供了测试数据所有绘图代码都整理到了一个html 文档中。详细信息见R 语言科研绘图模板 --- sciRplotsciRcolor项目用于解决 R 语言科研绘图中颜色选择的问题包含了100种常用配色60种离散色40种连续色。并且提供了一个用来预览配色的在线网站以及用来获取配色的R 包。详细信息见R 语言科研配色工具 --- sciRcolor