## ---- echo=FALSE--------------------------------------------------------- library(knitr) opts_chunk$set(tidy = FALSE, message = FALSE, warning = FALSE) ## ----getPackage, eval=FALSE---------------------------------------------- # # if (!requireNamespace('BiocManager', quietly = TRUE)) # install.packages('BiocManager') # BiocManager::install('EnhancedVolcano') # ## ----getPackageDevel, eval=FALSE----------------------------------------- # # devtools::install_github('kevinblighe/EnhancedVolcano') # ## ----Load, message=FALSE------------------------------------------------- library(EnhancedVolcano) ## ------------------------------------------------------------------------ library(airway) library(magrittr) data('airway') airway$dex %<>% relevel('untrt') ## ------------------------------------------------------------------------ library('DESeq2') dds <- DESeqDataSet(airway, design = ~ cell + dex) dds <- DESeq(dds, betaPrior=FALSE) res1 <- results(dds, contrast = c('dex','trt','untrt')) res1 <- lfcShrink(dds, contrast = c('dex','trt','untrt'), res=res1) res2 <- results(dds, contrast = c('cell', 'N061011', 'N61311')) res2 <- lfcShrink(dds, contrast = c('cell', 'N061011', 'N61311'), res=res2) ## ----ex1, fig.height = 8.5, fig.width = 7, fig.cap = "Plot the most basic volcano plot."---- EnhancedVolcano(res1, lab = rownames(res1), x = 'log2FoldChange', y = 'pvalue', xlim = c(-5, 8)) ## ----ex2, fig.height = 8.5, fig.width = 7, fig.cap = "Modify cut-offs for log2FC and P value; specify title; adjust point and label size."---- EnhancedVolcano(res2, lab = rownames(res2), x = 'log2FoldChange', y = 'pvalue', xlim = c(-8, 8), title = 'N061011 versus N61311', pCutoff = 10e-16, FCcutoff = 1.5, pointSize = 3.0, labSize = 3.0) ## ----ex3, fig.height = 8.5, fig.width = 7, fig.cap = "Adjust colour and alpha for point shading."---- EnhancedVolcano(res2, lab = rownames(res2), x = 'log2FoldChange', y = 'pvalue', xlim = c(-8, 8), title = 'N061011 versus N61311', pCutoff = 10e-16, FCcutoff = 1.5, pointSize = 3.0, labSize = 3.0, col=c('black', 'black', 'black', 'red3'), colAlpha = 1) ## ----ex4, fig.height = 8.5, fig.width = 7, fig.cap = "Adjust shape of plotted points."---- EnhancedVolcano(res2, lab = rownames(res2), x = 'log2FoldChange', y = 'pvalue', xlim = c(-8, 8), title = 'N061011 versus N61311', pCutoff = 10e-16, FCcutoff = 1.5, pointSize = 4.0, labSize = 3.0, shape = 8, colAlpha = 1) EnhancedVolcano(res2, lab = rownames(res2), x = 'log2FoldChange', y = 'pvalue', xlim = c(-8, 8), title = 'N061011 versus N61311', pCutoff = 10e-16, FCcutoff = 1.5, pointSize = 3.0, labSize = 3.0, shape = c(1, 4, 23, 25), colAlpha = 1) ## ----ex5, fig.height = 8.5, fig.width = 7, fig.cap = "Adjust cut-off lines and add extra threshold lines."---- EnhancedVolcano(res2, lab = rownames(res2), x = 'log2FoldChange', y = 'pvalue', xlim = c(-6, 6), title = 'N061011 versus N61311', pCutoff = 10e-12, FCcutoff = 1.5, pointSize = 3.0, labSize = 3.0, colAlpha = 1, cutoffLineType = 'blank', cutoffLineCol = 'black', cutoffLineWidth = 0.8, hline = c(10e-12, 10e-36, 10e-60, 10e-84), hlineCol = c('grey0', 'grey25','grey50','grey75'), hlineType = 'longdash', hlineWidth = 0.8, gridlines.major = FALSE, gridlines.minor = FALSE) ## ----ex6, fig.height = 8.5, fig.width = 12, fig.cap = "Adjust legend position, size, and text."---- EnhancedVolcano(res2, lab = rownames(res2), x = 'log2FoldChange', y = 'pvalue', xlim = c(-6, 6), pCutoff = 10e-12, FCcutoff = 1.5, cutoffLineType = 'twodash', cutoffLineWidth = 0.8, pointSize = 4.0, labSize = 4.0, colAlpha = 1, legend=c('NS','Log (base 2) fold-change','P value', 'P value & Log (base 2) fold-change'), legendPosition = 'right', legendLabSize = 16, legendIconSize = 5.0) ## ----eval=FALSE---------------------------------------------------------- # # legendVisible = FALSE # ## ----ex7, fig.height = 8.5, fig.width = 7, fig.cap = "Plot adjusted p-values."---- EnhancedVolcano(res2, lab = rownames(res2), x = 'log2FoldChange', y = 'padj', xlim=c(-6,6), xlab = bquote(~Log[2]~ 'fold change'), ylab = bquote(~-Log[10]~adjusted~italic(P)), pCutoff = 0.0001, FCcutoff = 1.0, labSize = 4.0, colAlpha = 1, legend=c('NS','Log2 FC','Adjusted p-value', 'Adjusted p-value & Log2 FC'), legendPosition = 'bottom', legendLabSize = 10, legendIconSize = 3.0) ## ----ex8, fig.height = 8.5, fig.width = 11, fig.cap = "Fit more labels by adding connectors."---- EnhancedVolcano(res2, lab = rownames(res2), x = 'log2FoldChange', y = 'pvalue', xlim = c(-6,6), xlab = bquote(~Log[2]~ 'fold change'), pCutoff = 10e-14, FCcutoff = 2.0, pointSize = 4.0, labSize = 4.0, colAlpha = 1, legend=c('NS','Log (base 2) fold-change','P value', 'P value & Log (base 2) fold-change'), legendPosition = 'right', legendLabSize = 12, legendIconSize = 4.0, drawConnectors = TRUE, widthConnectors = 0.2, colConnectors = 'grey30') ## ----ex9, fig.height = 8.5, fig.width = 11, fig.cap = "Only label key variables."---- EnhancedVolcano(res2, lab = rownames(res2), x = 'log2FoldChange', y = 'pvalue', selectLab = c('ENSG00000106565','ENSG00000187758'), xlim = c(-6,7), xlab = bquote(~Log[2]~ 'fold change'), pCutoff = 10e-14, FCcutoff = 2.0, pointSize = 4.0, labSize = 5.0, shape = c(4, 35, 17, 18), colAlpha = 1, legend=c('NS','Log (base 2) fold-change','P value', 'P value & Log (base 2) fold-change'), legendPosition = 'right', legendLabSize = 14, legendIconSize = 5.0) ## ----ex10, fig.height = 8.5, fig.width = 12, fig.cap = "Draw labels in boxes."---- EnhancedVolcano(res2, lab = rownames(res2), x = 'log2FoldChange', y = 'pvalue', selectLab = c('ENSG00000106565','ENSG00000187758', 'ENSG00000230795', 'ENSG00000164530', 'ENSG00000143153'), xlim = c(-5.5,8), xlab = bquote(~Log[2]~ 'fold change'), pCutoff = 10e-14, FCcutoff = 2.0, pointSize = 4.0, labSize = 5.0, labCol = 'black', labFace = 'bold', boxedLabels = TRUE, colAlpha = 4/5, legend=c('NS','Log (base 2) fold-change','P value', 'P value & Log (base 2) fold-change'), legendPosition = 'right', legendLabSize = 14, legendIconSize = 4.0, drawConnectors = TRUE, widthConnectors = 1.0, colConnectors = 'black') ## ----eval = TRUE--------------------------------------------------------- # create custom key-value pairs for 'high', 'low', 'mid' expression by fold-change # set the base colour as 'black' keyvals <- rep('black', nrow(res2)) # set the base name/label as 'Mid' names(keyvals) <- rep('Mid', nrow(res2)) # modify keyvals for variables with fold change > 2.5 keyvals[which(res2$log2FoldChange > 2.5)] <- 'gold' names(keyvals)[which(res2$log2FoldChange > 2.5)] <- 'high' # modify keyvals for variables with fold change < -2.5 keyvals[which(res2$log2FoldChange < -2.5)] <- 'royalblue' names(keyvals)[which(res2$log2FoldChange < -2.5)] <- 'low' unique(names(keyvals)) unique(keyvals) keyvals[1:20] ## ----ex11, fig.height = 9.5, fig.width = 17, fig.cap = "Over-ride colouring scheme with custom key-value pairs."---- p1 <- EnhancedVolcano(res2, lab = rownames(res2), x = 'log2FoldChange', y = 'pvalue', selectLab = rownames(res2)[which(names(keyvals) %in% c('high', 'low'))], xlim = c(-6.5,6.5), xlab = bquote(~Log[2]~ 'fold change'), title = 'Custom colour over-ride', pCutoff = 10e-14, FCcutoff = 1.0, pointSize = 4.5, labSize = 4.5, shape = c(6, 4, 2, 11), colCustom = keyvals, colAlpha = 1, legendPosition = 'left', legendLabSize = 15, legendIconSize = 5.0, drawConnectors = TRUE, widthConnectors = 0.5, colConnectors = 'grey50', gridlines.major = TRUE, gridlines.minor = FALSE, border = 'partial', borderWidth = 1.5, borderColour = 'black') p2 <- EnhancedVolcano(res2, lab = rownames(res2), x = 'log2FoldChange', y = 'pvalue', selectLab = rownames(res2)[which(names(keyvals) %in% c('high', 'low'))], xlim = c(-6.5,6.5), xlab = bquote(~Log[2]~ 'fold change'), title = 'No custom colour over-ride', pCutoff = 10e-14, FCcutoff = 1.0, pointSize = 4.5, labSize = 4.5, colCustom = NULL, colAlpha = 1, legendPosition = 'top', legendLabSize = 15, legendIconSize = 5.0, drawConnectors = FALSE, widthConnectors = 0.5, colConnectors = 'grey50', gridlines.major = TRUE, gridlines.minor = FALSE, border = 'full', borderWidth = 1.0, borderColour = 'black') library(gridExtra) library(grid) grid.arrange(p1, p2, ncol=2, top = textGrob('EnhancedVolcano', just = c('center'), gp = gpar(fontsize = 32))) grid.rect(gp=gpar(fill=NA)) ## ----eval = TRUE--------------------------------------------------------- # define different cell-types that will be shaded celltype1 <- c('ENSG00000106565', 'ENSG00000002933', 'ENSG00000165246', 'ENSG00000224114') celltype2 <- c('ENSG00000230795', 'ENSG00000164530', 'ENSG00000143153', 'ENSG00000169851', 'ENSG00000231924', 'ENSG00000145681') # create custom key-value pairs for different cell-types # set the base shape as '3' keyvals.shape <- rep(3, nrow(res2)) # set the base name/label as 'PBC' names(keyvals.shape) <- rep('PBC', nrow(res2)) # modify the keyvals for cell-type 1 keyvals.shape[which(rownames(res2) %in% celltype1)] <- 17 names(keyvals.shape)[which(rownames(res2) %in% celltype1)] <- 'Cell-type 1' # modify the keyvals for cell-type 2 keyvals.shape[which(rownames(res2) %in% celltype2)] <- 64 names(keyvals.shape)[which(rownames(res2) %in% celltype2)] <- 'Cell-type 2' unique(names(keyvals.shape)) unique(keyvals.shape) keyvals.shape[1:20] ## ----ex12, fig.height = 9, fig.width = 17, fig.cap = "Over-ride colour and/or shape scheme with custom key-value pairs."---- p1 <- EnhancedVolcano(res2, lab = rownames(res2), x = 'log2FoldChange', y = 'pvalue', selectLab = rownames(res2)[which(names(keyvals) %in% c('high', 'low'))], xlim = c(-6.5,6.5), xlab = bquote(~Log[2]~ 'fold change'), title = 'Custom shape over-ride', pCutoff = 10e-14, FCcutoff = 1.0, pointSize = 4.5, labSize = 4.5, shapeCustom = keyvals.shape, colCustom = NULL, colAlpha = 1, legendLabSize = 15, legendPosition = 'left', legendIconSize = 5.0, drawConnectors = TRUE, widthConnectors = 0.5, colConnectors = 'grey50', gridlines.major = TRUE, gridlines.minor = FALSE, border = 'partial', borderWidth = 1.5, borderColour = 'black') # create custom key-value pairs for 'high', 'low', 'mid' expression by fold-change # set the base colour as 'black' keyvals.colour <- rep('black', nrow(res2)) # set the base name/label as 'Mid' names(keyvals.colour) <- rep('Mid', nrow(res2)) # modify keyvals for variables with fold change > 2.5 keyvals.colour[which(res2$log2FoldChange > 2.5)] <- 'gold' names(keyvals.colour)[which(res2$log2FoldChange > 2.5)] <- 'high' # modify keyvals for variables with fold change < -2.5 keyvals.colour[which(res2$log2FoldChange < -2.5)] <- 'royalblue' names(keyvals.colour)[which(res2$log2FoldChange < -2.5)] <- 'low' unique(names(keyvals.colour)) unique(keyvals.colour) p2 <- EnhancedVolcano(res2, lab = rownames(res2), x = 'log2FoldChange', y = 'pvalue', selectLab = rownames(res2)[which(names(keyvals) %in% c('High', 'Low'))], xlim = c(-6.5,6.5), xlab = bquote(~Log[2]~ 'fold change'), title = 'Custom shape & colour over-ride', pCutoff = 10e-14, FCcutoff = 1.0, pointSize = 5.5, labSize = 0.0, shapeCustom = keyvals.shape, colCustom = keyvals.colour, colAlpha = 1, legendPosition = 'top', legendLabSize = 15, legendIconSize = 5.0, drawConnectors = TRUE, widthConnectors = 0.5, colConnectors = 'grey50', gridlines.major = TRUE, gridlines.minor = FALSE, border = 'full', borderWidth = 1.0, borderColour = 'black') library(gridExtra) library(grid) grid.arrange(p1, p2, ncol=2, top = textGrob('EnhancedVolcano', just = c('center'), gp = gpar(fontsize = 32))) grid.rect(gp=gpar(fill=NA)) ## ----eval = TRUE--------------------------------------------------------- # define different cell-types that will be shaded celltype1 <- c('ENSG00000106565', 'ENSG00000002933') celltype2 <- c('ENSG00000230795', 'ENSG00000164530') ## ----ex13, fig.height = 9, fig.width = 16, fig.cap = "Shade certain variables."---- p1 <- EnhancedVolcano(res2, lab = rownames(res2), x = 'log2FoldChange', y = 'pvalue', selectLab = celltype1, xlim = c(-6.5,6.5), xlab = bquote(~Log[2]~ 'fold change'), title = 'Shading cell-type 1', pCutoff = 10e-14, FCcutoff = 1.0, pointSize = 8.0, labSize = 5.0, labCol = 'purple', labFace = 'bold', boxedLabels = TRUE, shape = 42, colCustom = keyvals, colAlpha = 1, legendPosition = 'top', legendLabSize = 15, legendIconSize = 5.0, shade = celltype1, shadeLabel = 'Cell-type I', shadeAlpha = 1/2, shadeFill = 'purple', shadeSize = 1, shadeBins = 5, drawConnectors = TRUE, widthConnectors = 1.0, colConnectors = 'grey30', gridlines.major = TRUE, gridlines.minor = FALSE, border = 'partial', borderWidth = 1.5, borderColour = 'black') p2 <- EnhancedVolcano(res2, lab = rownames(res2), x = 'log2FoldChange', y = 'pvalue', selectLab = celltype2, xlim = c(-6.5,6.5), xlab = bquote(~Log[2]~ 'fold change'), title = 'Shading cell-type 2', pCutoff = 10e-14, FCcutoff = 1.0, labSize = 5.0, labCol = 'forestgreen', labFace = 'bold', shapeCustom = keyvals.shape, colCustom = keyvals.colour, colAlpha = 1, legendPosition = 'right', pointSize = 4.0, legendLabSize = 15, legendIconSize = 5.0, shade = celltype2, shadeLabel = 'Cell-type II', shadeAlpha = 1/2, shadeFill = 'forestgreen', shadeSize = 1, shadeBins = 5, drawConnectors = TRUE, widthConnectors = 1.0, colConnectors = 'grey30', gridlines.major = TRUE, gridlines.minor = FALSE, border = 'full', borderWidth = 1.0, borderColour = 'black') library(gridExtra) library(grid) grid.arrange(p1, p2, ncol=2, top = textGrob('EnhancedVolcano', just = c('center'), gp = gpar(fontsize = 32))) grid.rect(gp=gpar(fill=NA)) ## ----ex14, fig.height = 9, fig.width = 12, fig.cap = "Highlighting key variabvles via custom point sizes."---- library("pasilla") pasCts <- system.file("extdata", "pasilla_gene_counts.tsv", package="pasilla", mustWork=TRUE) pasAnno <- system.file("extdata", "pasilla_sample_annotation.csv", package="pasilla", mustWork=TRUE) cts <- as.matrix(read.csv(pasCts,sep="\t",row.names="gene_id")) coldata <- read.csv(pasAnno, row.names=1) coldata <- coldata[,c("condition","type")] rownames(coldata) <- sub("fb", "", rownames(coldata)) cts <- cts[, rownames(coldata)] library("DESeq2") dds <- DESeqDataSetFromMatrix(countData = cts, colData = coldata, design = ~ condition) featureData <- data.frame(gene=rownames(cts)) mcols(dds) <- DataFrame(mcols(dds), featureData) dds <- DESeq(dds) res <- results(dds) p1 <- EnhancedVolcano(res, lab = rownames(res), x = "log2FoldChange", y = "pvalue", pCutoff = 10e-4, FCcutoff = 2, xlim = c(-5.5, 5.5), ylim = c(0, -log10(10e-12)), pointSize = c(ifelse(res$log2FoldChange>2, 8, 1)), labSize = 2.5, shape = c(6, 6, 19, 16), title = "DESeq2 results", subtitle = "Differential expression", caption = "FC cutoff, 1.333; p-value cutoff, 10e-4", legendPosition = "right", legendLabSize = 14, col = c("grey30", "forestgreen", "royalblue", "red2"), colAlpha = 0.9, drawConnectors = TRUE, hline = c(10e-8), widthConnectors = 0.5) p1 ## ----ex15, fig.height = 9, fig.width = 12, fig.cap = "Custom axis tick marks"---- p1 + ggplot2::coord_cartesian(xlim=c(-6, 6)) + ggplot2::scale_x_continuous( breaks=seq(-6,6, 1)) ## ------------------------------------------------------------------------ sessionInfo()