You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ggplot2中基于多基因表达为UMAP上色,实现3色叠加混合效果

实现方案

你当前的实现问题核心是分层绘制三层散点,上层点必然会对下层点产生遮挡,仅调整透明度无法从根本上解决这个问题。正确的实现思路是提前为每个细胞计算三个基因表达量混合后的RGB颜色,仅绘制一层散点即可完美实现叠加混合效果,逻辑和Seurat的FeaturePlot blend功能完全一致。

步骤1:基因表达量归一化

先将三个目标基因的表达量按照你设定的阈值缩放到[0,1]区间:

library(ggplot2)
library(scales)

# 按你设定的表达上下限做归一化,超出阈值的部分用squish截断
FD$FOSL2_norm <- squish(rescale(FD$FOSL2, to = c(0, 1), from = c(0, 0.3)), c(0, 1))
FD$JUNB_norm <- squish(rescale(FD$JUNB, to = c(0, 1), from = c(0.1, 0.2)), c(0, 1))
FD$HES1_norm <- squish(rescale(FD$HES1, to = c(0, 1), from = c(0, 0.3)), c(0, 1))

步骤2:计算混合色

这里采用RGB加色法逻辑,三个基因分别对应红、绿、蓝三个颜色通道,共表达区域会自动混合,低表达区域默认呈现浅灰色:

# 生成混合颜色:低表达为浅灰(rgb(0.9,0.9,0.9)),高表达对应通道拉满
FD$blend_color <- rgb(
  red = 0.9 * (1 - FD$FOSL2_norm) + FD$FOSL2_norm,
  green = 0.9 * (1 - FD$JUNB_norm) + FD$JUNB_norm,
  blue = 0.9 * (1 - FD$HES1_norm) + FD$HES1_norm
)

# 如果你想要更鲜艳的纯色高表达效果,可以用如下版本,低表达为浅灰,高表达为对应通道纯色
# FD$blend_color <- rgb(
#   red = pmax(0.9 - FD$JUNB_norm - FD$HES1_norm, FD$FOSL2_norm),
#   green = pmax(0.9 - FD$FOSL2_norm - FD$HES1_norm, FD$JUNB_norm),
#   blue = pmax(0.9 - FD$FOSL2_norm - FD$JUNB_norm, FD$HES1_norm)
# )

步骤3:绘制UMAP图

仅绘制一层散点,不存在遮挡问题:

ggplot(FD, aes(x = UMAP_1, y = UMAP_2)) +
  geom_point(size = 0.3, color = FD$blend_color) +
  theme_classic() # 可根据需求自定义主题、坐标轴等参数

替代方案

如果你不需要额外自定义ggplot2参数,直接用Seurat自带的FeaturePlot即可原生支持三个基因的blend混合效果:

FeaturePlot(your_seurat_obj, features = c("FOSL2", "JUNB", "HES1"), blend = TRUE)

内容的提问来源于stack exchange,提问作者Ciaran Kennedy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 18:15:03