当前位置: 首页 > news >正文

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) p
步骤1

5. 保存图形

接下来我们通过下面的代码来保存绘制的图形:

saveNetwork(p, "../save/011/011-figure.html")

打开这个html文件,手动调整节点的位置对齐,之后通过浏览器打印生成pdf文件。

步骤2

6. 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 生信宝库科研绘图资源合集 --- PlotOnePiece

CNSplot项目专门针对科研绘图中的高级复杂图形,包含了50个顶刊绘图复现,每个绘图都提供了测试数据/模板文件。所有绘图代码都整理到了一个html 文档中,并且还配套了视频教程。详细信息见:

顶刊绘图复现模板 --- CNSplot

sciRplot项目用于解决 R 语言中科研绘图的问题,包含了100种绘图代码(60基础绘图+40进阶绘图)。每个绘图都提供了测试数据,所有绘图代码都整理到了一个html 文档中。详细信息见:

R 语言科研绘图模板 --- sciRplot

sciRcolor项目用于解决 R 语言科研绘图中颜色选择的问题,包含了100种常用配色(60离散色+40连续色)。并且提供了一个用来预览配色的在线网站,以及用来获取配色的R 包。详细信息见:

R 语言科研配色工具 --- sciRcolor
http://www.jsqmd.com/news/721873/

相关文章:

  • 告别信息过载:我是如何用Inoreader的智能过滤器+标签系统,打造个人专属信息流的
  • OpenBoardView终极指南:免费开源的PCB文件查看器,硬件工程师必备工具
  • STM32电子罗盘DIY:用ST480MC磁力计和IIC接口,手把手教你做个指南针(附校准避坑指南)
  • 游戏开发内存资源加载与释放策略
  • 数据结构----希尔排序
  • ITSS项目服务经理是什么?有什么用?
  • 零成本构建专属AI服务:Kimi免费API完整部署实战指南
  • 如何用Vue流程图组件Flowchart-Vue快速构建专业业务流程可视化
  • 动态符号执行:自动生成测试用例与漏洞挖掘
  • 跨链技术实现:原子交换与中继链的桥接方案
  • 前端焦虑?收藏!AI时代,前端如何华丽转身成为AI产品经理?(内含案例转型路径)
  • 暗影精灵终极风扇控制指南:OmenSuperHub让你的游戏本性能全释放
  • 别再被FCW误报吓一跳了!聊聊GB/T 33577标准里那些不报警的“潜规则”
  • 设计成本暴降90%?GPT-image-2实测:如何降低创作成本
  • 树莓派串口调试与 minicom 离线安装全攻略
  • Fluent新手避坑指南:手把手教你搞定冰块融化模拟(附VOF模型设置要点)
  • 奔驰与埃斯林根大学:时间序列修复实现AI异常检测超越复杂深度学习
  • OpenCore Configurator:黑苹果引导配置的终极图形界面工具指南
  • Vivado里用XPM例化URAM,手把手教你搞定UltraScale+ FPGA的大容量存储
  • STM32F103驱动四路直流减速电机:DRV8848硬件连接与PWM配置避坑指南
  • 基于大数据视角:“东数西算”下高质量算力的技术路径与落地实践
  • 内网渗透核心技术:内网代理从原理到实战全解析
  • 湖南顶俏商城系统制度开发(现成模式)
  • 零代码文本分析神器:5分钟掌握KH Coder的完整指南
  • Kubernetes攻防 创建 cgroup 进行容器逃逸
  • 服务器追踪线程
  • 手机OIS马达拆解:从苹果的悬丝到三星的滚珠,不同方案如何影响你的拍照体验?
  • C# 13内联数组性能真相(Stack-Only Array大揭秘):为什么.NET Runtime团队禁用常规new操作符?
  • 秘语盾技术团队解析 Ledger Nano X 蓝牙连接优化
  • 10款高效降AI率工具深度实测!(附免费优化方案) 【2026权威版】 - 殷念写论文