# Plot AUC comparisons (no gap) between models and Delphi using ggplot2 # Usage: # Rscript plot_model_comparison_no_gap.R [path_to_csv] [output_dir] # Defaults: # path_to_csv = "model_comparison_auc_no_gap.csv" # output_dir = current working directory (".") suppressPackageStartupMessages({ library(ggplot2) library(cowplot) }) args <- commandArgs(trailingOnly = TRUE) csv_path <- if (length(args) >= 1) args[1] else "model_comparison_auc_no_gap.csv" out_dir <- if (length(args) >= 2) args[2] else "." if (!dir.exists(out_dir)) { dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) } # Read data # Expect columns including: auc_delphi, auc_256, auc_120, auc_256_l, auc_120_l, Colour (hex color), name, etc. df <- tryCatch({ read.csv(csv_path, check.names = FALSE) }, error = function(e) { stop(sprintf("Failed to read CSV at '%s': %s", csv_path, e$message)) }) # Helper to compare any two AUC columns (x vs y) make_xy_plot <- function(data, x_col, y_col, title_text, x_label, y_label) { ggplot(data, aes(x = .data[[x_col]], y = .data[[y_col]])) + geom_abline(slope = 1, intercept = 0, color = "black", linetype = "dashed", linewidth = 0.5) + geom_vline(xintercept = 0.5, color = "gray50", linetype = "dashed", linewidth = 0.4) + geom_hline(yintercept = 0.5, color = "gray50", linetype = "dashed", linewidth = 0.4) + geom_point(aes(fill = Colour), shape = 21, color = "white", stroke = 0.65, size = 2.2, alpha = 0.95, show.legend = FALSE) + scale_fill_identity() + coord_cartesian(xlim = c(0.3, 1.05), ylim = c(0.3, 1.05)) + coord_fixed(ratio = 1) + labs(title = title_text, x = x_label, y = y_label) + theme_minimal(base_size = 10) + theme( plot.title = element_text(hjust = 0.5), panel.grid.minor = element_blank() ) } # Helper to compare model AUC vs Delphi AUC (x = auc_delphi) make_delphi_plot <- function(data, y_col, title_text, y_label) { ggplot(data, aes(x = auc_delphi, y = .data[[y_col]])) + geom_abline(slope = 1, intercept = 0, color = "black", linetype = "dashed", linewidth = 0.5) + geom_vline(xintercept = 0.5, color = "gray50", linetype = "dashed", linewidth = 0.4) + geom_hline(yintercept = 0.5, color = "gray50", linetype = "dashed", linewidth = 0.4) + geom_point(aes(fill = Colour), shape = 21, color = "white", stroke = 0.65, size = 2.2, alpha = 0.95, show.legend = FALSE) + scale_fill_identity() + coord_cartesian(xlim = c(0.3, 1.05), ylim = c(0.3, 1.05)) + coord_fixed(ratio = 1) + labs(title = title_text, x = "AUC_Delphi", y = y_label) + theme_minimal(base_size = 10) + theme( plot.title = element_text(hjust = 0.5), panel.grid.minor = element_blank() ) } # Placeholder empty plot if a required column is missing empty_plot <- function(msg) { ggplot() + theme_void() + ggtitle(msg) + theme(plot.title = element_text(hjust = 0.5)) } # Individual Delphi comparison plots has_cols <- function(cols) all(cols %in% names(df)) # AUC_120 vs AUC_Delphi (no gap) if (has_cols(c("auc_delphi", "auc_120"))) { p120 <- make_delphi_plot(df, "auc_120", "AUC_120 vs AUC_Delphi (no gap)", "AUC_120") out_120 <- file.path(out_dir, "fig_auc_120_vs_delphi_no_gap.png") ggsave(filename = out_120, plot = p120, width = 7, height = 4, dpi = 600, bg = "white") cat(sprintf("Saved: %s\n", out_120)) } else { warning("Missing columns for AUC_120 vs Delphi plot.") } # AUC_256 vs AUC_Delphi (no gap) if (has_cols(c("auc_delphi", "auc_256"))) { p256 <- make_delphi_plot(df, "auc_256", "AUC_256 vs AUC_Delphi (no gap)", "AUC_256") out_256 <- file.path(out_dir, "model_comparison_auc_256_vs_delphi_no_gap.png") ggsave(filename = out_256, plot = p256, width = 7, height = 4, dpi = 600, bg = "white") cat(sprintf("Saved: %s\n", out_256)) } else { warning("Missing columns for AUC_256 vs Delphi plot.") } # AUC_120_L vs AUC_Delphi (no gap) if (has_cols(c("auc_delphi", "auc_120_l"))) { p120l <- make_delphi_plot(df, "auc_120_l", "AUC_120_L vs AUC_Delphi (no gap)", "AUC_120_L") out_120l <- file.path(out_dir, "fig_auc_120_l_vs_delphi_no_gap.png") ggsave(filename = out_120l, plot = p120l, width = 7, height = 4, dpi = 600, bg = "white") cat(sprintf("Saved: %s\n", out_120l)) } else { warning("Missing columns for AUC_120_L vs Delphi plot.") } # AUC_256_L vs AUC_Delphi (no gap) if (has_cols(c("auc_delphi", "auc_256_l"))) { p256l <- make_delphi_plot(df, "auc_256_l", "AUC_256_L vs AUC_Delphi (no gap)", "AUC_256_L") out_256l <- file.path(out_dir, "model_comparison_auc_256_l_vs_delphi_no_gap.png") ggsave(filename = out_256l, plot = p256l, width = 7, height = 4, dpi = 600, bg = "white") cat(sprintf("Saved: %s\n", out_256l)) } else { warning("Missing columns for AUC_256_L vs Delphi plot.") } # 2x2 grid of Delphi comparisons p_120_vs_delphi <- if (has_cols(c("auc_delphi", "auc_120"))) make_delphi_plot(df, "auc_120", "AUC_120 vs Delphi (no gap)", "AUC_120") else empty_plot("Missing auc_120 or auc_delphi") p_256_vs_delphi <- if (has_cols(c("auc_delphi", "auc_256"))) make_delphi_plot(df, "auc_256", "AUC_256 vs Delphi (no gap)", "AUC_256") else empty_plot("Missing auc_256 or auc_delphi") p_120l_vs_delphi <- if (has_cols(c("auc_delphi", "auc_120_l"))) make_delphi_plot(df, "auc_120_l", "AUC_120_L vs Delphi (no gap)", "AUC_120_L") else empty_plot("Missing auc_120_l or auc_delphi") p_256l_vs_delphi <- if (has_cols(c("auc_delphi", "auc_256_l"))) make_delphi_plot(df, "auc_256_l", "AUC_256_L vs Delphi (no gap)", "AUC_256_L") else empty_plot("Missing auc_256_l or auc_delphi") grid_plot <- plot_grid( p_120_vs_delphi, p_256_vs_delphi, p_120l_vs_delphi, p_256l_vs_delphi, labels = c("A", "B", "C", "D"), ncol = 2, align = "hv" ) out_grid <- file.path(out_dir, "model_comparison_auc_vs_delphi_no_gap_grid.png") ggsave(filename = out_grid, plot = grid_plot, width = 12, height = 8, dpi = 300, bg = "white") cat(sprintf("Saved grid: %s\n", out_grid))