分享

一图胜千言:肿瘤微环境的分组可视化

 健明 2025-04-02 发布于广东

写在开头

最近在复现并尝试美化一下单细胞测序揭示EGFR突变如何改变肺腺癌的免疫微环境的Figure1

在直播分享GSE171145-EGFR突变与否肺腺癌数据集的时候,已经复现了Figure1B

也陆续从Figure1C开始——Umap图可视化细胞类型比例差异,尝试复现并基于自己的理解去尝试使用不同的方式去美化一下结果。

今天一起来看看Figure1的最后一张图,Figure1E——EGFR状态对细胞比例的影响,通过堆叠柱状图去可视化

通过可视化结果发现:

  • T/NK细胞在两种EGFR状态的TME中均占主导地位,且比例相似。
  • EGFR突变型TME:单核细胞(Monocytic cells)、肥大细胞(Mast cells)和内皮细胞(Endothelial cells)的比例更高。
  • EGFR野生型TME:中性粒细胞(Neutrophils)和成纤维细胞(Fibroblasts)的比例更高

EGFR突变型和野生型LUAD的肿瘤微环境在细胞组成上存在显著差异,这些差异可能反映了两种状态下免疫微环境的功能差异,进而影响免疫治疗的反应。

复现思路

首先我们需要拆分一下Figure1E,从图上可以看到可以六个部分,依次是:EGFR(+)的不同样品免疫/基质细胞比例、全部细胞占比;EGFR(-)的不同样品免疫/基质细胞比例、全部细胞占比;以及EGFR(+)/EGFR(-)免疫/基质细胞比例、全部细胞占比

所以数据整理及可视化可以按照如下步骤:

  1. 按照EGFR分组提取需要的数据
  2. 按照是否包含上皮细胞,区分全部细胞及免疫/基质细胞
  3. 再分别按照六个部分去分组计算细胞比例及可视化
  4. 将所有的结果拼到一起进行展示

加载需要的数据及R包

这里用到的是保存了注释信息以及分组信息的结果数据,具体的整理方式可以看Umap图可视化细胞类型比例差异

source('scRNA_scripts/lib.R')
sce.all.int = readRDS('sce.celltype.rds')

根据EGFR+分群取子集并可视化

我们先来复现第一部分,也就是EGFR(+)分组可视化

从图中可以看到有些小细节需要注意:

  1. 有对应的标题——Immune/stromal cell proportion、Total cell proportion
  2. 没有X轴的标签信息
  3. 保留Total cell proportion的图例信息,但是要注意统一配色
##根据EGFR+分群取子集----
sce_EGFR1 <- sce.all.int[,sce.all.int$EGFR_status=='EGFR(+)']
# 去除'epi'细胞亚群
sce_EGFR1.1 <- sce_EGFR1[,sce_EGFR1$celltype != 'epi']

table(sce_EGFR1$celltype)
table(sce_EGFR1.1$celltype)

#immune/stromal cell

tb=table(sce_EGFR1.1$group,sce_EGFR1.1$celltype)
head(tb)

bar_data <- as.data.frame(tb)

bar_per <- bar_data %>% 
  group_by(Var1) %>%
  mutate(sum(Freq)) %>%
  mutate(percent = Freq / `sum(Freq)`)
head(bar_per) 
#write.csv(bar_per,file = "celltype_by_group_percent.csv")
col =c("#3176B7","#d85f4e","#3FA116","#d8869d","#9265C1",
       "#689e46","#5a8ba9","#93c1b6","#885649","#41BED1")
colnames(bar_per)

# 假设bar_per是您的数据框,并且已经定义了col(颜色向量)
# 这里使用ggplot来创建堆叠柱状图
p1 <- ggplot(bar_per, aes(y = percent, x = Var1)) +
  geom_bar(aes(fill = Var2), stat = "identity") + 
  coord_flip() + # 翻转坐标轴,使条形图横向展示
  theme(
    axis.ticks = element_blank(), # 去除坐标轴刻度
    axis.title = element_blank(), # 去除坐标轴标题
    axis.text.x = element_blank(), # 去除x轴文本
    panel.grid.major = element_blank(), # 去除主网格线
    panel.grid.minor = element_blank(), # 去除次网格线
    panel.background = element_blank(), # 去除面板背景
    plot.background = element_blank(), # 去除绘图背景
    legend.position = "none",
    plot.title = element_text(hjust = 0.5) # 设置标题居中
  ) +
  labs(title = "Immune/stromal cell proportion"# 设置主标题
       x = 'Relative proportion'# 设置x轴标题
       fill = NULL) + # 移除图例标题
  scale_fill_manual(values = col) ;p1

#total cell
tb=table(sce_EGFR1$group,sce_EGFR1$celltype)
head(tb)

