单细胞marker基因可视化的进阶探索:密度图与等高线图的实战解析

张开发
2026/4/16 5:36:45 15 分钟阅读

分享文章

单细胞marker基因可视化的进阶探索:密度图与等高线图的实战解析
1. 为什么你需要密度图和等高线图做了这么久的单细胞数据分析你是不是也和我一样感觉自己的可视化工具箱有点“审美疲劳”了每天打开RStudio流程化地跑出UMAP图、小提琴图、气泡图然后指着那些彩色的点告诉合作者“看这是我们的细胞亚群这个基因在这里高表达。” 说实话这套流程很稳能解决大部分问题但有时候总觉得缺了点什么。我遇到过好几次这样的情况一个关键的marker基因比如免疫分析里绕不开的CD4和CD8A在UMAP图上确实能看到它们在某些区域表达但表达强度到底是怎么分布的是均匀地散落在整个亚群里还是高度集中在某个核心区域有没有可能存在一小群细胞它们同时表达这两个基因但因为数量少、信号弱在常规的点图上被淹没在了背景噪音里这些问题传统的点图FeaturePlot很难给你一个清晰、直观的答案。这时候密度图和等高线图就该登场了。别被它们的名字吓到你可以把它们理解成单细胞数据可视化的“地形图”和“等高线地图”。想象一下UMAP图是一片广袤的平原每个细胞是一个点。密度图就像是在这片平原上测量海拔基因表达高的地方“海拔”就高最终形成连绵起伏的山脉让你一眼就能看到基因表达的“高峰”和“洼地”。而等高线图则是在这张地形图上画出等高的线清晰地勾勒出表达水平的梯度变化告诉你从“山脚”到“山顶”的路径和范围。所以这两种图的核心价值就在于它们揭示了空间分布密度和基因表达梯度这两个被常规可视化忽略的维度。它们不是用来替代UMAP或小提琴图的而是一个强大的“进阶补充”。当你已经完成了基础的细胞分群和marker鉴定想要更精细地剖析某个特定基因的表达模式或者想挖掘那些隐秘的共表达细胞群时密度图和等高线图就是你手里的“放大镜”和“等高仪”。2. 密度图实战用Nebulosa包挖掘隐藏的共表达信号密度图尤其是基于核密度估计Kernel Density Estimation, KDE的密度图是我最近特别喜欢用的一个工具。它最大的魅力在于能把离散的细胞点信号转换成一片平滑、连续的“表达景观”。这让你对基因表达的空间模式有一个整体性的把握。2.1 核密度估计它到底在画什么在深入代码之前我们花一分钟搞懂核密度估计在干什么。这能帮你更好地理解结果而不是把它当黑箱。假设你的UMAP图上有1000个细胞其中200个高表达CD4基因。传统的点图就是把这200个点标成红色。但密度图不这么做。它会在每一个高表达细胞的位置上放置一个温柔的“小山包”数学上叫核函数比如高斯核。然后它把所有这些小山包叠加起来。最终细胞越密集、表达信号越强的区域叠加出来的“山”就越高细胞稀疏、表达弱的区域“地势”就越平坦。这个过程带来的好处是抗噪声能力强一两个细胞的异常高表达不会像点图那样显得很扎眼它会被平滑到周围区域。凸显模式能清晰显示基因表达的核心热点区域山峰和表达边界山脚。利于发现共表达这是最关键的。当你在同一张图上叠加两个基因如CD4和CD8A的密度时它们的“山峰”重叠的区域自然就指示了双阳性细胞最可能聚集的地方。2.2 手把手用Nebulosa绘制密度图Nebulosa包是专门为单细胞数据密度可视化而生的用起来非常顺手。首先确保你的Seurat对象这里假设叫scedata已经处理好了并且运行过RunUMAP。# 1. 安装并加载包 # 如果还没安装用下面这行代码 if (!requireNamespace(BiocManager, quietly TRUE)) install.packages(BiocManager) BiocManager::install(Nebulosa) library(Nebulosa) library(Seurat) # 2. 绘制单个基因的密度图 plot_density(scedata, features CD4)运行这行代码你会得到一张和UMAP图形状相同但用颜色梯度表示CD4表达密度的图。颜色越暖如黄色、红色代表该区域CD4的表达密度越高。你立刻就能看出CD4 T细胞并不是均匀分布在其所属的亚群中而是更集中在该亚群的某一部分。接下来是重头戏联合密度图Joint Density用于探索共表达。# 3. 绘制两个基因的联合密度图寻找共表达区域 p - plot_density(scedata, features c(CD4, CD8A), joint TRUE) print(p)当joint TRUE时Nebulosa会进行一个巧妙的操作它分别计算CD4和CD8A的密度然后将这两个密度值相乘或者进行其他形式的联合。在最终图像上颜色代表的是这个“联合密度”。因此颜色最亮的区域就是CD4密度高且CD8A密度也高的区域——也就是双阳性细胞最可能富集的地方。解读技巧我一般会同时生成三张图CD4单独密度图、CD8A单独密度图、以及它们的联合密度图。对比着看。如果联合密度图的高亮区域恰好重叠在两个单独密度图各自的“半山腰”或“山脚”而非顶峰这可能暗示存在一群独特的、中等表达水平的双阳性细胞而不是简单地由两个单阳性群体混杂而成。这对于鉴定像CD4 CD8 双阳性T细胞这样的过渡态或特殊功能亚群非常有帮助。2.3 调整参数让你的图更清晰默认参数可能不适合所有数据尤其是当你的细胞数特别多或特别少时。plot_density有几个关键参数可以调整method: 密度估计方法。默认是ks基于ks包你也可以试试wkde加权核密度估计有时边界处理得更平滑。adjust: 平滑带宽调整因子。这是最重要的参数之一adjust值越大密度估计越平滑“山峰”越宽胖值越小密度估计越尖锐“山峰”越细瘦可能捕捉到更细微的结构但也更容易受噪声影响。我通常会在0.5到2之间尝试。palette: 颜色板。默认是viridis你也可以用magma,inferno等或者自定义颜色向量。# 尝试不同的平滑参数 p1 - plot_density(scedata, CD4, adjust 0.5) # 更尖锐细节多 p2 - plot_density(scedata, CD4, adjust 2) # 更平滑大局观好 cowplot::plot_grid(p1, p2, ncol2)多试试不同的adjust值找到最能清晰展示你感兴趣模式的那个平衡点。3. 等高线图实战用ggplot2精确勾勒表达梯度如果说密度图给了你一幅壮丽的3D地形沙盘那么等高线图就是铺在这个沙盘上的专业等高线地图。它不强调“山”的绝对高度有多鲜艳而是用一圈圈的闭合曲线精确地告诉你不同表达水平的边界在哪里。3.1 等高线图能解决什么问题在我自己的分析中我主要用等高线图来干两件事定义表达边界当一个基因的表达在某个亚群内呈现梯度变化时比如从一群细胞的中心到边缘表达量逐渐降低等高线可以清晰地画出“高表达核心区”、“中等表达区”和“低表达/无表达区”的界限。这对于后续的定量分析比如计算各区域细胞数量很有帮助。增强视觉对比在颜色对比不强烈的FeaturePlot上叠加等高线能立刻让表达梯度凸显出来让图片更适合用于出版物视觉效果更专业。3.2 在Seurat的FeaturePlot上叠加等高线其实用ggplot2的stat_density_2d图层在FeaturePlot上叠加等高线非常简单。关键在于我们需要从Seurat对象中提取出细胞的UMAP坐标和特定基因的表达量然后将其转换为ggplot2能处理的数据框。这里我分享一个我最常用的、步骤清晰的代码流程# 1. 提取所需数据 # 获取UMAP坐标 umap_data - as.data.frame(scedatareductions$umapcell.embeddings) colnames(umap_data) - c(UMAP_1, UMAP_2) # 获取目标基因例如LUM的表达矩阵这里用log归一化后的数据 gene_expr - FetchData(scedata, vars LUM) # 假设基因名是LUM colnames(gene_expr) - expression # 合并坐标和表达量 plot_df - cbind(umap_data, gene_expr) # 2. 创建基础的散点图FeaturePlot的底层就是它 base_plot - ggplot(plot_df, aes(x UMAP_1, y UMAP_2, color expression)) geom_point(size 0.8, alpha 0.6) # 点的大小和透明度可调 scale_color_gradientn(colors c(lightgrey, blue, seagreen2, yellow, red)) theme_classic() labs(title LUM Expression with Contours) # 3. 关键一步为等高线图层准备数据 # 等高线是基于点的空间密度绘制的但我们需要的是基于“高表达细胞”的密度。 # 因此我们筛选出表达量高于某个阈值的细胞来画等高线。 # 例如取表达量大于0.5的细胞这个阈值需要根据你的数据调整 high_expr_cells - plot_df[plot_df$expression 0.5, ] # 4. 叠加等高线 final_plot - base_plot stat_density_2d( data high_expr_cells, # 使用高表达细胞的数据 aes(x UMAP_1, y UMAP_2), color black, # 等高线颜色 size 0.5, # 等高线粗细 linetype solid, bins 10, # 等高线的数量控制疏密 alpha 0.7 # 透明度 ) print(final_plot)代码解读与避坑指南阈值plot_df$expression 0.5这是成败的关键。直接用所有细胞画等高线会得到细胞分布的轮廓而不是基因表达的轮廓。我们必须用一个表达量阈值来筛选出“信号细胞”。这个阈值怎么定我通常先看基因表达量的分布用VlnPlot或summary(plot_df$expression)然后用中位数或一个明显的分位数作为初始值再根据图形效果微调。bins参数控制画多少条等高线。bins值越大线越密描绘得越精细值越小线越疏只勾勒主要轮廓。从5到20之间尝试。颜色搭配等高线颜色这里用黑色一定要和底层的点图颜色有足够对比度。如果背景是深色可以用白色或亮黄色的等高线。3.3 进阶技巧多基因等高线叠加与定制化你甚至可以尝试为两个相关的基因分别画上不同颜色的等高线叠加在同一张UMAP底图上直观地看它们的表达区域是如何交错、重叠或分离的。这需要一些更复杂的ggplot2操作但原理相通分别筛选、分别添加stat_density_2d图层并指定不同的color。# 假设我们想比较基因A和基因B plot_df - cbind(umap_data, FetchData(scedata, vars c(GeneA, GeneB))) base_plot - ggplot(plot_df, aes(xUMAP_1, yUMAP_2)) geom_point(size0.5, colorgrey90) theme_classic() # 为GeneA添加红色等高线表达量1的细胞 contour_a - base_plot stat_density_2d(data plot_df[plot_df$GeneA 1, ], aes(xUMAP_1, yUMAP_2), colorred, bins8, size0.6) # 为GeneB添加蓝色等高线表达量0.8的细胞 contour_ab - contour_a stat_density_2d(data plot_df[plot_df$GeneB 0.8, ], aes(xUMAP_1, yUMAP_2), colorblue, bins8, size0.6, linetypedashed) # 用虚线区分 print(contour_ab)通过这种方式你可以非常直观地判断两个基因是共定位等高线基本重合还是互补分布等高线占据不同区域亦或是部分重叠。4. 密度图 vs. 等高线图如何选择与搭配使用到了这里你可能会问我到底该用密度图还是等高线图它们看起来有点类似。根据我的实战经验它们的侧重点不同完全可以搭配使用。密度图更像一个“发现工具”。它的色彩视觉冲击力强能快速吸引你注意到表达的热点区域和共表达的潜在区域。特别是Nebulosa的联合密度模式在筛查双阳性或共表达细胞群时非常高效。它的输出是“全景式”的适合在探索性数据分析阶段使用。等高线图更像一个“界定工具”。它用精确的线条来划定边界适合在你已经确定了目标基因和感兴趣的区域后进行更精细的量化描述和展示。它的结果更“分析式”常用于论文插图中清晰地展示表达梯度。在实际项目中我的动线往往是这样的第一阶段探索用UMAP和FeaturePlot定位大致感兴趣的亚群和基因。第二阶段深挖对关键marker基因如CD4, CD8A使用Nebulosa的plot_density特别是联合密度图看看有没有意外的共表达热点。第三阶段验证与展示如果发现了有趣的模式比如一个梯度表达或一个清晰的共表达核心。我会用等高线图在FeaturePlot上把这个模式的边界精确地画出来用于报告或论文。同时我可能会回到Seurat用等高线定义的区域通过坐标筛选提取出这群细胞进一步做差异表达分析来验证其独特性。一个重要的注意事项无论是密度图还是等高线图它们展示的都是“趋势”而不是绝对的细胞分类。密度图上的一个“山峰”可能对应几百个细胞等高线内圈的区域细胞可能更“典型”。但它们不能替代基于聚类算法的细胞亚群定义。它们的最佳角色是作为你现有分析结果的“增强镜”和“补充证据”帮助你对细胞状态进行更细腻的解读或者提出新的、可供验证的生物学假设。5. 结合真实场景从图谱到生物学洞察让我们构想一个更具体的场景把前面的技术串起来。假设你正在分析一个肿瘤浸润免疫细胞的单细胞数据集你已经用常规方法鉴定出了CD4 T细胞、CD8 T细胞、Treg细胞等大类。问题你注意到CD8 T细胞亚群内部在UMAP上似乎有些扩散你怀疑其中可能包含了功能状态不同的细胞比如耗竭型T细胞Tex和记忆型T细胞Tmem。思路选择marker基因已知Tex高表达PDCD1, LAG3, HAVCR2 (TIM-3)Tmem高表达IL7R, CCR7。密度图筛查使用Nebulosa绘制PDCD1和IL7R的联合密度图。plot_density(scedata, features c(PDCD1, IL7R), joint TRUE)你可能会发现在CD8 T细胞的区域出现了两个不同的亮点一个偏向PDCD1高密度耗竭特征一个偏向IL7R高密度记忆特征甚至可能有一个区域两者密度都中等提示中间状态。等高线图界定针对PDCD1在CD8 T细胞所在的UMAP区域可能需要先subset数据叠加等高线。cd8_cells - subset(scedata, idents CD8_T_cells) # 假设你已经命名了这个亚群 # ... 提取坐标和表达量绘制FeaturePlot叠加PDCD1的等高线方法见3.2节等高线会清晰地勾勒出PDCD1高表达细胞的核心区域。你可以数一下核心区域内的细胞数或者计算这个区域细胞与其他CD8 T细胞在其它基因表达上的差异。生物学验证根据密度图和等高线图提供的线索你可以回到Seurat尝试在CD8 T细胞亚群内进行亚聚类sub-clustering或者使用已知的基因集评分方法如AddModuleScore来定量评估每个细胞的耗竭或记忆程度看看是否与可视化提示的模式吻合。这个过程就是从“看图说话”到“假设驱动”的分析升级。密度图和等高线图在这里扮演了“线索发现者”和“模式界定者”的角色引导你去关注数据中那些可能被简单点图忽略的细微结构。说到底单细胞数据分析的魅力就在于从海量数据中抽丝剥茧讲好细胞的故事。UMAP、小提琴图给了你故事的章节大纲而密度图和等高线图则能帮你润色其中的细节段落甚至发现隐藏的支线情节。下次当你觉得常规可视化有点“不够味”的时候不妨把这套组合拳拿出来试试说不定就能看到之前未曾留意的风景。

更多文章