UMAP 图经常出现在单细胞文章的第一组结果里但真正好看的 UMAP 不只是“点很多”。这张图的重点是把 细胞群范围、颜色体系、外置标签和坐标轴 做得清楚让读者不用反复对照图例也能快速读懂细胞组成。图片来源项目内容文章B cells disrupt tertiary lymphoid structure formation and suppress antitumor immunity期刊/年份Cancer Cell, 2026图号Fig. 1FDOI/链接https://doi.org/10.1016/j.ccell.2025.12.011原图展示了膀胱癌组织样本的 scRNA-seq UMAP 分布不同颜色代表不同细胞大类包括 epithelial cells、T cells、B cells、myeloid cells、fibroblast cells 等。图片解读这张图的视觉层次可以分成四部分UMAP 点云每个点代表一个细胞半透明细胞群区域帮助读者快速识别每类细胞的大致分布外置细胞类型标签直接把标签放在对应细胞群附近减少图例查找成本简化坐标轴只保留 UMAP_1 和 UMAP_2 的方向提示。这类图不建议把所有信息都塞进图例。对于细胞大类不多的 UMAP直接在图中标注名称阅读体验会更好。输入数据这里建议准备两张表。第一张是细胞坐标表umap_cells.csv列名含义cell_id细胞编号cell_type细胞类型UMAP_1UMAP 横坐标UMAP_2UMAP 纵坐标第二张是细胞类型信息表cell_type_info.csv列名含义cell_type细胞类型color细胞类型颜色label_x标签横坐标label_y标签纵坐标library(tidyverse)library(grid)umap_cells-read_csv(umap_cells.csv,show_col_typesFALSE)cell_type_info-read_csv(cell_type_info.csv,show_col_typesFALSE)需要示例数据的后台添加小编领取调整好数据结构以下代码可以直接复制粘贴运行。第一步整理细胞类型顺序和配色先从cell_type_info.csv中读取颜色保证点、半透明区域和文字标签使用同一套颜色。cell_cols-setNames(cell_type_info$color,cell_type_info$cell_type)umap_cells-umap_cells|mutate(cell_typefactor(cell_type,levelscell_type_info$cell_type))cell_type_info-cell_type_info|mutate(cell_typefactor(cell_type,levelscell_type))第二步绘制细胞群半透明区域这里用stat_ellipse()给每个细胞类型加一个半透明范围。它不是必须的但在细胞群比较分散时可以让结构更容易被读出来。stat_ellipse(geompolygon,level0.93,alpha0.18,linewidth0,show.legendFALSE)第三步叠加 UMAP 点云和细胞类型标签先画点再用geom_text()根据label_x和label_y放置细胞类型名称。geom_point(size0.20,alpha0.80,stroke0,show.legendFALSE)geom_text(datacell_type_info,aes(label_x,label_y,labelcell_type,colorcell_type),inherit.aesFALSE,size4.6,fontfaceplain,show.legendFALSE)第四步添加简化 UMAP 坐标轴论文图里常见的做法是不显示完整坐标轴只保留两个箭头表示 UMAP_1 和 UMAP_2 的方向。annotate(segment,x-3.90,xend-2.55,y-2.50,yend-2.50,arrowarrow(lengthunit(0.11,inches),typeclosed),linewidth0.58)annotate(segment,x-3.90,xend-3.90,y-2.50,yend-1.55,arrowarrow(lengthunit(0.11,inches),typeclosed),linewidth0.58)annotate(text,x-3.15,y-2.78,labelUMAP_1,size3.5)annotate(text,x-4.25,y-2.00,labelUMAP_2,angle90,size3.5)完整代码library(tidyverse)library(grid)umap_cells-read_csv(umap_cells.csv,show_col_typesFALSE)cell_type_info-read_csv(cell_type_info.csv,show_col_typesFALSE)cell_cols-setNames(cell_type_info$color,cell_type_info$cell_type)umap_cells-umap_cells|mutate(cell_typefactor(cell_type,levelscell_type_info$cell_type))cell_type_info-cell_type_info|mutate(cell_typefactor(cell_type,levelscell_type))p-ggplot(umap_cells,aes(UMAP_1,UMAP_2,colorcell_type,fillcell_type))stat_ellipse(geompolygon,level0.93,alpha0.18,linewidth0,show.legendFALSE)geom_point(size0.20,alpha0.80,stroke0,show.legendFALSE)geom_text(datacell_type_info,aes(label_x,label_y,labelcell_type,colorcell_type),inherit.aesFALSE,size4.6,fontfaceplain,show.legendFALSE)annotate(segment,x-3.90,xend-2.55,y-2.50,yend-2.50,arrowarrow(lengthunit(0.11,inches),typeclosed),linewidth0.58)annotate(segment,x-3.90,xend-3.90,y-2.50,yend-1.55,arrowarrow(lengthunit(0.11,inches),typeclosed),linewidth0.58)annotate(text,x-3.15,y-2.78,labelUMAP_1,size3.5)annotate(text,x-4.25,y-2.00,labelUMAP_2,angle90,size3.5)annotate(segment,x-4.35,xend4.05,y3.10,yend3.10,linewidth0.65)scale_color_manual(valuescell_cols)scale_fill_manual(valuescell_cols)labs(titlescRNA-seq of BCa tissues (n14: R7, NR7))coord_equal(xlimc(-4.45,4.25),ylimc(-3.05,3.30),clipoff)theme_void(base_size13)theme(plot.titleelement_text(hjust0.5,size14.5,faceplain,marginmargin(b8)),plot.marginmargin(8,8,8,8))ggsave(scRNA_BCa_annotated_umap.png,p,width7.1,height5.7,dpi320,bgwhite)ggsave(scRNA_BCa_annotated_umap.pdf,p,width7.1,height5.7,bgwhite)复现结果参考链接DOI: https://doi.org/10.1016/j.ccell.2025.12.011文章链接: https://www.cell.com/cancer-cell/fulltext/S1535-6108(25)00545-8PubMed: https://pubmed.ncbi.nlm.nih.gov/41512868/