bar_data <- as.data.frame(tb)

bar_per <- bar_data %>% 
  group_by(Var1) %>%
  mutate(sum(Freq)) %>%
  mutate(percent = Freq / `sum(Freq)`)
head(bar_per) 
#write.csv(bar_per,file = "celltype_by_group_percent.csv")
col =c("#3176B7","#d85f4e","#3FA116","#DD76C5","#d8869d","#9265C1",
       "#689e46","#5a8ba9","#93c1b6","#885649","#41BED1")
colnames(bar_per)


p2 = ggplot(bar_per, aes(y = percent, x = Var1)) +
  geom_bar(aes(fill = Var2), stat = "identity") + 
  coord_flip() + # 翻转坐标轴,使条形图横向展示
  theme(
    axis.ticks = element_blank(), # 去除坐标轴刻度
    axis.title = element_blank(), # 去除坐标轴标题
    axis.text.x = element_blank(), # 去除x轴文本
    panel.grid.major = element_blank(), # 去除主网格线
    panel.grid.minor = element_blank(), # 去除次网格线
    panel.background = element_blank(), # 去除面板背景
    plot.background = element_blank(), # 去除绘图背景
    plot.title = element_text(hjust = 0.5) # 设置标题居中
  ) +
  labs(title = "Total cell proportion"# 设置主标题
       x = 'Relative proportion (%)'# 设置x轴标题
       fill = NULL) + # 移除图例标题
  scale_fill_manual(values = col);p2

p1+p2

根据EGFR-分群取子集

接着就是图表的第二部分,EGFR(-)分组可视化

需要注意的是,第二部分X轴有显示

##根据EGFR-分群取子集----
sce_EGFR2 <- sce.all.int[,sce.all.int$EGFR_status=='EGFR(-)']
# 去除'epi'细胞亚群
sce_EGFR2.1 <- sce_EGFR2[,sce_EGFR2$celltype != 'epi']

table(sce_EGFR2$celltype)
table(sce_EGFR2.1$celltype)
#immune/stromal cell

tb=table(sce_EGFR2.1$group,sce_EGFR2.1$celltype)
head(tb)

bar_data <- as.data.frame(tb)

bar_per <- bar_data %>% 
  group_by(Var1) %>%
  mutate(sum(Freq)) %>%
  mutate(percent = Freq / `sum(Freq)`)
head(bar_per) 
#write.csv(bar_per,file = "celltype_by_group_percent.csv")
col =c("#3176B7","#d85f4e","#3FA116","#d8869d","#9265C1",
       "#689e46","#5a8ba9","#93c1b6","#885649","#41BED1")
colnames(bar_per)

# 假设bar_per是您的数据框,并且已经定义了col(颜色向量)
# 这里使用ggplot来创建堆叠柱状图
p3 <- ggplot(bar_per, aes(y = percent, x = Var1)) +
  geom_bar(aes(fill = Var2), stat = "identity") + 
  coord_flip() + # 翻转坐标轴,使条形图横向展示
  theme(
    axis.ticks = element_blank(), # 去除坐标轴刻度
    axis.title = element_blank(), # 去除坐标轴标题
    legend.position = "none",
    panel.grid.major = element_blank(), # 去除主网格线
    panel.grid.minor = element_blank(), # 去除次网格线
    panel.background = element_blank(), # 去除面板背景
    plot.background = element_blank() # 去除绘图背景
  ) +
  labs(y = "", fill = NULL) + # 去除y轴标签和图例标题
  labs(x = 'Relative proportion(%)') +
  scale_fill_manual(values = col);p3 # 使用自定义颜色

#total cell
tb=table(sce_EGFR2$group,sce_EGFR2$celltype)
head(tb)

bar_data <- as.data.frame(tb)

bar_per <- bar_data %>% 
  group_by(Var1) %>%
  mutate(sum(Freq)) %>%
  mutate(percent = Freq / `sum(Freq)`)
head(bar_per) 
#write.csv(bar_per,file = "celltype_by_group_percent.csv")
col =c("#3176B7","#d85f4e","#3FA116","#DD76C5","#d8869d","#9265C1",
       "#689e46","#5a8ba9","#93c1b6","#885649","#41BED1")
colnames(bar_per)


p4 = ggplot(bar_per, aes(y = percent, x = Var1)) +
  geom_bar(aes(fill = Var2), stat = "identity") + 
  coord_flip() + # 翻转坐标轴,使条形图横向展示
  theme(
    axis.ticks = element_blank(), # 去除坐标轴刻度
    axis.title = element_blank(), # 去除坐标轴标题
    legend.position = "none",
    panel.grid.major = element_blank(), # 去除主网格线
    panel.grid.minor = element_blank(), # 去除次网格线
    panel.background = element_blank(), # 去除面板背景
    plot.background = element_blank() # 去除绘图背景
  ) +
  labs(y = "", fill = NULL) + # 去除y轴标签和图例标题
  labs(x = 'Relative proportion(%)') +
  scale_fill_manual(values = col);p4

