--- a +++ b/R/CircosFruits.R @@ -0,0 +1,359 @@ +#' Create a base plot with gene expression data on a phylogenetic tree +#' +#' This function creates a base plot using 'ggtree' and 'ggtreeExtra' libraries, adding gene expression +#' data as colored tiles to the plot. It allows for dynamic coloring of the genes and includes +#' adjustments for alpha transparency based on the expression value. +#' +#' @importFrom ggplot2 aes scale_fill_manual scale_alpha_continuous guide_legend +#' @param p A ggtree plot object to which the data will be added. +#' @param data A data frame containing gene expression data with columns for Samples, Genes, and Values. +#' @param gene_colors A named vector of colors for genes. +#' @param gene_label A character string used as a label in the legend for the genes. Default is "Gene". +#' @return A `ggtree` plot object with the gene expression data added. +#' @export +#' +#' @examples +#' \donttest{ +#' # Check and load required packages +#' if (requireNamespace("ggtreeExtra", quietly = TRUE) && +#' requireNamespace("ggplot2", quietly = TRUE)) { +#' library(ggtreeExtra) +#' library(ggplot2) +#' +#' file_path <- system.file("extdata", "p_tree_test.rds", package = "TransProR") +#' p <- readRDS(file_path) +#' +#' # Create gene expression data frame +#' expression_data <- data.frame( +#' Sample = rep(c("Species_A", "Species_B", "Species_C", "Species_D"), each = 5), +#' Gene = rep(paste0("Gene", 1:5), times = 4), +#' Value = runif(20, min = 0, max = 1) # Randomly generate expression values between 0 and 1 +#' ) +#' +#' # Define gene colors (named vector) +#' gene_colors <- c( +#' Gene1 = "#491588", +#' Gene2 = "#301b8d", +#' Gene3 = "#1a237a", +#' Gene4 = "#11479c", +#' Gene5 = "#0a5797" +#' ) +#' +#' # Call create_base_plot function to add gene expression data +#' p <- create_base_plot(p, expression_data, gene_colors) +#' } else { +#' message("Required packages 'ggtreeExtra' and 'ggplot2' are not installed.") +#' } +#' } +#' +create_base_plot <- function(p, data, gene_colors, gene_label="Gene") { + # Define local variables + Sample <- data$Sample + value <- data$value + Gene <- data$Gene + if (!requireNamespace("ggtreeExtra", quietly = TRUE)) { + stop("ggtreeExtra is required for using create_base_plot. Please install it.", call. = FALSE) + } + + if (!requireNamespace("ggplot2", quietly = TRUE)) { + stop("ggplot2 is required to use geom_tile. Please install it.", call. = FALSE) + } + + p <- p + + ggtreeExtra::geom_fruit( + data=data, + geom="geom_tile", + mapping=ggplot2::aes(y=Sample, alpha=value, x=Gene, fill=Gene), + offset=0.001, + pwidth=2 + ) + + ggplot2::scale_fill_manual( + name=gene_label, + values=gene_colors, + guide=ggplot2::guide_legend(keywidth=0.65, keyheight=0.35, order=1) + ) + + # Assuming the function 'adjust_alpha_scale' is defined elsewhere to adjust alpha scale based on the expression values + adjust_alpha_scale(data, gene_label) + return(p) +} + + + +#' Add a boxplot layer to a `ggtree` plot +#' +#' This function adds a boxplot layer to an existing `ggtree` plot object using ggtreeExtra's geom_fruit for boxplots. +#' It is primarily used to display statistical summaries of the data related to gene expressions or other metrics. +#' +#' @importFrom ggplot2 aes +#' @param p An existing ggtree plot object. +#' @param data A data frame containing the data to be plotted. Expected to have columns for 'Sample' and 'value'. +#' @param fill_color A character string specifying the fill color for the boxplots. Default is "#f28131". +#' @param alpha Numeric value for the transparency of the boxplots. Default is 0.6. +#' @param offset Numeric value, the position of the boxplot on the x-axis relative to its gene name. Default is 0.22. +#' @param pwidth Numeric value, the width of the boxplot. Default is 0.5. +#' @return A `ggtree` plot object with the added boxplot layer. +#' @export +#' +#' @examples +#' \donttest{ +#' # Check and load required packages +#' if (requireNamespace("ggtreeExtra", quietly = TRUE) && +#' requireNamespace("ggplot2", quietly = TRUE)) { +#' library(ggtreeExtra) +#' library(ggplot2) +#' +#' file_path <- system.file("extdata", "p_tree_test.rds", package = "TransProR") +#' p <- readRDS(file_path) +#' +#' # Create boxplot data frame +#' boxplot_data <- data.frame( +#' Sample = rep(c("Species_A", "Species_B", "Species_C", "Species_D"), each = 30), +#' value = c( +#' rnorm(30, mean = 5, sd = 1), # Data for Species_A +#' rnorm(30, mean = 7, sd = 1.5), # Data for Species_B +#' rnorm(30, mean = 6, sd = 1.2), # Data for Species_C +#' rnorm(30, mean = 8, sd = 1.3) # Data for Species_D +#' ) +#' ) +#' +#' # Call add_boxplot function to add boxplot layer +#' p_with_boxplot <- add_boxplot(p, boxplot_data) +#' } else { +#' message("Required packages 'ggtreeExtra' and 'ggplot2' are not installed.") +#' } +#' } +#' +add_boxplot <- function(p, data, fill_color="#f28131", alpha=0.6, offset=0.22, pwidth=0.5) { + # Define local variables + Sample <- data$Sample + value <- data$value + if (!requireNamespace("ggtreeExtra", quietly = TRUE)) { + stop("ggtreeExtra is required for using create_base_plot. Please install it.", call. = FALSE) + } + + if (!requireNamespace("ggplot2", quietly = TRUE)) { + stop("ggplot2 is required to use geom_boxplot. Please install it.", call. = FALSE) + } + + p + ggtreeExtra::geom_fruit( + data=data, + geom="geom_boxplot", + mapping=ggplot2::aes(y=Sample, x=value), + fill=fill_color, + alpha=alpha, + offset=offset, + pwidth=pwidth, + size=0.05, + outlier.size=0.3, + outlier.stroke=0.06, + outlier.shape=21, + show.legend=FALSE + ) +} + + + + +#' Add a new tile layer with dynamic scales to a `ggtree` plot +#' +#' This function adds a new tile layer to an existing `ggtree` plot object, allowing for separate scales for fill +#' and alpha transparency. This is useful when you want to add additional data layers without interfering with +#' the existing scales in the plot. It utilizes the 'ggnewscale' package to reset scales for new layers. +#' +#' @importFrom ggplot2 aes scale_fill_manual guide_legend +#' @importFrom ggnewscale new_scale +#' @param p An existing ggtree plot object. +#' @param data A data frame containing the data to be plotted. Expected to have columns for 'Sample', 'Gene', and 'value'. +#' @param gene_colors A named vector of colors for genes. +#' @param gene_label A character string used as a label in the legend for the genes. +#' @param alpha_value A numeric or named vector for setting the alpha scale based on values. +#' @param offset Numeric value, the position of the tile on the x-axis relative to its gene name. Default is 0.02. +#' @param pwidth Numeric value, the width of the tile. Default is 2. +#' @return A `ggtree` plot object with the added tile layer and new scales. +#' @export +#' +#' @examples +#' \donttest{ +#' # Check and load required packages +#' if (requireNamespace("ggtreeExtra", quietly = TRUE) && +#' requireNamespace("ggplot2", quietly = TRUE) && +#' requireNamespace("ggnewscale", quietly = TRUE)) { +#' library(ggtreeExtra) +#' library(ggplot2) +#' library(ggnewscale) +#' +#' file_path <- system.file("extdata", "p_tree_test.rds", package = "TransProR") +#' p <- readRDS(file_path) +#' +#' # Create new expression data +#' new_expression_data <- data.frame( +#' Sample = rep(c("Species_A", "Species_B", "Species_C", "Species_D"), each = 3), +#' Gene = rep(c("Gene6", "Gene7", "Gene8"), times = 4), +#' Value = runif(12, min = 0, max = 1) # Randomly generate expression values between 0 and 1 +#' ) +#' +#' # Define new gene colors +#' new_gene_colors <- c( +#' Gene6 = "#0b5f63", +#' Gene7 = "#074d41", +#' Gene8 = "#1f5e27" +#' ) +#' +#' # Define gene label and alpha values +#' gene_label <- "New Genes" +#' alpha_value <- c(0.3, 0.9) +#' +#' # Add new tile layer +#' p_with_new_layer <- add_new_tile_layer( +#' p, +#' new_expression_data, +#' new_gene_colors, +#' gene_label, +#' alpha_value, +#' offset = 0.02, +#' pwidth = 2 +#' ) +#' } else { +#' message("Required packages 'ggtreeExtra', 'ggplot2', and 'ggnewscale' are not installed.") +#' } +#' } +#' +add_new_tile_layer <- function(p, data, gene_colors, gene_label, alpha_value=c(0.3, 0.9), offset=0.02, pwidth=2) { + # Define local variables + Sample <- data$Sample + value <- data$value + Gene <- data$Gene + if (!requireNamespace("ggtreeExtra", quietly = TRUE)) { + stop("ggtreeExtra is required for using create_base_plot. Please install it.", call. = FALSE) + } + + if (!requireNamespace("ggplot2", quietly = TRUE)) { + stop("ggplot2 is required to use geom_tile. Please install it.", call. = FALSE) + } + + p + ggnewscale::new_scale("alpha") + ggnewscale::new_scale("fill") + + ggtreeExtra::geom_fruit( + data=data, + geom="geom_tile", + mapping=ggplot2::aes(y=Sample, alpha=value, x=Gene, fill=Gene), + offset=offset, + pwidth=pwidth + ) + + ggplot2::scale_fill_manual( + name=gene_label, + values=gene_colors, + guide=ggplot2::guide_legend(keywidth=0.65, keyheight=0.35, order=1) + ) + + adjust_alpha_scale(data, gene_label, alpha_value) # Assuming function signature and usage +} + + + + +#' Add multiple layers to a `ggtree` plot for visualizing gene expression and enrichment data +#' +#' This function sequentially adds multiple layers to a `ggtree` plot, including gene expression data, boxplots for statistical +#' summaries, and additional tile layers for pathway enrichment scores from SSGSEA and GSVA analyses. It utilizes separate +#' functions for adding each type of layer and allows for the specification of gene colors as well as adjustments in aesthetics +#' for each layer. The function is designed to work with specific data structures and assumes all functions for adding layers +#' are defined and available. +#' +#' @param p A `ggtree` plot object to which the data and layers will be added. +#' @param long_format_HeatdataDeseq A data frame containing gene expression data with columns for `Samples`, `Genes`, and `Values`. +#' @param ssgsea_kegg_HeatdataDeseq A data frame containing SSGSEA analysis results with columns for `Samples`, `Genes`, and `Values`. +#' @param gsva_kegg_HeatdataDeseq A data frame containing GSVA analysis results with columns for `Samples`, `Genes`, and `Values`. +#' @param gene_colors A named vector of colors for genes, used for coloring tiles in different layers. +#' @return A `ggtree` plot object with multiple layers added for comprehensive visualization. +#' @export +#' +#' @examples +#' \donttest{ +#' # Check and load required packages +#' if (requireNamespace("ggtreeExtra", quietly = TRUE) && +#' requireNamespace("ggplot2", quietly = TRUE)) { +#' library(ggtreeExtra) +#' library(ggplot2) +#' +#' # Example data for gene expression, SSGSEA, and GSVA +#' file_path <- system.file("extdata", "p_tree_test.rds", package = "TransProR") +#' p <- readRDS(file_path) +#' +#' # Create gene expression data frame (long_format_HeatdataDeseq) +#' long_format_HeatdataDeseq <- data.frame( +#' Sample = rep(c("Species_A", "Species_B", "Species_C", "Species_D"), each = 5), +#' Genes = rep(paste0("Gene", 1:5), times = 4), +#' Value = runif(20, min = 0, max = 1) # Randomly generate expression values between 0 and 1 +#' ) +#' +#' # Create SSGSEA analysis results data frame (ssgsea_kegg_HeatdataDeseq) +#' ssgsea_kegg_HeatdataDeseq <- data.frame( +#' Sample = rep(c("Species_A", "Species_B", "Species_C", "Species_D"), each = 3), +#' Genes = rep(c("Pathway1", "Pathway2", "Pathway3"), times = 4), +#' Value = runif(12, min = 0, max = 1) # Randomly generate enrichment scores between 0 and 1 +#' ) +#' +#' # Create GSVA analysis results data frame (gsva_kegg_HeatdataDeseq) +#' gsva_kegg_HeatdataDeseq <- data.frame( +#' Sample = rep(c("Species_A", "Species_B", "Species_C", "Species_D"), each = 4), +#' Genes = rep(c("PathwayA", "PathwayB", "PathwayC", "PathwayD"), times = 4), +#' Value = runif(16, min = 0, max = 1) # Randomly generate enrichment scores between 0 and 1 +#' ) +#' +#' # Define gene and pathway colors (named vector), including all genes and pathways +#' gene_colors <- c( +#' # Genes for gene expression +#' Gene1 = "#491588", +#' Gene2 = "#301b8d", +#' Gene3 = "#1a237a", +#' Gene4 = "#11479c", +#' Gene5 = "#0a5797", +#' # Pathways for SSGSEA +#' Pathway1 = "#0b5f63", +#' Pathway2 = "#074d41", +#' Pathway3 = "#1f5e27", +#' # Pathways for GSVA +#' PathwayA = "#366928", +#' PathwayB = "#827729", +#' PathwayC = "#a1d99b", +#' PathwayD = "#c7e9c0" +#' ) +#' +#' # Call circos_fruits function to add multiple layers +#' final_plot <- circos_fruits( +#' p, +#' long_format_HeatdataDeseq, +#' ssgsea_kegg_HeatdataDeseq, +#' gsva_kegg_HeatdataDeseq, +#' gene_colors +#' ) +#' } else { +#' message("Required packages 'ggtreeExtra' and 'ggplot2' are not installed.") +#' } +#' } +#' +circos_fruits <- function(p, long_format_HeatdataDeseq, ssgsea_kegg_HeatdataDeseq, gsva_kegg_HeatdataDeseq, gene_colors) { + if (!requireNamespace("ggtreeExtra", quietly = TRUE)) { + stop("ggtreeExtra is required for using create_base_plot. Please install it.", call. = FALSE) + } + + if (!requireNamespace("ggplot2", quietly = TRUE)) { + stop("ggplot2 is required to use geom_tile. Please install it.", call. = FALSE) + } + # Create the base plot with gene expression data + p1 <- create_base_plot(p, long_format_HeatdataDeseq, gene_colors) + + # Add a boxplot layer to the base plot + p2 <- add_boxplot(p1, long_format_HeatdataDeseq) + + # Add a new tile layer for SSGSEA data + p3 <- add_new_tile_layer(p2, ssgsea_kegg_HeatdataDeseq, gene_colors, "Ssgsea Term") + + # Add another boxplot layer with specific aesthetic adjustments + p4 <- add_boxplot(p3, ssgsea_kegg_HeatdataDeseq, fill_color="#f28131", alpha=0.65, offset=0.32) + + # Add a new tile layer for GSVA data with specific alpha and offset adjustments + p5 <- add_new_tile_layer(p4, gsva_kegg_HeatdataDeseq, gene_colors, "Gsva Term", alpha_value=c(0.3, 0.9), offset=0.02) + + # Return the final plot + return(p5) +}