写在开头
最近在复现并尝试美化一下单细胞测序揭示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(-)免疫/基质细胞比例、全部细胞占比

所以数据整理及可视化可以按照如下步骤:
- 按照是否包含上皮细胞,区分全部细胞及免疫/基质细胞
加载需要的数据及R包
这里用到的是保存了注释信息以及分组信息的结果数据,具体的整理方式可以看Umap图可视化细胞类型比例差异
source('scRNA_scripts/lib.R')
sce.all.int = readRDS('sce.celltype.rds')

根据EGFR+分群取子集并可视化
我们先来复现第一部分,也就是EGFR(+)分组可视化

从图中可以看到有些小细节需要注意:
- 有对应的标题——Immune/stromal cell proportion、Total cell proportion
- 保留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全部的单细胞转录组降维聚类分群,欢迎一起讨论交流学习!