mirror of
https://github.com/johrpan/geposan.git
synced 2025-10-26 10:47:25 +01:00
241 lines
6.5 KiB
R
241 lines
6.5 KiB
R
#' Plot gene positions.
|
|
#'
|
|
#' This function requires the package `plotly`.
|
|
#'
|
|
#' @param species_ids IDs of species to show in the plot.
|
|
#' @param gene_sets A list of gene sets (containing vectors of gene IDs) that
|
|
#' will be highlighted in the plot.
|
|
#' @param labels Labels for the gene sets. This is required if gene sets are
|
|
#' given and has to have the same length.
|
|
#' @param use_positions Whether to display positions instead of distances.
|
|
#'
|
|
#' @export
|
|
plot_positions <- function(species_ids,
|
|
gene_sets,
|
|
labels,
|
|
use_positions = FALSE) {
|
|
if (!requireNamespace("plotly", quietly = TRUE)) {
|
|
stop("Please install \"plotly\" to use this function.")
|
|
}
|
|
|
|
data <- merge(
|
|
geposan::distances[gene %chin% unlist(gene_sets) &
|
|
species %chin% species_ids],
|
|
geposan::genes[, .(id, name)],
|
|
by.x = "gene", by.y = "id"
|
|
)
|
|
|
|
if (use_positions) {
|
|
data[, value := position]
|
|
} else {
|
|
data[, value := distance]
|
|
}
|
|
|
|
# Add labels for each gene set.
|
|
for (i in seq_along(gene_sets)) {
|
|
data[gene %chin% gene_sets[[i]], label := labels[i]]
|
|
}
|
|
|
|
species <- geposan::species[id %chin% species_ids]
|
|
|
|
yaxis_title <- if (use_positions) {
|
|
"Position [Bp]"
|
|
} else {
|
|
"Distance to telomeres [Bp]"
|
|
}
|
|
|
|
plotly::plot_ly(
|
|
data = data,
|
|
x = ~species,
|
|
y = ~value,
|
|
color = ~label,
|
|
text = ~name,
|
|
type = "scatter",
|
|
mode = "markers"
|
|
) |> plotly::layout(
|
|
xaxis = list(
|
|
title = "Species",
|
|
tickvals = species$id,
|
|
ticktext = species$name
|
|
),
|
|
yaxis = list(title = yaxis_title)
|
|
)
|
|
}
|
|
|
|
|
|
#' Plot a ranking as a scatter plot of scores.
|
|
#'
|
|
#' This function requires the package `plotly`.
|
|
#'
|
|
#' @param ranking The ranking to visualize.
|
|
#' @param gene_sets A list of gene sets (containing vectors of gene IDs) that
|
|
#' will be highlighted in the plot.
|
|
#' @param labels Labels for the gene sets. This is required if gene sets are
|
|
#' given and has to have the same length.
|
|
#' @param max_rank The maximum rank of the highlighted genes. All genes that
|
|
#' are ranked lower will appear greyed out.
|
|
#'
|
|
#' @seealso ranking()
|
|
#'
|
|
#' @export
|
|
plot_scores <- function(ranking,
|
|
gene_sets = NULL,
|
|
labels = NULL,
|
|
max_rank = NULL) {
|
|
if (!requireNamespace("plotly", quietly = TRUE)) {
|
|
stop("Please install \"plotly\" to use this function.")
|
|
}
|
|
|
|
plot <- plotly::plot_ly() |>
|
|
plotly::add_trace(
|
|
data = ranking,
|
|
x = ~rank,
|
|
y = ~score,
|
|
color = "All genes",
|
|
type = "scatter",
|
|
mode = "markers",
|
|
hoverinfo = "skip"
|
|
) |>
|
|
plotly::layout(
|
|
xaxis = list(title = "Rank"),
|
|
yaxis = list(title = "Score")
|
|
)
|
|
|
|
if (length(gene_sets) > 0) {
|
|
# Take out the genes to be highlighted.
|
|
gene_set_data <- ranking[gene %chin% unlist(gene_sets)]
|
|
|
|
# Add labels for each gene set.
|
|
for (i in seq_along(gene_sets)) {
|
|
gene_set_data[gene %chin% gene_sets[[i]], label := labels[i]]
|
|
}
|
|
|
|
# Include gene information which will be used for labeling
|
|
gene_set_data <- merge(
|
|
gene_set_data,
|
|
geposan::genes,
|
|
by.x = "gene",
|
|
by.y = "id"
|
|
)
|
|
|
|
plot <- plot |> plotly::add_trace(
|
|
data = gene_set_data,
|
|
x = ~rank,
|
|
y = ~score,
|
|
color = ~label,
|
|
text = ~name,
|
|
type = "scatter",
|
|
mode = "markers",
|
|
marker = list(size = 20)
|
|
)
|
|
}
|
|
|
|
|
|
if (!is.null(max_rank)) {
|
|
first_not_included_rank <- max_rank + 1
|
|
last_rank <- ranking[, .N]
|
|
|
|
if (first_not_included_rank <= last_rank) {
|
|
plot <- plot |> plotly::layout(
|
|
shapes = list(
|
|
type = "rect",
|
|
fillcolor = "black",
|
|
opacity = 0.1,
|
|
x0 = first_not_included_rank,
|
|
x1 = last_rank,
|
|
y0 = 0.0,
|
|
y1 = 1.0
|
|
)
|
|
)
|
|
}
|
|
}
|
|
|
|
plot
|
|
}
|
|
|
|
#' Visualize a ranking by comparing gene sets in a boxplot.
|
|
#'
|
|
#' This function requires the package `plotly`.
|
|
#'
|
|
#' @param ranking The ranking to visualize.
|
|
#' @param gene_sets A list of gene sets (containing vectors of gene IDs) that
|
|
#' will be shown as separate boxes.
|
|
#' @param labels Labels for the gene sets. This is required if gene sets are
|
|
#' given and has to have the same length.
|
|
#'
|
|
#' @seealso ranking()
|
|
#'
|
|
#' @export
|
|
plot_boxplot <- function(ranking, gene_sets = NULL, labels = NULL) {
|
|
if (!requireNamespace("plotly", quietly = TRUE)) {
|
|
stop("Please install \"plotly\" to use this function.")
|
|
}
|
|
|
|
data <- copy(ranking)
|
|
|
|
# Add labels for each gene set.
|
|
for (i in seq_along(gene_sets)) {
|
|
data[gene %chin% gene_sets[[i]], label := labels[i]]
|
|
}
|
|
|
|
# Label the other genes.
|
|
data[!gene %chin% unlist(gene_sets), label := "Other genes"]
|
|
|
|
plotly::plot_ly(
|
|
data = data,
|
|
y = ~score,
|
|
color = ~label,
|
|
type = "box"
|
|
)
|
|
}
|
|
|
|
#' Show the distribution of scores across chromosomes.
|
|
#'
|
|
#' This function requires the package `plotly`.
|
|
#'
|
|
#' @param ranking The ranking to visualize.
|
|
#'
|
|
#' @seealso ranking()
|
|
#'
|
|
#' @export
|
|
plot_chromosomes <- function(ranking) {
|
|
if (!requireNamespace("plotly", quietly = TRUE)) {
|
|
stop("Please install \"plotly\" to use this function.")
|
|
}
|
|
|
|
data <- merge(ranking, geposan::genes, by.x = "gene", by.y = "id")
|
|
data <- data[, .(score = mean(score)), by = "chromosome"]
|
|
|
|
# Get an orderable integer from a chromosome name.
|
|
chromosome_index <- function(chromosome) {
|
|
index <- suppressWarnings(as.integer(chromosome))
|
|
|
|
ifelse(
|
|
!is.na(index),
|
|
index,
|
|
ifelse(
|
|
chromosome == "X",
|
|
998,
|
|
999
|
|
)
|
|
)
|
|
}
|
|
|
|
data[, index := chromosome_index(chromosome)]
|
|
setorder(data, "index")
|
|
|
|
plotly::plot_ly(
|
|
data = data,
|
|
x = ~chromosome,
|
|
y = ~score,
|
|
type = "bar"
|
|
) |>
|
|
plotly::layout(
|
|
xaxis = list(
|
|
title = "Chromosome",
|
|
categoryorder = "array",
|
|
categoryarray = ~chromosome
|
|
),
|
|
yaxis = list(title = "Mean score")
|
|
)
|
|
}
|