1引言
之前使用 ggplot 包,结合分面的方法在两个 panel 里面绘制散点和条形图,操作还是有些繁琐和不便的,此外效果也和上图有点差距。见推文 听说你想给聚类图旁边加个细胞数量条形图? 其实你可以完全用 grid 绘制一个这样的图形,我已经打包进 scRNAtoolVis 了,一键便可成图。
此外我也会在文章末尾给出所有的代码,感兴趣的可以研究一下。
2安装
重新安装获取新功能:
install.packages('devtools')
devtools::install_github('junjunlab/scRNAtoolVis')
library(scRNAtoolVis)
3使用
加载内置测试数据:
library(SeuratData)
library(scRNAtoolVis)
rds <- UpdateSeuratObject(object = pbmc3k.final)
一行代码出图:
scatterCellPlot(object = rds)
去除坐标轴:
scatterCellPlot(object = rds,rm.axis = T)
图例添加上细胞编号,在这里需要指定 metadata 信息里面的对应列名:
scatterCellPlot(object = rds,rm.axis = T,cell.id = "seurat_clusters")
修改颜色:
scatterCellPlot(object = rds,rm.axis = T,cell.id = "seurat_clusters",
color = ggsci::pal_npg()(9))
修改条形图 panel 的宽度:
scatterCellPlot(object = rds,bar.width = 0.1)
修改点的大小:
scatterCellPlot(object = rds,point.size = 5)
绘制 tsne 降维的散点图:
pbmc <- Seurat::RunTSNE(rds, dims = 1:10)
Seurat::DimPlot(pbmc, reduction = "tsne")
scatterCellPlot(object = pbmc,dim = "tsne")
4代码详解
首先是从 seurat 对象提取对应降维数据:
object <- rds
# make PC data
reduc <- data.frame(Seurat::Embeddings(object, reduction = "umap"))
# metadata
meta <- object@meta.data
# combine
pc12 <- cbind(reduc, meta)
pc12$idents <- Idents(object)
然后绘制散点图:
grid.newpage()
# grid.rect()
pushViewport(viewport(x = unit(0.1, "npc"), y = unit(0.5, "npc"),
width = unit(0.5, "npc"),
height = unit(0.7, "npc"),
just = "left",
xscale = extendrange(range(pc12$UMAP_1),f = 0.05),
yscale = extendrange(range(pc12$UMAP_2),f = 0.05),
))
grid.rect()
grid.xaxis()
grid.yaxis()
celltype <- unique(pc12$idents)
# create colors
cols <- circlize::rand_color(n = length(celltype))
# draw points
# i = 1
for (i in seq_along(celltype)) {
tmp <- pc12 |> dplyr::filter(idents == celltype[i])
grid.points(x = tmp$UMAP_1,y = tmp$UMAP_2,pch = 19,size = unit(1,"pt"),
gp = gpar(col = cols[i]))
}
grid.segments(x0 = 0.025,x1 = 0.2,y0 = 0.05,y1 = 0.05,
arrow = arrow(length = unit(2,"mm"),type = "closed"),
gp = gpar(fill = "black"))
grid.text(label = "UMAP 1",x = (0.2+0.025)/2,y = 0.025,
gp = gpar(fontsize = 6,fontface = "bold.italic"))
grid.segments(x0 = 0.05,x1 = 0.05,y0 = 0.025,y1 = 0.2,
arrow = arrow(length = unit(2,"mm"),type = "closed"),
gp = gpar(fill = "black"))
grid.text(label = "UMAP 1",x = 0.025,y = (0.2+0.025)/2,rot = 90,gp =
gpar(fontsize = 6,fontface = "bold.italic"))
grid.text(label = "UMAP dimension 1",x = 0.5,y = unit(-2.5,"lines"))
grid.text(label = "UMAP dimension 2",x = unit(-2.5,"lines"),y = 0.5,rot = 90)
popViewport()
绘制右边的条形图:
# summary celltype numbers
cell_num <- pc12 |>
dplyr::group_by(idents,seurat_clusters) |>
dplyr::summarise(n = dplyr::n()) |>
dplyr::arrange(n)
pushViewport(viewport(x = unit(0.61, "npc"), y = unit(0.5, "npc"),
width = unit(0.2, "npc"),
height = unit(0.7, "npc"),
just = "left",
# yscale = extendrange(c(0,nrow(cell_num)),f = 0.05),
# xscale = extendrange(c(0,max(cell_num$n)),f = 0.05),
yscale = c(0,nrow(cell_num) + 0.5),
xscale = c(0,max(cell_num$n) + 0.1*max(cell_num$n))))
grid.xaxis()
# grid.yaxis(main = F)
# grid.rect()
grid.rect(x = rep(0,nrow(cell_num)),y = 1:nrow(cell_num),
width = cell_num$n,height = unit(0.08,"npc"),
just = "left",
gp = gpar(fill = cols,col = NA),
default.units = "native")
grid.rect(gp = gpar(fill = "transparent"))
grid.text(label = "Number of cells",x = 0.5,y = unit(-2.5,"lines"))
# grid.text(label = paste0("N: ",cell_num$n),
# x = unit(cell_num$n/2,"native"),y = unit(1:nrow(cell_num),"native"))
popViewport()
最后绘制图例:
pushViewport(viewport(x = unit(0.81, "npc"), y = unit(0.5, "npc"),
width = unit(0.2, "npc"),
height = unit(0.7, "npc"),
just = "left",
yscale = c(0,nrow(cell_num) + 0.5)))
# grid.rect()
grid.points(x = rep(0.1,nrow(cell_num)),y = 1:nrow(cell_num),pch = 19,
gp = gpar(col = cols),
size = unit(1.5, "char"))
grid.text(label = cell_num$seurat_clusters,x = 0.1,y = 1:nrow(cell_num),
default.units = "native")
grid.text(label = cell_num$idents,x = 0.2,y = 1:nrow(cell_num),
just = "left",
default.units = "native")
popViewport()
这样就搓完了,打包一下变成函数就行了。
5结尾
路漫漫其修远兮,吾将上下而求索。
欢迎加入生信交流群。加我微信我也拉你进 微信群聊 老俊俊生信交流群 (微信交流群需收取 20 元入群费用,一旦交费,拒不退还!(防止骗子和便于管理)) 。QQ 群可免费加入, 记得进群按格式修改备注哦。
声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/306668.html