Volcano Plot이란 수많은 변수들 중 통계적으로 유의미한 변화를 보이는 데이터를 직관적으로 식별하기 위해 사용하는 산점도(Scatter plot)의 일종이다. 이름처럼 화산이 폭발하는 듯한 모양을 띄고있다.
주로 두 그룹(ex. 실험군 vs 대조군)간의 유전자 발현량, 단백질 수치 등의 차이를 분석할 때 사용된다.
수천, 수만 개에 달하는 데이터 포인트 중에서 어떤 유전자가 의미 있는 변화를 보였는지 한눈에 알려주는 아주 강력한 도구이다.
library(DESeq2)
library(airway)
library(ggplot2)
library(ggrepel)
library(dplyr)
# 2. 데이터 준비 및 차등 발현 분석 (Analysis)
data(airway)
# DESeq2 분석을 위한 데이터 객체를 생성
dds <- DESeqDataSet(airway, design = ~ cell + dex)
# 차등 발현 분석을 실행
dds <- DESeq(dds)
# 분석 결과를 'trt'(처리군) vs 'untrt'(대조군) 기준으로 추출
res <- results(dds, contrast = c("dex", "trt", "untrt"))
# 3. 결과 데이터프레임 가공 (Data Wrangling)
res_df <- as.data.frame(res)
res_df <- na.omit(res_df)
res_df$gene <- rownames(res_df)
# 기준: |log2FoldChange| > 1 그리고 padj < 0.05
res_df <- res_df %>%
mutate(change = case_when(
log2FoldChange > 1 & padj < 0.05 ~ "Upregulated",
log2FoldChange < -1 & padj < 0.05 ~ "Downregulated",
TRUE ~ "Not Significant"
))
# 4. 최종 시각화 (Visualization)
# 플롯에 라벨링할 상위 10개 유의 유전자를 선택
top_genes <- res_df %>%
filter(change != "Not Significant") %>%
arrange(padj) %>%
head(10)
# ggplot2를 사용하여 Volcano Plot을 생성
ggplot(data = res_df, aes(x = log2FoldChange, y = -log10(padj), color = change)) +
# 점 그래프 (Scatter plot)
geom_point(alpha = 0.6, size = 2) +
# 색상 직접 지정
scale_color_manual(name = "Expression Change",
values = c("Upregulated" = "#E64B35FF", "Downregulated" = "#0073C2FF", "Not Significant" = "grey")) +
# 유의성 기준선 추가 (점선)
geom_vline(xintercept = c(-1, 1), linetype = "dashed") +
geom_hline(yintercept = -log10(0.05), linetype = "dashed") +
# ggrepel을 이용해 겹치지 않게 유전자 라벨 추가
geom_text_repel(data = top_genes,
aes(label = gene),
box.padding = 0.5,
max.overlaps = Inf) +
# 전체적인 테마 및 제목, 축 이름 설정
theme_bw(base_size = 14) +
labs(title = "Differential Gene Expression",
subtitle = "Dexamethasone Treatment vs. Control in Airway Cells",
x = expression(paste("Log"[2], " Fold Change")),
y = expression(paste("-Log"[10], " Adjusted P-value")))
