Interactive Volcano Plot

Guangchuang Yu
School of Basic Medical Sciences, Southern Medical University

2025-09-09

Prepare example data

library(airway)
library(DESeq2)
library(org.Hs.eg.db)
library(AnnotationDbi)

data("airway")

counts_mat <- assay(airway)
airway <- airway[rowSums(counts_mat) > 1, ]

dds <- DESeqDataSet(airway, design = ~ cell + dex)
dds <- DESeq(dds)
res <- results(dds, contrast = c("dex", "trt", "untrt"))

df <- as.data.frame(res)
df$gene_id <- rownames(df)
df$symbol <- mapIds(org.Hs.eg.db, 
                    keys = df$gene_id,
                    column = "SYMBOL", 
                    keytype = "ENSEMBL", 
                    multiVals = "first")

df <- df[!is.na(df$symbol), ]
df <- df[, c("log2FoldChange", "padj", "symbol")]

head(df)
                log2FoldChange         padj symbol
ENSG00000000003    -0.38125398 1.281209e-03 TSPAN6
ENSG00000000419     0.20681260 1.962081e-01   DPM1
ENSG00000000457     0.03792043 9.111955e-01  SCYL3
ENSG00000000460    -0.08816818 8.946325e-01  FIRRM
ENSG00000000938    -1.37822703           NA    FGR
ENSG00000000971     0.42640213 1.818075e-05    CFH

Interactive volcano plot

library(ivolcano)

ivolcano(df,
        logFC_col = "log2FoldChange",
        pval_col = "padj",
        gene_col = "symbol",
        top_n = 5,
        onclick_fun=onclick_genecards)

We can use the fanyi package to query NCBI gene description and translated to local language to be displayed on the plot, see also https://yulab-smu.top/ivolcano/.