p3+p4

然后将这两个部分先拼接到一起,再与最后一部分内容合并

##全部拼图
p <- (p1+p2) / (p3+p4)

按照分组绘制堆叠柱状图

前两部分,是基于EGFR分组提取了需要的数据之后,按照样品信息进行的可视化,最后一部分内容就直接基于EGFR的分组,展示了免疫/基质以及全部细胞占比的情况

##按照分组绘制堆叠柱状图----
# 去除'epi'细胞亚群
sce_EGFR <- sce.all.int[,sce.all.int$celltype != 'epi']

table(sce.all.int$celltype)
table(sce_EGFR$celltype)
#immune/stromal cell

tb=table(sce_EGFR$EGFR_status,sce_EGFR$celltype)
head(tb)

bar_data <- as.data.frame(tb)

bar_per <- bar_data %>% 
  group_by(Var1) %>%
  mutate(sum(Freq)) %>%
  mutate(percent = Freq / `sum(Freq)`)
head(bar_per) 
#write.csv(bar_per,file = "celltype_by_group_percent.csv")
col =c("#3176B7","#d85f4e","#3FA116","#d8869d","#9265C1",
       "#689e46","#5a8ba9","#93c1b6","#885649","#41BED1")
colnames(bar_per)

# 假设bar_per是您的数据框,并且已经定义了col(颜色向量)
# 这里使用ggplot来创建堆叠柱状图
p5 <- ggplot(bar_per, aes(y = percent, x = Var1)) +
  geom_bar(aes(fill = Var2), stat = "identity") + 
  coord_flip() + # 翻转坐标轴,使条形图横向展示
  theme(
    axis.ticks = element_blank(), # 去除坐标轴刻度
    axis.title = element_blank(), # 去除坐标轴标题
    legend.position = "none",
    panel.grid.major = element_blank(), # 去除主网格线
    panel.grid.minor = element_blank(), # 去除次网格线
    panel.background = element_blank(), # 去除面板背景
    plot.background = element_blank() # 去除绘图背景
  ) +
  labs(y = "", fill = NULL) + # 去除y轴标签和图例标题
  labs(x = 'Relative proportion(%)') +
  scale_fill_manual(values = col);p5 # 使用自定义颜色

#total cell
tb=table(sce.all.int$EGFR_status,sce.all.int$celltype)
head(tb)

bar_data <- as.data.frame(tb)

bar_per <- bar_data %>% 
  group_by(Var1) %>%
  mutate(sum(Freq)) %>%
  mutate(percent = Freq / `sum(Freq)`)
head(bar_per) 
#write.csv(bar_per,file = "celltype_by_group_percent.csv")
col =c("#3176B7","#d85f4e","#3FA116","#DD76C5","#d8869d","#9265C1",
       "#689e46","#5a8ba9","#93c1b6","#885649","#41BED1")
colnames(bar_per)


p6 = ggplot(bar_per, aes(y = percent, x = Var1)) +
  geom_bar(aes(fill = Var2), stat = "identity") + 
  coord_flip() + # 翻转坐标轴,使条形图横向展示
  theme(
    axis.ticks = element_blank(), # 去除坐标轴刻度
    axis.title = element_blank(), # 去除坐标轴标题
    legend.position = "none",
    panel.grid.major = element_blank(), # 去除主网格线
    panel.grid.minor = element_blank(), # 去除次网格线
    panel.background = element_blank(), # 去除面板背景
    plot.background = element_blank() # 去除绘图背景
  ) +
  labs(y = "", fill = NULL) + # 去除y轴标签和图例标题
  labs(x = 'Relative proportion(%)') +
  scale_fill_manual(values = col);p6


p7 <- p5+p6

全部图片拼接到一起

因为刚刚已经将拼接的内容都分别赋值给p和p7了,所以接下来就直接将两个图拼接到一起即可

p+p7

文章中想要可视化免疫及基质细胞在肿瘤微环境中的占比情况,所以将其单独提取出来进行展示,并且和全部细胞比例可视化的结果做了对比

文末友情宣传

如果你也想做单细胞转录组数据分析,最好是有自己的计算机资源哦,比如我们的满足你生信分析计算需求的低价解决方案,而且还需要有基本的生物信息学基础,也可以看看我们的生物信息学马拉松授课,你的生物信息学入门课。

2025年也会继续学习分享单细胞内容,并且组建了交流群——承包你2025全部的单细胞转录组降维聚类分群,欢迎一起讨论交流学习!

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多