全库搜索 Markdown 图册
Paper Analysis · 3 分钟阅读

让审稿人一眼喜欢的 UMAP 图:单细胞美化全流程

站内编号 KB-000084
clippings生信教程可视化UMAP单细胞ggunchull群体轮廓短坐标轴ggplot2暂未试用
板块与文章导航

摘要LLM 归库摘要

  • 核心内容: 让 UMAP 更受审稿人喜欢的美化全流程:stat_unchull() 给细胞群加半透明虚线轮廓 + annotate() 画左下角短箭头坐标轴 + 干净主题。与 Seurat 默认 UMAP 的关键区别是强调"每一类细胞整体占据什么区域、群间是否混杂、是否连续过渡"。
  • 适用场景: 单细胞 UMAP/t-SNE 降维图的发表级美化,突出细胞群分布范围、重叠关系与空间边界。
  • 输入: 已完成的 Seurat 对象(含 UMAP 降维 + 细胞注释 celltype.3),或自有 UMAP 坐标。
  • 输出: 带群体轮廓 + 短坐标轴的 UMAP 图(ggplot 对象 plot4),颜色柔和、背景干净。
  • 关键参数/步骤: stat_unchull(alpha=0.22, size=0.35, delta=0.45, linetype="dashed");短轴 annotate("segment")+arrow;配色 mycols;主题去网格/刻度/坐标轴;guides(override.aes) 优化图例。
  • 常见错误: ggunchull 未安装;levels 与 Seurat 注释不一致致 factor NA;mycols 未覆盖全部细胞类型。
  • 与口腔生信连接: 牙周炎/OSCC 单细胞 UMAP 分群图可直接套用,替换 Seurat 对象与 celltype 注释、按细胞类型改配色即可。
  • 下一步处理: 暂未试用;需自己的 Seurat 单细胞对象试跑。
  • 归库说明: 分类到 03 生信教程与工具库(可视化与配色),置信度 0.9,理由:UMAP 美化教程、含完整可复用 R 代码;代码已同步至远程 hz-bioinfo-codes/02_可视化/04_umap/4.2_单细胞UMAP美化/。

让审稿人一眼喜欢的 UMAP 图:单细胞美化全流程

来源公众号:华哥生信 Bioinformation(2026-08-21)| 配套 R 代码已同步至代码库 02_可视化/04_umap/4.2_单细胞UMAP美化/

这类 UMAP 的特点#

与常规 Seurat 默认 UMAP 最大的区别:在细胞群外加半透明的群体轮廓/包络区域,让读者一眼看出不同细胞群的分布范围、重叠关系和空间边界。这种美化版 UMAP 更强调"每一类细胞整体占据什么区域、不同群之间是否混杂、哪些亚群可能连续过渡"。颜色柔和、背景干净、坐标轴简洁,通过虚线边界 + 透明色块增强层次感。

复现流程#

1. 加载包#

library(Seurat)
library(ggplot2)
library(grid)
library(ggunchull)   # 绘制每个细胞群的边界轮廓

2. 读取 Seurat 对象并提取坐标#

# 读取已质控/降维/注释的单细胞对象
load("scRNA.rdata")

plotData <- as.data.frame(scRNA.sub<a href="%22umap%22">&quot;umap&quot;</a>@cell.embeddings)
colnames(plotData)[1:2] <- c("umap_1", "umap_2")
scRNA.sub$celltype <- scRNA.sub$celltype.3
plotData$cluster <- factor(scRNA.sub$celltype,
  levels = c("Tcells", "Myeloid", "Cancer", "Endothelial_cell",
             "Fibroblasts", "Neutrophils", "Bcells"))

3. 自定义配色#

mycols <- c(
  "Tcells" = "#D95F5F", "Myeloid" = "#C9A227", "Cancer" = "#5DAE5D",
  "Endothelial_cell" = "#4DB6AC", "Fibroblasts" = "#4C78A8",
  "Neutrophils" = "#8E77B8", "Bcells" = "#D77FB3"
)

