使用Seurat可视化成纤维细胞中单基因空间表达的问题
问题描述
我想要仅在成纤维细胞中绘制目标基因ABL1的表达,但使用ImageDimPlot时,即便已将数据子集化为仅包含成纤维细胞,仍会显示该基因在所有组织中的表达信号。已知每个细胞内基因的x、y坐标与细胞自身的x、y坐标不相同,尝试过通过设定坐标阈值筛选,但视觉精度达不到要求。
尝试过的代码
# 基于"subset"元数据设置细胞身份 Idents(nano.obj_all) <- nano.obj_all$subset # 创建新元数据列'plot_group',分为两个层级: # subset为"epi"的细胞标记为"Epithelial",其余标记为"Other" nano.obj_all$plot_group <- ifelse(nano.obj_all$subset == "epi", "Epithelial", "Other") # 根据指定身份定义要绘制的细胞 cells_to_plot <- WhichCells(nano.obj_all, idents = c("epi", "stroma", "myeloids", "tcells", "plasmas")) # 重复设置细胞身份(冗余代码) Idents(nano.obj_all) <- nano.obj_all$subset # 重复创建plot_group列(冗余代码) nano.obj_all$plot_group <- ifelse(nano.obj_all$subset == "epi", "Epithelial", "Other") # 强制因子层级匹配 nano.obj_all$plot_group <- factor(nano.obj_all$plot_group, levels = c("Epithelial", "Other")) # 重复定义要绘制的细胞(冗余代码) cells_to_plot <- WhichCells(nano.obj_all, idents = c("epi", "stroma", "myeloids", "tcells", "plasmas")) # 定义视野列表 fovs <- c("Hia", "Hib", "Hic", "Cia", "Cib", "Cic", "Uia", "Uib", "Uic") # 循环每个视野,创建ImageDimPlot并保存为PNG for (f in fovs) { p <- ImageDimPlot(nano.obj_all, fov = f, cells = cells_to_plot, molecules = "ABL1", group.by = "plot_group", # 使用自定义分组列着色 size = 0.6, cols = c("Epithelial" = "#4A82F7", "Other" = "#F0B041"), # 手动指定颜色 ) + labs(title = f) ggsave(filename = paste0("ImageDimPlot_CellType_", f, ".png"), plot = p, width = 12, height = 12, dpi = 350) cat("Saved plot for fov:", f, "\n") }
解决方案
核心问题是:ImageDimPlot的molecules = "ABL1"参数会默认加载所有视野下所有细胞的ABL1分子信号,即便你用cells参数指定只显示成纤维细胞,分子层面并未被过滤。要实现仅显示成纤维细胞内的目标基因,需先从Seurat对象中提取成纤维细胞对应的分子数据,再传递给绘图函数。
修改后的代码
假设你的成纤维细胞对应的subset标识是stroma,请根据实际情况调整:
library(Seurat) # 1. 筛选成纤维细胞的细胞ID fibroblast_cells <- WhichCells(nano.obj_all, idents = "stroma") # 2. 提取所有ABL1分子的坐标及所属细胞、视野信息 abl1_molecules <- GetTissueCoordinates(nano.obj_all, features = "ABL1", cols = c("x", "y", "cell", "fov")) # 3. 过滤出仅属于成纤维细胞的ABL1分子 fibroblast_abl1 <- abl1_molecules[abl1_molecules$cell %in% fibroblast_cells, ] # 定义视野列表 fovs <- c("Hia", "Hib", "Hic", "Cia", "Cib", "Cic", "Uia", "Uib", "Uic") # 循环绘制每个视野的成纤维细胞ABL1表达 for (f in fovs) { # 过滤当前视野下的成纤维细胞ABL1分子 current_fov_molecules <- fibroblast_abl1[fibroblast_abl1$fov == f, ] p <- ImageDimPlot(nano.obj_all, fov = f, cells = fibroblast_cells, # 仅绘制成纤维细胞 molecules = current_fov_molecules, # 仅显示成纤维细胞内的ABL1 group.by = "subset", # 按细胞类型着色 size = 0.6, cols = c("stroma" = "#F0B041") # 成纤维细胞的颜色 ) + labs(title = paste0(f, " - 成纤维细胞ABL1表达")) ggsave(filename = paste0("Fibroblast_ABL1_", f, ".png"), plot = p, width = 12, height = 12, dpi = 350) cat("已保存视野", f, "的图像\n") }
关键说明
- 先通过
GetTissueCoordinates提取目标基因的所有分子信息,再通过cell列关联到成纤维细胞ID,实现分子层面的精准过滤 - 循环中针对每个视野单独过滤分子,避免跨视野的信号干扰
- 移除了原代码中的冗余重复部分,简化逻辑
内容的提问来源于stack exchange,提问作者samuel arthur
相关产品推荐
相关产品推荐

