Nat Neurosci 绘图复现 | Upset图
视频教程
在发表科研论文的过程中,科研绘图是必不可少的,而提升绘图水平最直接的方法就是跟着顶刊学习。
为了便于使用,本系列文章介绍的所有绘图都已收录到了 CNSplot 项目中,获取方式:
TigerZ 生信宝库科研绘图资源合集 --- PlotOnePiece
https://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 文档 中,并且还配套了视频教程。详细信息见:
sciRplot 项目用于解决 R 语言中科研绘图的问题,包含了 100 种绘图代码(60 种基础绘图 + 40 种进阶绘图 )。每个绘图都提供了测试数据 ,所有绘图代码都整理到了一个 html 文档中。详细信息见:
sciRcolor 项目用于解决 R 语言科研绘图中颜色选择的问题,包含了 100 种常用配色(60 种离散色 + 40 种连续色 )。并且提供了一个用来预览配色的在线网站 ,以及用来获取配色的 R 包。详细信息见:


