Nat Neurosci 绘图复现 | Upset图

Nat Neurosci 绘图复现 | Upset图

视频教程

在发表科研论文的过程中,科研绘图是必不可少的,而提升绘图水平最直接的方法就是跟着顶刊学习。

为了便于使用,本系列文章介绍的所有绘图都已收录到了 CNSplot 项目中,获取方式:

TigerZ 生信宝库科研绘图资源合集 --- PlotOnePiecehttps://mp.weixin.qq.com/s?__biz=MzkwMjM0MzA5MA==&mid=2247494177&idx=1&sn=a3641e1d1a28c523029145187c75a01a&scene=21&poc_token=HBsivmmjmofEjAJogGkz92wZbPkPOsVIcAthW4pw本期我们复现的是 2020 年发表在 Nature Neuroscience 上的一篇期刊的 Figure 2B

我们先来欣赏下期刊的原图:

期刊原图

**原图解读:**该UpSet图展示了神经元投射到下游核团的各种组合模式的细胞数量。彩色连线表示观察到的各种组合模式,柱状图表示每种组合模式的细胞数量。

1. 导入包

我们首先导入本期绘图用到的 R 包:

R 复制代码
library(ggplot2)
library(cowplot)
library(aplot)

2. 准备数据

接下来我们导入绘图用到的数据,在 CNSplot 中给大家提供了测试数据:

R 复制代码
data <- read.csv("../data/006-plot/006-data.csv")
# 制作顶部柱状图数据
data_Up <- data[which(data$Significance=='Up'),]
data_Down <- data[which(data$Significance=='Down'),]
data_No <- data[which(data$Significance=='not significant'),]
y <- c(data_Up$Observed, data_Down$Observed, data_No$Observed,
       data_Up$Expected, data_Down$Expected, data_No$Expected)
x <- c(seq(1:nrow(data))-0.2, seq(1:nrow(data))+0.2)
group <- c(rep('Up', nrow(data_Up)),
           rep('Down', nrow(data_Down)),
           rep('not significant', nrow(data_No)),
           rep('Expected', nrow(data)))
group <- factor(group, levels = c('Up','Down','not significant','Expected'))
df1 <- data.frame(x=x, y=y, group=group)
# 制作散点图数据
x <- seq(1:nrow(data))
mat <- matrix(0, nrow = 7, ncol = length(x))
rownames(mat) <- c("LS","NAc","BNST","LH","mPFC","BA","CeA")
colnames(mat) <- x
motifs <- c(data_Up$Motif, data_Down$Motif, data_No$Motif)
for (j in 1:ncol(mat)){
  for (i in 1:nrow(mat)){
    if (rownames(mat)[i] %in% strsplit(motifs[j],',')[[1]]){
      mat[i,j] <- 1
    }
  }
}
df2 <- data.frame(
  'X' = rep(1:ncol(mat), each=nrow(mat)),
  'Y' = rep(rownames(mat), ncol(mat)),
  'value' = as.vector(mat),
  'Motif_num' = c(rep(data_Up$Motif_num, each=nrow(mat)),
                   rep(data_Down$Motif_num, each=nrow(mat)),
                   rep(data_No$Motif_num, each=nrow(mat)))
)
df2$group <- '0 targets'
df2$group[which(df2$value > 0)] <-
  paste(df2$Motif_num[which(df2$value > 0)], 'targets')
df2$X <- factor(df2$X, levels=1:length(x))
df2$group <- factor(
  df2$group, 
  levels = c("0 targets","2 targets","3 targets","4 targets",
             "5 targets","6 targets"))
for (i in 1:nrow(data)){
  target_i <- df2$Y[df2$X==i & df2$value>0]
  target_index <- match(target_i, rownames(mat))
  df2$ystart[df2$X==i] <- min(target_index)
  df2$yend[df2$X==i] <- max(target_index)
  df2$group_seg[df2$X==i] <- 
    unique(as.character(df2$group[df2$X==i & df2$value>0]))
}
df2$Y <- factor(df2$Y, levels = rownames(mat))
# 制作侧边柱状图数据
df3 <- data.frame(
  'Target' = c("LS","NAc","BNST","LH","mPFC","BA","CeA"),
  'Cell_num' = 0
)
for (i in 1:nrow(df3)){
  for (j in 1:nrow(data)){
    if (df3$Target[i] %in% strsplit(data$Motif[j],',')[[1]]){
      df3$Cell_num[i] <- df3$Cell_num[i] + data$Observed[j]
    }
  }
}

3. 准备配色

接下来我们设置绘图用到的配色:

R 复制代码
col1 <- c("Up"="#be1e2d", "Down"="#7f3f97", "not significant"="#231f20",
          "Expected"="#a6a8ab")
col2 <- c("0 targets"="#d7d8da", "2 targets"="#26a9e0", "3 targets"="#8bc53f", 
          "4 targets"="#faaf40", "5 targets"="#d07aa2", "6 targets"="#ddcf76")

4. 绘制图形

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

R 复制代码
p1 <- ggplot(df1, aes(x=x, y=y, fill=group)) + 
  geom_bar(df1[df1$group != "Expected",], mapping = aes(x=x, y=y, fill=group),
           position="dodge", stat="identity", width = 0.4) +
  geom_bar(df1[df1$group == "Expected",], mapping = aes(x=x, y=y, fill=group),
           position="dodge", stat="identity", width = 0.2) +
  scale_fill_manual(values = col1) +
  theme_classic() +
  scale_x_discrete(expand=c(0.01, 0.01)) +
  scale_y_continuous(expand = c(0.01,0.01)) +
  theme(axis.text.x=element_blank(), axis.title.x=element_blank(),
        axis.ticks.x=element_blank(), plot.margin = margin(0,0,0,0))+
  labs(y='Motif cell number')
p2 <- ggplot(df2) +
  geom_point(aes(x=X, y=Y, colour=group), size=1.5) +
  geom_segment(aes(x = X, y = ystart, xend = X, yend = yend, colour=group_seg),
               linewidth = 0.5) +
  theme_minimal() +
  scale_color_manual(values = col2) +
  labs(x='', y='') +
  theme(panel.grid=element_blank(), plot.margin = margin(0,0,0,0),
        axis.ticks.x=element_blank(), axis.text.x = element_blank(),
        plot.title = element_blank())
p3 <- ggplot(df3, aes(x=Target, y=Cell_num)) +
  geom_bar(stat = "identity", fill='black') +
  coord_flip() + 
  scale_y_reverse() +
  labs(x='', 'y'='No. of cells') +
  theme_half_open() +
  theme(axis.ticks.y = element_blank(), axis.text.y = element_blank(),
        axis.line.y = element_blank(), 
        text = element_text(size = 8), axis.text.x = element_text(size = 8))
p <- 
  p2 %>%
  insert_top(p1, height=2) %>%
  insert_left(p3, width = 0.2)
p

步骤1

5. 保存图形

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

R 复制代码
ggsave("../save/006/006-figure.pdf", p, width = 10, height = 4, dpi = 300)

6. Illustrator 修饰

最后我们将保存的 pdf 文件导入 Adobe Illustrator,稍加修饰即可。AI 修饰的详细步骤见视频 video/006.mp4

我们添加一些文本注释,并调整图例的位置:

步骤2

完成后保存 pdf 文件,Adobe Illustrator 修饰好的绘图都保存为 pdf 文件在 CNSplot 项目的 data 文件夹中给大家提供,位于文件 data/006-plot/006-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

相关推荐
小O的算法实验室1 天前
2025年IEEE TETCI SCI2区,一种用于二次无约束二进制优化的协同神经动力学算法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
小O的算法实验室2 天前
2025年SEVC SCI2区,基于强化学习辅助粒子群算法的污水处理厂进水流量估算及出水调度问题研究,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
小O的算法实验室4 天前
2026年SEVC SCI2区,面向城市 V2X 网络的RSU部署与UAV调度风险感知层级多目标规划,深度解析+性能实测
论文复现·智能算法·智能算法改进
小O的算法实验室7 天前
2026年IEEE TNSE SCI2区,基于预测的双阶段分布式任务分配方法+搜救场景中最大化任务分配,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
小O的算法实验室8 天前
2026年IEEE TCYB SCI1区TOP,电动采摘机器人多目标任务分配:一种分层路径重构方法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
小O的算法实验室10 天前
2026年EAAI SCI1区TOP,基于LLM驱动的多群粒子群算法动态通信策略生成方法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
小O的算法实验室12 天前
2025年IEEE TSMCS SCI1区TOP,面向异构多点动态聚合的多阶段粒子群算法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
小O的算法实验室1 个月前
2024年IEEE TII SCI1区TOP,面向动态多目标多AUV路径规划的协同进化计算算法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
小O的算法实验室1 个月前
2026年IEEE TAI,基于代理辅助双层优化的多次访问协同卡车-无人机路径规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进