首页> 关于我们 >新闻中心>技术分享>新闻详情

论如何绘制CNS级别的单细胞高分美图(附代码版本)(六):多组火山图

2025-06-09

火山图(Volcano Plot)是单细胞转录组测序数据分析中常用的可视化工具,它通过将基因的差异表达程度(fold change,FC)和统计学显著性(p-value 或调整后的 p-value,如 FDR)相结合,直观地展示基因在不同组别或细胞类型下的差异表达情况。

相比于普通火山图,多组火山图可以展示更多分组或细胞类型,如下图所示,表示的是每个细胞类型中的上下调基因情况,和普通火山图一样,根据log2FC和矫正后P值进行绘制,红色散点表示上调基因,蓝色散点表示下调基因。

一般情况下,大家可能会画6张传统的火山图,用曼哈顿火山图一张就可以搞定!是不是很有用!是不是很想学!那我们现在就开始绘制!

第一步骤:准备数据

markers为组间比较结果的差异基因表格或findAllmarker结果的基因列表

markers = markers %>% filter(p_val < 0.05) %>% filter(abs(avg_log2FC) >= 0.25)

scRNA.markers = markers

scRNA.markers$label <- ifelse(scRNA.markers$avg_log2FC<0,"sigDown","sigUp")

topgene <- scRNA.markers %>%

group_by(celltype) %>%

top_n(n = 10, wt = avg_log2FC) %>%

bind_rows(group_by(scRNA.markers, celltype) %>%

top_n(n = 10, wt = -avg_log2FC))

dfbar = scRNA.markers %>%

group_by(celltype) %>%

summarise(low = round(min(avg_log2FC)-0.5),

up = round(max(avg_log2FC)+0.5))

得到如图所示数据:

第二步骤:绘制灰色背景柱和分组散点

p1 <- ggplot()+

geom_col(aes(x = celltype ,y = low),dfbar,

fill = "#dcdcdc",alpha = 0.6)+

geom_col(aes(x = celltype ,y = up),dfbar,

fill = "#dcdcdc",alpha = 0.6)+

geom_jitter(aes(x = celltype, y = avg_log2FC, color = label),scRNA.markers,

size = 1,alpha=0.5,position = position_jitter(seed = 1234,width =0.4))+

scale_color_manual(values = c("#0077c0","#c72d2e"))+

theme_classic()

第三步骤:添加分组颜色色块和标签

p2 <- p1 +

geom_tile(aes(x = ctys,y = 0),NULL,

height = 0.5,fill = mycol, show.legend = F,alpha = 0.5)+

geom_text(aes(x= ctys, y = 0, label = ctys),NULL,

size = 3,fontface = "bold")

第四步骤:添加基因标签

p3 <- p2 +

geom_text_repel(aes(x = celltype,y = avg_log2FC,label = do_label), scRNA.markers, position = position_jitter(width =0.4),size = 2,box.padding = unit(0.2, "lines"),point.padding = unit(0.3, "lines"),min.segment.length = 0,max.overlaps = 120,segment.size=0.5,segment.alpha = 0.7 )

第五步骤:调整图片标题和风格

p3 <- p3+

labs(x = "CellType",y = "log2FoldChange",

title = "Differential expression genes")+

theme(

plot.title = element_text(size = 14,color = "black",face = "bold"),

axis.title = element_text(size = 12,color = "black",face = "bold"),

axis.line.y = element_line(color = "black",linewidth = 0.8),

axis.line.x = element_blank(),

axis.text.x = element_blank(),

axis.ticks.x = element_blank(),

panel.grid = element_blank(),

legend.position = c(0.98,0.96),

legend.background = element_blank(),

legend.title = element_blank(),

legend.direction = "vertical",

legend.justification = c(1,0),

legend.text = element_text(size = 12)

)+

guides(color = guide_legend(override.aes = list(size = 4)))

好看且内容丰富的多组火山图就完成啦!!

绘制图片或者复现代码过程中,如果老师遇到疑惑,欢迎拨打我们的热线电话或者联系我们的驻地销售。