Cell 绘图复现 | 多级桑基图
在发表科研论文的过程中,科研绘图是必不可少的,而提升绘图水平最直接的方法就是跟着顶刊学习。
为了便于使用,本系列文章介绍的所有绘图都已收录到了CNSplot项目中,获取方式:
TigerZ 生信宝库科研绘图资源合集 --- PlotOnePiecehttps://mp.weixin.qq.com/s?__biz=MzkwMjM0MzA5MA==&mid=2247494177&idx=1&sn=a3641e1d1a28c523029145187c75a01a&scene=21&poc_token=HDqF8GmjcU4pgdaTC2iIS4lMi099EBMx8KYAxGEU
本期我们复现的是 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(name=nodes) 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.x="source", by.y="name") links <- merge(links, nodes, by.x="target", by.y="name") 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$value>0.5 & links$value<=0.8)] <- "0.5<x≤0.8" links$group[which(links$value>0.2 & links$value<=0.5)] <- "0.2<x≤0.5" links$group[which(links$value<=0.2)] <- "≤0.2"3. 准备配色
接下来我们设置绘图用到的配色:
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.2<x≤0.5", "0.5<x≤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, LinkGroup="group", NodeGroup="group", iterations= 0, width = 600, height = 400, fontSize=0, nodeWidth = 25, nodePadding = 15) p5. 保存图形
接下来我们通过下面的代码来保存绘制的图形:
saveNetwork(p, "../save/011/011-figure.html")打开这个html文件,手动调整节点的位置对齐,之后通过浏览器打印生成pdf文件。
6. Illustrator 修饰
最后我们将保存的 pdf 文件导入 Adobe Illustrator,稍加修饰即可。AI 修饰的详细步骤见视频video/011.mp4。
我们添加文本注释,并在下方添加图例:
完成后保存 pdf 文件,Adobe Illustrator 修饰好的绘图都保存为 pdf 文件在 CNSplot 项目的 data 文件夹中给大家提供,位于文件data/011-plot/011-figure.pdf,通过 Adobe Illustrator 打开即可修改。
我们看一下最后的绘图效果:
由于绘图数据是根据原图生成的模拟数据,因此跟原图可能不完全一致,但是基本上已经成功复现了绘图。
CNSplot 介绍
CNSplot专门针对科研绘图中的高级复杂图形,包含了以下内容:
①50个顶刊绘图复现,包含各种高级复杂图形
② 每个绘图都提供了测试数据/模板文件
③ 每个绘图都配套了视频教程
④ 配备一站式html文档,代码一键复制,交互式阅读提高用户体验
往期推荐
PlotOnePiece珍藏了 TigerZ 生信宝库的所有绘图资源,想要我的宝藏吗?我把它们全部都放在了这里🏴☠️:
CNSplot项目专门针对科研绘图中的高级复杂图形,包含了50个顶刊绘图复现,每个绘图都提供了测试数据/模板文件。所有绘图代码都整理到了一个html 文档中,并且还配套了视频教程。详细信息见:
sciRplot项目用于解决 R 语言中科研绘图的问题,包含了100种绘图代码(60种基础绘图+40种进阶绘图)。每个绘图都提供了测试数据,所有绘图代码都整理到了一个html 文档中。详细信息见:
sciRcolor项目用于解决 R 语言科研绘图中颜色选择的问题,包含了100种常用配色(60种离散色+40种连续色)。并且提供了一个用来预览配色的在线网站,以及用来获取配色的R 包。详细信息见:
