#' Radar (spider) plot for gene sets
#'
#' Radar (spider) plot for gene sets, either for one or more results from functional
#' enrichment analysis.
#'
#' @param res_enrich A `data.frame` object, storing the result of the functional
#' enrichment analysis. See more in the main function, [GeneTonic()], to check the
#' formatting requirements (a minimal set of columns should be present).
#' @param res_enrich2 Analogous to `res_enrich1`, another `data.frame` object,
#' storing the result of the functional enrichment analysis, but for a different
#' setting (e.g. another contrast).
#' Defaults to NULL (in this case, a single set of enrichment results is plotted).
#' @param n_gs Integer value, corresponding to the maximal number of gene sets to
#' be displayed
#' @param p_value_column Character string, specifying the column of `res_enrich`
#' where the p-value to be represented is specified. Defaults to `gs_pvalue`
#' (it could have other values, in case more than one p-value - or an adjusted
#' p-value - have been specified).
#'
#' @return A `plotly` object
#' @export
#'
#' @examples
#'
#' library("macrophage")
#' library("DESeq2")
#' library("org.Hs.eg.db")
#' library("AnnotationDbi")
#'
#' # dds object
#' data("gse", package = "macrophage")
#' dds_macrophage <- DESeqDataSet(gse, design = ~ line + condition)
#' rownames(dds_macrophage) <- substr(rownames(dds_macrophage), 1, 15)
#' dds_macrophage <- estimateSizeFactors(dds_macrophage)
#'
#' # annotation object
#' anno_df <- data.frame(
#' gene_id = rownames(dds_macrophage),
#' gene_name = mapIds(org.Hs.eg.db,
#' keys = rownames(dds_macrophage),
#' column = "SYMBOL",
#' keytype = "ENSEMBL"
#' ),
#' stringsAsFactors = FALSE,
#' row.names = rownames(dds_macrophage)
#' )
#'
#' # res object
#' data(res_de_macrophage, package = "GeneTonic")
#' res_de <- res_macrophage_IFNg_vs_naive
#'
#' # res_enrich object
#' data(res_enrich_macrophage, package = "GeneTonic")
#' res_enrich <- shake_topGOtableResult(topgoDE_macrophage_IFNg_vs_naive)
#' res_enrich <- get_aggrscores(res_enrich, res_de, anno_df)
#' gs_radar(res_enrich = res_enrich)
#' # or using the alias...
#' gs_spider(res_enrich = res_enrich)
#'
#' # with more than one set
#' res_enrich2 <- res_enrich[1:60, ]
#' set.seed(42)
#' shuffled_ones <- sample(seq_len(60)) # to generate permuted p-values
#' res_enrich2$gs_pvalue <- res_enrich2$gs_pvalue[shuffled_ones]
#' # ideally, I would also permute the z scores and aggregated scores
#' gs_radar(
#' res_enrich = res_enrich,
#' res_enrich2 = res_enrich2
#' )
gs_radar <- function(res_enrich,
res_enrich2 = NULL,
n_gs = 20,
p_value_column = "gs_pvalue") {
# res_enrich has to contain the Z-score to be displayed
if (!("z_score" %in% colnames(res_enrich))) {
warning("You need to add the z_score or the aggregated score")
}
if (!is.null(res_enrich2)) {
if (!("z_score" %in% colnames(res_enrich2))) {
warning("You need to add the z_score or the aggregated score")
}
}
# only one set
if (is.null(res_enrich2)) {
res_enrich$logp10 <- -log10(res_enrich[[p_value_column]])
res_enrich <- res_enrich[seq_len(n_gs), ]
log_smallest_p <- max(res_enrich$logp10)
set_colors <- RColorBrewer::brewer.pal(n = 8, "Set1")
p <- plot_ly(
type = "scatterpolar",
mode = "markers",
fill = "toself"
) %>%
add_trace(
r = c(res_enrich$logp10, res_enrich$logp10[1]), # recycling the first element
theta = c(res_enrich[["gs_description"]], res_enrich[["gs_description"]][1]),
name = "scenario 1"
) %>%
plotly::layout(
polar = list(radialaxis = list(
visible = TRUE,
range = c(0, log_smallest_p)
))
# ,
# title = "Geneset Radar Chart", font = list(size = 10)
)
} else {
# if res_enrich2 is also provided
gs_set1 <- res_enrich$gs_id
gs_set2 <- res_enrich2$gs_id
gs_common <- intersect(gs_set1, gs_set2)
# restrict to the top common n_gs
gs_common <- gs_common[seq_len(min(n_gs, length(gs_common)))]
if (length(gs_common) == 0) {
stop("No gene sets have been found in common to the two enrichment results")
}
common_re1 <- res_enrich[gs_common, ]
common_re2 <- res_enrich2[gs_common, ]
common_re1$logp10 <- -log10(common_re1[[p_value_column]])
common_re2$logp10 <- -log10(common_re2[[p_value_column]])
# if needed, I could access Z and aggregated scores
log_smallest_p <- max(common_re1$logp10, common_re2$logp10)
set_colors <- RColorBrewer::brewer.pal(n = 8, "Set1")
p <- plot_ly(
type = "scatterpolar",
mode = "markers",
fill = "toself"
) %>%
add_trace(
r = c(common_re1$logp10, common_re1$logp10[1]), # recycling the first element
theta = c(common_re1[["gs_description"]], common_re1[["gs_description"]][1]),
name = "scenario 1"
) %>%
add_trace(
r = c(common_re2$logp10, common_re2$logp10[1]),
theta = c(common_re2[["gs_description"]], common_re2[["gs_description"]][1]),
name = "scenario 2"
) %>%
plotly::layout(
polar = list(radialaxis = list(
visible = TRUE,
range = c(0, log_smallest_p)
))
)
}
return(p)
}
#' @rdname gs_radar
#' @export
gs_spider <- gs_radar
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.