在Seurat中同时可视化单细胞RNA测序3个特征及二值化问题
单细胞RNA测序UMAP多特征可视化与meta.data列二值化解决方案
一、在UMAP图上同时可视化3个特征
Seurat的DimPlot(blend=TRUE)仅支持同时展示2个特征,但可以通过叠加图层、混合编码规则等方式实现3个特征的可视化,以下是几种实用方法:
方法1:Blend双特征 + 高表达细胞轮廓圈
先绘制两个特征的Blend融合图,再给第三个特征的高表达细胞添加轮廓圈标记:
# 1. 生成双特征Blend基础图 base_plot <- DimPlot(seurat_obj, features = c("FeatureA", "FeatureB"), blend = TRUE) # 2. 定义第三个特征的高表达阈值(示例取前20%的细胞) feature3_threshold <- quantile(seurat_obj@meta.data$FeatureC, 0.8) high_feature3_cells <- rownames(seurat_obj@meta.data)[seurat_obj@meta.data$FeatureC > feature3_threshold] # 3. 叠加轮廓圈到基础图 library(ggplot2) base_plot + geom_point( data = subset(base_plot$data, rownames(base_plot$data) %in% high_feature3_cells), aes(x = UMAP_1, y = UMAP_2), shape = 21, size = 2, fill = NA, color = "black", stroke = 1.2 )
方法2:Blend颜色 + 点形状编码第三个特征
将第三个特征二值化后,用不同的点形状区分高低表达,与Blend颜色结合:
# 1. 给第三个特征做二值化(提前添加到meta.data) seurat_obj$FeatureC_binary <- ifelse(seurat_obj@meta.data$FeatureC > median(seurat_obj@meta.data$FeatureC), "High", "Low") # 2. 绘制Blend图并映射形状 DimPlot(seurat_obj, features = c("FeatureA", "FeatureB"), blend = TRUE) + aes(shape = FeatureC_binary) + scale_shape_manual(values = c("High" = 17, "Low" = 16)) + guides(shape = guide_legend(title = "FeatureC"))
方法3:手动构建ggplot图实现多维度编码
直接提取UMAP坐标和特征值,通过颜色、大小、形状等多种维度同时编码3个特征:
# 1. 提取UMAP坐标与三个特征数据 umap_df <- as.data.frame(seurat_obj@reductions$umap@cell.embeddings) %>% mutate( FeatureA = seurat_obj@assays$RNA@data["FeatureA", ], FeatureB = seurat_obj@assays$RNA@data["FeatureB", ], FeatureC = seurat_obj@meta.data$FeatureC ) # 2. 计算双特征Blend颜色(RGB混合) umap_df$blend_color <- rgb( umap_df$FeatureA / max(umap_df$FeatureA), umap_df$FeatureB / max(umap_df$FeatureB), 0, alpha = 0.7 ) # 3. 用颜色表示双特征Blend,大小表示第三个特征 ggplot(umap_df, aes(x = UMAP_1, y = UMAP_2)) + geom_point(aes(color = blend_color, size = FeatureC)) + scale_color_identity() + scale_size_continuous(range = c(0.5, 2)) + theme_classic() + labs(size = "FeatureC Expression")
二、meta.data自定义列(如模块分数)的二值化
针对AddModuleScore生成的模块分数列,可通过以下方式快速二值化:
方式1:基于固定阈值二值化
# 示例:以中位数为阈值,区分高低表达 module_score_col <- "Module1" # 替换为你的模块分数列名 threshold <- median(seurat_obj@meta.data[[module_score_col]]) seurat_obj@meta.data[[paste0(module_score_col, "_binary")]] <- ifelse( seurat_obj@meta.data[[module_score_col]] > threshold, "High", "Low" )
方式2:基于分位数阈值二值化
适合需要取Top N%高表达细胞的场景:
# 示例:取前30%的细胞为高表达 module_score_col <- "Module1" threshold <- quantile(seurat_obj@meta.data[[module_score_col]], 0.7) seurat_obj@meta.data[[paste0(module_score_col, "_binary")]] <- ifelse( seurat_obj@meta.data[[module_score_col]] > threshold, "High", "Low" )
方式3:用dplyr简化批量二值化
如果有多个模块分数列,可批量处理:
library(dplyr) module_cols <- c("Module1", "Module2", "Module3") # 替换为你的模块列名 seurat_obj@meta.data <- seurat_obj@meta.data %>% mutate(across(all_of(module_cols), ~case_when( . > quantile(., 0.7) ~ "High", TRUE ~ "Low" ), .names = "{.col}_binary"))
内容的提问来源于stack exchange,提问作者kuuchan
相关产品推荐
相关产品推荐

