Bläddra i källkod

Add pre-calculated error bars to scatter plots

Bryan Roessler 6 månader sedan
förälder
incheckning
3d11ffbdbc
1 ändrade filer med 63 tillägg och 58 borttagningar
  1. 63 58
      qhtcp-workflow/apps/r/calculate_interaction_zscores.R

+ 63 - 58
qhtcp-workflow/apps/r/calculate_interaction_zscores.R

@@ -560,18 +560,30 @@ generate_scatter_plot <- function(plot, config) {
   
   # Add error bars if specified
   if (!is.null(config$error_bar) && config$error_bar && !is.null(config$y_var)) {
-    y_mean_col <- paste0("mean_", config$y_var)
-    y_sd_col <- paste0("sd_", config$y_var)
-    
-    plot <- plot +
-      geom_errorbar(
-        aes(
-          ymin = !!sym(y_mean_col) - !!sym(y_sd_col),
-          ymax = !!sym(y_mean_col) + !!sym(y_sd_col)
-        ),
-        alpha = 0.3,
-        linewidth = 0.5
-      )
+    if (!is.null(config$error_bar_params)) {
+      plot <- plot +
+        geom_errorbar(
+          aes(
+            ymin = config$error_bar_params$ymin,
+            ymax = config$error_bar_params$ymax
+          ),
+          alpha = 0.3,
+          linewidth = 0.5
+        )
+    } else {
+      y_mean_col <- paste0("mean_", config$y_var)
+      y_sd_col <- paste0("sd_", config$y_var)
+      
+      plot <- plot +
+        geom_errorbar(
+          aes(
+            ymin = !!sym(y_mean_col) - !!sym(y_sd_col),
+            ymax = !!sym(y_mean_col) + !!sym(y_sd_col)
+          ),
+          alpha = 0.3,
+          linewidth = 0.5
+        )
+    }
   }
   
   # Customize X-axis if specified
@@ -675,9 +687,10 @@ generate_interaction_plot_configs <- function(df, limits_map = NULL, plot_type =
   df_filtered <- df %>%
     mutate(OrfRepCombined = if (plot_type == "reference") paste(OrfRep, Gene, num, sep = "_") else paste(OrfRep, Gene, sep = "_"))
 
-  plots <- list()
+  # Separate the plots into two groups: overall variables and delta comparisons
+  overall_plots <- list()
+  delta_plots <- list()
 
-  # Generate plots for overall variables (L, K, r, AUC)
   for (var in c("L", "K", "r", "AUC")) {
     y_limits <- limits_map[[var]]
 
@@ -692,14 +705,12 @@ generate_interaction_plot_configs <- function(df, limits_map = NULL, plot_type =
       error_bar = TRUE,
       x_breaks = unique(df_filtered$conc_num_factor_factor),
       x_labels = as.character(unique(df_filtered$conc_num)),
-      grid_layout = list(ncol = 2, nrow = 2),
       position = "jitter",
       smooth = TRUE
     )
-    plots <- append(plots, list(config))
+    overall_plots <- append(overall_plots, list(config))
   }
 
-  # Generate Delta comparison plots
   unique_groups <- df_filtered %>% select(all_of(group_vars)) %>% distinct()
 
   for (i in seq_len(nrow(unique_groups))) {
@@ -713,13 +724,13 @@ generate_interaction_plot_configs <- function(df, limits_map = NULL, plot_type =
     for (var in c("Delta_L", "Delta_K", "Delta_r", "Delta_AUC")) {
       y_limits <- limits_map[[var]]
       y_span <- y_limits[2] - y_limits[1]
-      
+
       # Error bars
       WT_sd_var <- paste0("WT_sd_", sub("Delta_", "", var))
       WT_sd_value <- group_data[[WT_sd_var]][1]
       error_bar_ymin <- 0 - (2 * WT_sd_value)
       error_bar_ymax <- 0 + (2 * WT_sd_value)
-      
+
       # Annotations
       Z_Shift_value <- round(group_data[[paste0("Z_Shift_", sub("Delta_", "", var))]][1], 2)
       Z_lm_value <- round(group_data[[paste0("Z_lm_", sub("Delta_", "", var))]][1], 2)
@@ -752,14 +763,16 @@ generate_interaction_plot_configs <- function(df, limits_map = NULL, plot_type =
         smooth = TRUE,
         x_breaks = unique(group_data$conc_num_factor_factor),
         x_labels = as.character(unique(group_data$conc_num)),
-        ylim_vals = y_limits,
-        grid_layout = list(ncol = 4, nrow = 3)
+        ylim_vals = y_limits
       )
-      plots <- append(plots, list(config))
+      delta_plots <- append(delta_plots, list(config))
     }
   }
 
-  return(list(grid_layout = list(ncol = 2, nrow = 2), plots = plots))
+  return(list(
+    overall_plots = list(grid_layout = list(ncol = 2, nrow = 2), plots = overall_plots),
+    delta_plots = list(grid_layout = list(ncol = 4, nrow = 3), plots = delta_plots)
+  ))
 }
 
 generate_rank_plot_configs <- function(df, variables, is_lm = FALSE, adjust = FALSE, overlap_color = FALSE) {
@@ -1046,7 +1059,6 @@ main <- function() {
     
     # Each plots list corresponds to a file
     l_vs_k_plot_configs <- list(
-      grid_layout = list(ncol = 1, nrow = 1),
       plots = list(
         list(
           df = df,
@@ -1063,7 +1075,6 @@ main <- function() {
     )
 
     frequency_delta_bg_plot_configs <- list(
-      grid_layout = list(ncol = 1, nrow = 1),
       plots = list(
         list(
           df = df_stats,
@@ -1093,7 +1104,6 @@ main <- function() {
     )
 
     above_threshold_plot_configs <- list(
-      grid_layout = list(ncol = 1, nrow = 1),
       plots = list(
         list(
           df = df_above_tolerance,
@@ -1145,7 +1155,6 @@ main <- function() {
     )
 
     l_outside_2sd_k_plot_configs <- list(
-      grid_layout = list(ncol = 1, nrow = 1),  # Ensures it's compatible with generate_and_save_plots
       plots = list(
         list(
           df = df_na_l_outside_2sd_k_stats,
@@ -1170,7 +1179,6 @@ main <- function() {
     )
 
     delta_bg_outside_2sd_k_plot_configs <- list(
-      grid_layout = list(ncol = 1, nrow = 1),  # Ensures it's compatible with generate_and_save_plots
       plots = list(
         list(
           df = df_na_l_outside_2sd_k_stats,
@@ -1195,37 +1203,34 @@ main <- function() {
     )
 
     message("Generating quality control plots in parallel")
-
-    generate_and_save_plots(out_dir_qc, "L_vs_K_before_quality_control", l_vs_k_plot_configs)
-    quit()
     # # future::plan(future::multicore, workers = parallel::detectCores())
-    # future::plan(future::multisession, workers = 3) # generate 3 plots in parallel
-
-    # plot_configs <- list(
-    #   list(out_dir = out_dir_qc, filename = "L_vs_K_before_quality_control",
-    #     plot_configs = l_vs_k_plot_configs),
-    #   list(out_dir = out_dir_qc, filename = "frequency_delta_background",
-    #     plot_configs = frequency_delta_bg_plot_configs),
-    #   list(out_dir = out_dir_qc, filename = "L_vs_K_above_threshold",
-    #     plot_configs = above_threshold_plot_configs),
-    #   list(out_dir = out_dir_qc, filename = "plate_analysis",
-    #     plot_configs = plate_analysis_plot_configs),
-    #   list(out_dir = out_dir_qc, filename = "plate_analysis_boxplots",
-    #     plot_configs = plate_analysis_boxplot_configs),
-    #   list(out_dir = out_dir_qc, filename = "plate_analysis_no_zeros",
-    #     plot_configs = plate_analysis_no_zeros_plot_configs),
-    #   list(out_dir = out_dir_qc, filename = "plate_analysis_no_zeros_boxplots",
-    #     plot_configs = plate_analysis_no_zeros_boxplot_configs),
-    #   list(out_dir = out_dir_qc, filename = "L_vs_K_for_strains_2SD_outside_mean_K",
-    #     plot_configs = l_outside_2sd_k_plot_configs),
-    #   list(out_dir = out_dir_qc, filename = "delta_background_vs_K_for_strains_2sd_outside_mean_K",
-    #     plot_configs = delta_bg_outside_2sd_k_plot_configs)
-    # )
-
-    # # Generating quality control plots in parallel
-    # furrr::future_map(plot_configs, function(config) {
-    #   generate_and_save_plots(config$out_dir, config$filename, config$plot_configs)
-    # }, .options = furrr_options(seed = TRUE))
+    future::plan(future::multisession, workers = 3) # generate 3 plots in parallel
+
+    plot_configs <- list(
+      list(out_dir = out_dir_qc, filename = "L_vs_K_before_quality_control",
+        plot_configs = l_vs_k_plot_configs),
+      list(out_dir = out_dir_qc, filename = "frequency_delta_background",
+        plot_configs = frequency_delta_bg_plot_configs),
+      list(out_dir = out_dir_qc, filename = "L_vs_K_above_threshold",
+        plot_configs = above_threshold_plot_configs),
+      list(out_dir = out_dir_qc, filename = "plate_analysis",
+        plot_configs = plate_analysis_plot_configs),
+      list(out_dir = out_dir_qc, filename = "plate_analysis_boxplots",
+        plot_configs = plate_analysis_boxplot_configs),
+      list(out_dir = out_dir_qc, filename = "plate_analysis_no_zeros",
+        plot_configs = plate_analysis_no_zeros_plot_configs),
+      list(out_dir = out_dir_qc, filename = "plate_analysis_no_zeros_boxplots",
+        plot_configs = plate_analysis_no_zeros_boxplot_configs),
+      list(out_dir = out_dir_qc, filename = "L_vs_K_for_strains_2SD_outside_mean_K",
+        plot_configs = l_outside_2sd_k_plot_configs),
+      list(out_dir = out_dir_qc, filename = "delta_background_vs_K_for_strains_2sd_outside_mean_K",
+        plot_configs = delta_bg_outside_2sd_k_plot_configs)
+    )
+
+    # Generating quality control plots in parallel
+    furrr::future_map(plot_configs, function(config) {
+      generate_and_save_plots(config$out_dir, config$filename, config$plot_configs)
+    }, .options = furrr_options(seed = TRUE))
 
     # Process background strains
     bg_strains <- c("YDL227C")