4. 计算短坐标轴位置#

x_range <- range(plotData$umap_1, na.rm = TRUE)
y_range <- range(plotData$umap_2, na.rm = TRUE)
x_min <- x_range[1] - 2; x_max <- x_range[2]
y_min <- y_range[1] - 2; y_max <- y_range[2]
x_span <- x_max - x_min; y_span <- y_max - y_min
x_axis_len <- x_span * 0.18; y_axis_len <- y_span * 0.18
x_axis_start <- x_min - x_span * 0.03; y_axis_start <- y_min - y_span * 0.03
x_lim <- c(x_min - x_span * 0.08, x_max + x_span * 0.05)
y_lim <- c(y_min - y_span * 0.08, y_max + y_span * 0.05)

5. 绘制带群体轮廓的 UMAP(核心)#

plot <- ggplot(plotData, aes(x = umap_1, y = umap_2, color = cluster, fill = cluster)) +
  stat_unchull(alpha = 0.22, size = 0.35, delta = 0.45, linetype = "dashed") +
  geom_point(size = 0.8, alpha = 0.85, stroke = 0) +
  scale_color_manual(values = mycols, name = NULL) +
  scale_fill_manual(values = mycols, name = NULL) +
  coord_fixed(xlim = x_lim, ylim = y_lim, clip = "off") +
  labs(x = NULL, y = NULL) +
  theme_classic(base_size = 12)

6. 调整主题(CNS 风格)#

plot2 <- plot + theme(
  aspect.ratio = 1,
  panel.background = element_blank(), panel.grid = element_blank(),
  axis.line = element_blank(), axis.ticks = element_blank(),
  axis.text = element_blank(), axis.title = element_blank(),
  legend.position = "right", legend.title = element_blank(),
  legend.text = element_text(size = 8),
  legend.key.size = unit(0.35, "cm"),
  legend.background = element_blank(), legend.key = element_blank(),
  plot.margin = margin(20, 20, 20, 20)
)

7. 添加左下角短箭头坐标轴#

plot3 <- plot2 +
  annotate("segment",
    x = x_axis_start, xend = x_axis_start + x_axis_len,
    y = y_axis_start, yend = y_axis_start,
    linewidth = 0.45, color = "black",
    arrow = arrow(length = unit(0.12, "cm"), type = "closed")) +
  annotate("segment",
    x = x_axis_start, xend = x_axis_start,
    y = y_axis_start, yend = y_axis_start + y_axis_len,
    linewidth = 0.45, color = "black",
    arrow = arrow(length = unit(0.12, "cm"), type = "closed")) +
  annotate("text",
    x = x_axis_start + x_axis_len * 0.55,
    y = y_axis_start - y_span * 0.035,
    label = "umap_1", size = 3.5, fontface = "italic") +
  annotate("text",
    x = x_axis_start - x_span * 0.035,
    y = y_axis_start + y_axis_len * 0.55,
    label = "umap_2", size = 3.5, fontface = "italic", angle = 90)

8. 优化图例并输出#

plot4 <- plot3 +
  guides(
    color = guide_legend(override.aes = list(size = 2.5, alpha = 1)),
    fill  = guide_legend(override.aes = list(alpha = 0.25))
  )

常见错误#

问题 原因/解决
stat_unchull 未找到 装 ggunchull 包
factor 出现 NA levels 与注释不一致
配色报错 mycols 未覆盖全部类型

使用说明(可复用)#

  1. 准备含 UMAP 降维 + 细胞注释的 Seurat 对象。
  2. 替换 scRNA.sub 与 celltype 注释列、按细胞类型改 mycols 和 levels。
  3. 完整 R 脚本见远程代码库 hz-bioinfo-codes/02_可视化/04_umap/4.2_单细胞UMAP美化/01_单细胞UMAP美化全流程.R。

参考链接