用 grid 手搓一个单细胞散点图+细胞数量条形图

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

(0)
联系我们
联系我们
分享本页
返回顶部