Nothing
#' 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
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.