From b0eedfd5226cbcf50eb618ea7726018948ba4253 Mon Sep 17 00:00:00 2001 From: ARIADNA BATALLA FERRES Date: Wed, 27 Aug 2025 12:39:13 +0200 Subject: [PATCH 01/17] Draw dots where rpss is <= 0 in plot_extreme_probs.R (matching plot_most_likely_terciles_map.R) --- modules/Visualization/R/plot_extreme_probs.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/Visualization/R/plot_extreme_probs.R b/modules/Visualization/R/plot_extreme_probs.R index 73978982..bd98f1ed 100644 --- a/modules/Visualization/R/plot_extreme_probs.R +++ b/modules/Visualization/R/plot_extreme_probs.R @@ -208,7 +208,7 @@ plot_extreme_probs <- function(recipe, fcst, indices = var, drop = 'selected') dim_dots <- dim(var_dots) - var_dots <- as.numeric(var_dots >= 0) + var_dots <- as.numeric(var_dots <= 0) dim(var_dots) <- dim_dots } else { var_dots <- NULL -- GitLab From 4982058cb9298d6cb352587a2449a73dc453d2a1 Mon Sep 17 00:00:00 2001 From: ARIADNA BATALLA FERRES Date: Wed, 27 Aug 2025 13:15:00 +0200 Subject: [PATCH 02/17] Add parameter to choose which grid points to dot in plot_extreme_probs.R --- modules/Visualization/R/plot_extreme_probs.R | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/Visualization/R/plot_extreme_probs.R b/modules/Visualization/R/plot_extreme_probs.R index bd98f1ed..b1dc07be 100644 --- a/modules/Visualization/R/plot_extreme_probs.R +++ b/modules/Visualization/R/plot_extreme_probs.R @@ -13,6 +13,7 @@ plot_extreme_probs <- function(recipe, fcst, mask = NULL, dots = NULL, outdir, output_conf, brks_min = 5, brks_max = 95, + dots_on_significant_points = FALSE, ## put in recipe or Visualization()? logo = NULL) { # Abort if frequency is daily if (recipe$Analysis$Variables$freq %in% c("daily", "daily_mean")) { @@ -208,7 +209,11 @@ plot_extreme_probs <- function(recipe, fcst, indices = var, drop = 'selected') dim_dots <- dim(var_dots) - var_dots <- as.numeric(var_dots <= 0) + if (!isTRUE(dots_on_significant_points)) { + var_dots <- as.numeric(var_dots <= 0) # Dots on non-significant (default) + } else { + var_dots <- as.numeric(var_dots > 0) # Dots on significant + } dim(var_dots) <- dim_dots } else { var_dots <- NULL -- GitLab From db637f2b3032e7dc40e9c425aa953ac25f487415 Mon Sep 17 00:00:00 2001 From: ARIADNA BATALLA FERRES Date: Wed, 27 Aug 2025 17:25:01 +0200 Subject: [PATCH 03/17] Add parameter to choose which grid points to dot in plot_most_likely_terciles_map.R --- modules/Visualization/R/plot_extreme_probs.R | 2 +- modules/Visualization/R/plot_most_likely_terciles_map.R | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/modules/Visualization/R/plot_extreme_probs.R b/modules/Visualization/R/plot_extreme_probs.R index b1dc07be..e36ab512 100644 --- a/modules/Visualization/R/plot_extreme_probs.R +++ b/modules/Visualization/R/plot_extreme_probs.R @@ -209,7 +209,7 @@ plot_extreme_probs <- function(recipe, fcst, indices = var, drop = 'selected') dim_dots <- dim(var_dots) - if (!isTRUE(dots_on_significant_points)) { + if (!isTRUE(dots_on_significant_points)) { var_dots <- as.numeric(var_dots <= 0) # Dots on non-significant (default) } else { var_dots <- as.numeric(var_dots > 0) # Dots on significant diff --git a/modules/Visualization/R/plot_most_likely_terciles_map.R b/modules/Visualization/R/plot_most_likely_terciles_map.R index 3f8a41b8..732a50e0 100644 --- a/modules/Visualization/R/plot_most_likely_terciles_map.R +++ b/modules/Visualization/R/plot_most_likely_terciles_map.R @@ -17,6 +17,7 @@ plot_most_likely_terciles <- function(recipe, dots = NULL, outdir, output_conf, + dots_on_significant_points = FALSE, ## put in recipe or Visualization()? logo = NULL, return_elements = FALSE) { @@ -159,7 +160,11 @@ plot_most_likely_terciles <- function(recipe, indices = var, drop = 'selected') dim_dots <- dim(var_dots) - var_dots <- as.numeric(var_dots <= 0) + if (!isTRUE(dots_on_significant_points)) { + var_dots <- as.numeric(var_dots <= 0) # Dots on non-significant (default) + } else { + var_dots <- as.numeric(var_dots > 0) # Dots on significant + } dim(var_dots) <- dim_dots } else { var_dots <- NULL -- GitLab From 1333c0fb806fa722c1585ac36c4621fc1003daf4 Mon Sep 17 00:00:00 2001 From: ARIADNA BATALLA FERRES Date: Wed, 27 Aug 2025 18:01:46 +0200 Subject: [PATCH 04/17] Add caption indicating which points are masked in plot_extreme_probs.R --- modules/Visualization/R/plot_extreme_probs.R | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/Visualization/R/plot_extreme_probs.R b/modules/Visualization/R/plot_extreme_probs.R index e36ab512..aa9d9bd3 100644 --- a/modules/Visualization/R/plot_extreme_probs.R +++ b/modules/Visualization/R/plot_extreme_probs.R @@ -210,9 +210,11 @@ plot_extreme_probs <- function(recipe, fcst, drop = 'selected') dim_dots <- dim(var_dots) if (!isTRUE(dots_on_significant_points)) { - var_dots <- as.numeric(var_dots <= 0) # Dots on non-significant (default) + var_dots <- as.numeric(var_dots <= 0) + dots_caption <- "Non-significant grid points are masked" } else { - var_dots <- as.numeric(var_dots > 0) # Dots on significant + var_dots <- as.numeric(var_dots > 0) + dots_caption <- "Significant grid points are masked" } dim(var_dots) <- dim_dots } else { @@ -366,7 +368,7 @@ plot_extreme_probs <- function(recipe, fcst, "Reference: ", recipe$Analysis$Datasets$Reference, " [", recipe$Analysis$Time$hcst_start, " - ", recipe$Analysis$Time$hcst_end, "]", - "\n", " ") + "\n", if (!is.null(dots)) dots_caption else " ") # Modify base arguments base_args[[1]] <- i_var_fcst[i, , ] if (is.null(attributes(fcst$attrs$time_bounds))) { -- GitLab From e5dd2cd6ff23f33fa6c24f41c29a57454f93d060 Mon Sep 17 00:00:00 2001 From: ARIADNA BATALLA FERRES Date: Thu, 28 Aug 2025 15:16:26 +0200 Subject: [PATCH 05/17] Read 'dots_on_significance' from recipe in plot_estreme_probs.R and plot_most_likely_terciles_map.R --- modules/Visualization/R/plot_extreme_probs.R | 2 +- modules/Visualization/R/plot_most_likely_terciles_map.R | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/Visualization/R/plot_extreme_probs.R b/modules/Visualization/R/plot_extreme_probs.R index aa9d9bd3..3fdc7b57 100644 --- a/modules/Visualization/R/plot_extreme_probs.R +++ b/modules/Visualization/R/plot_extreme_probs.R @@ -13,7 +13,6 @@ plot_extreme_probs <- function(recipe, fcst, mask = NULL, dots = NULL, outdir, output_conf, brks_min = 5, brks_max = 95, - dots_on_significant_points = FALSE, ## put in recipe or Visualization()? logo = NULL) { # Abort if frequency is daily if (recipe$Analysis$Variables$freq %in% c("daily", "daily_mean")) { @@ -209,6 +208,7 @@ plot_extreme_probs <- function(recipe, fcst, indices = var, drop = 'selected') dim_dots <- dim(var_dots) + dots_on_significant_points <- isTRUE(recipe$Analysis$Workflow$Visualization$dots_on_significant_points) if (!isTRUE(dots_on_significant_points)) { var_dots <- as.numeric(var_dots <= 0) dots_caption <- "Non-significant grid points are masked" diff --git a/modules/Visualization/R/plot_most_likely_terciles_map.R b/modules/Visualization/R/plot_most_likely_terciles_map.R index 732a50e0..f3c5efdc 100644 --- a/modules/Visualization/R/plot_most_likely_terciles_map.R +++ b/modules/Visualization/R/plot_most_likely_terciles_map.R @@ -17,7 +17,6 @@ plot_most_likely_terciles <- function(recipe, dots = NULL, outdir, output_conf, - dots_on_significant_points = FALSE, ## put in recipe or Visualization()? logo = NULL, return_elements = FALSE) { @@ -160,6 +159,7 @@ plot_most_likely_terciles <- function(recipe, indices = var, drop = 'selected') dim_dots <- dim(var_dots) + dots_on_significant_points <- isTRUE(recipe$Analysis$Workflow$Visualization$dots_on_significant_points) if (!isTRUE(dots_on_significant_points)) { var_dots <- as.numeric(var_dots <= 0) # Dots on non-significant (default) } else { -- GitLab From 277b0bb02bf5f629402e4a9b9473508b878ccec8 Mon Sep 17 00:00:00 2001 From: ARIADNA BATALLA FERRES Date: Thu, 28 Aug 2025 15:18:00 +0200 Subject: [PATCH 06/17] Format fix: update 'forecast map' name in Visualization.R --- modules/Visualization/Visualization.R | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/Visualization/Visualization.R b/modules/Visualization/Visualization.R index 8c50be45..91b867e8 100644 --- a/modules/Visualization/Visualization.R +++ b/modules/Visualization/Visualization.R @@ -25,7 +25,7 @@ Visualization <- function(recipe, skill_metrics = NULL, statistics = NULL, probabilities = NULL, - significance = F, + significance = FALSE, output_conf = NULL, logo = NULL) { # Try to produce and save several basic plots. @@ -144,7 +144,7 @@ Visualization <- function(recipe, } } - # Plot forecast ensemble mean + # Plot forecast map if ("forecast_map" %in% plots) { if (!is.null(data$fcst)) { if (is.null(recipe$Analysis$Workflow$Visualization$mask_ens)) { @@ -174,11 +174,11 @@ Visualization <- function(recipe, c('both', TRUE)) { if (is.null(skill_metrics)) { error(recipe$Run$logger, - paste0("For the forecast ensemble mean plot, skill_metrics ", + paste0("For the forecast map plot, skill_metrics ", "needs to be provided to be masked.")) } else if (!('enscorr' %in% names(skill_metrics))) { error(recipe$Run$logger, - paste0("For the forecast ensemble mean plot, enscor metric ", + paste0("For the forecast map plot, enscor metric ", "needs to be provided to be masked.")) } else { plot_forecast_map(recipe, data$fcst, @@ -193,11 +193,11 @@ Visualization <- function(recipe, if (recipe$Analysis$Workflow$Visualization$dots %in% c('both', TRUE)) { if (is.null(skill_metrics)) { error(recipe$Run$logger, - paste0("For the forecast ensemble mean plot, skill_metrics ", + paste0("For the forecast map plot, skill_metrics ", "needs to be provided for the dots.")) } else if (!('enscorr' %in% names(skill_metrics))) { error(recipe$Run$logger, - paste0("For the forecast ensemble mean plot, enscor metric ", + paste0("For the forecast map plot, enscor metric ", "needs to be provided for the dots.")) } else { plot_forecast_map(recipe, data$fcst, @@ -211,7 +211,7 @@ Visualization <- function(recipe, } ## End loop over methods } else { error(recipe$Run$logger, - paste0("The forecast ensemble mean plot has been requested, but ", + paste0("The forecast map plot has been requested, but ", "there is no fcst element in 'data'.")) } } -- GitLab From 47ac37c6ba6206069683f1d60d486697ddb84324 Mon Sep 17 00:00:00 2001 From: ARIADNA BATALLA FERRES Date: Thu, 28 Aug 2025 15:19:42 +0200 Subject: [PATCH 07/17] Change default 'dot_symbol' to 4 (cross) in plot_extreme_probs.R base_args --- modules/Visualization/R/plot_extreme_probs.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/Visualization/R/plot_extreme_probs.R b/modules/Visualization/R/plot_extreme_probs.R index 3fdc7b57..fc350bba 100644 --- a/modules/Visualization/R/plot_extreme_probs.R +++ b/modules/Visualization/R/plot_extreme_probs.R @@ -291,7 +291,7 @@ plot_extreme_probs <- function(recipe, fcst, fun <- VizEquiMap base_args <- list(data = NULL, dots = NULL, mask = NULL, lon = longitude, lat = latitude, - dot_symbol = 20, title_scale = 0.6, + dot_symbol = 4, title_scale = 0.6, font.main = 2, margin_scale = c(1, 5, 5, 5), filled.continents = F, brks = brks, cols = cols, bar_label_digits = 4, bar_label_scale = 1.5, @@ -313,7 +313,7 @@ plot_extreme_probs <- function(recipe, fcst, lon_dim = 'longitude', lat_dim = 'latitude', target_proj = target_proj, drawleg = 'bar', style = 'point', brks = brks, cols = cols, - dot_size = 0.2, dot_symbol = 47, + dot_size = 0.2, dot_symbol = 4, col_inf = cols_1[1], col_sup = cols_2[length(cols_2)]) } -- GitLab From 62a588e441bcf64d5c7e67624ed9a32351829b53 Mon Sep 17 00:00:00 2001 From: ARIADNA BATALLA FERRES Date: Thu, 28 Aug 2025 16:04:42 +0200 Subject: [PATCH 08/17] Add 'dots_on_significant_points' in recipe_template.yml --- recipe_template.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/recipe_template.yml b/recipe_template.yml index 8df18712..5fb59897 100644 --- a/recipe_template.yml +++ b/recipe_template.yml @@ -148,8 +148,9 @@ Analysis: multi_panel: yes # Multi-panel plot or single-panel plots. Default is 'no/false'. (Optional, bool) projection: 'cylindrical_equidistant' # Options: 'cylindrical_equidistant', 'robinson', 'lambert_europe'. Default is cylindrical equidistant. (Optional, str) significance: 'dots' # Type of mask for statistical significance. Options are 'dots', and yes/no. 'dots'. 'mask' and 'both' options are not available for projections other than cylindrical_equidistant. - mask_terciles: no # Whether to dot or mask the non-significant points by rpss in the most likely tercile plot. yes/true, no/false or 'both'. Default is no/false. (Optional, str) - dots_terciles: yes # Whether to dot the non-significant by rpss in the most likely tercile plot. yes/true, no/false or 'both'. Default is no/false. (Optional, str) + mask_terciles: no # Whether to mask the non-significant points by rpss in the most likely tercile plot. yes/true, no/false or 'both'. Default is no/false. (Optional, str) + dots_terciles: yes # Whether to dot the non-significant points by rpss in the most likely tercile plot. yes/true, no/false or 'both'. Default is no/false. (Optional, str) + dots_on_significant_points: no # Whether to dot the significant grid points. Either yes/true or no/false. mask_ens: no # Whether to mask the non-significant points by rpss in the forecast ensemble mean plot. yes/true, no/false or 'both'. Default is no/false. (Optional, str) shapefile: # path to a shapefile (*.shp) to include in the plots. Only available for the cylindrical equidistant projection. (Optional, str) logo: tools/BSC_logo_95.jpg # path to a logo (*.png or *.jpg/jpeg) to include in the plots. (Optional, str) -- GitLab From 2b20161c9a5cbe6821207dd682de7a85458a1a77 Mon Sep 17 00:00:00 2001 From: ARIADNA BATALLA FERRES Date: Thu, 28 Aug 2025 17:40:00 +0200 Subject: [PATCH 09/17] Add parameter to choose grid point to dot + caption + default cross in plot_forecast_map.R --- modules/Visualization/R/plot_forecast_map.R | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/modules/Visualization/R/plot_forecast_map.R b/modules/Visualization/R/plot_forecast_map.R index e86800c1..27e503d8 100644 --- a/modules/Visualization/R/plot_forecast_map.R +++ b/modules/Visualization/R/plot_forecast_map.R @@ -159,7 +159,14 @@ plot_forecast_map <- function(recipe, fcst, mask = NULL, dots = NULL, indices = var, drop = 'selected') dim_dots <- dim(var_dots) - var_dots <- as.numeric(var_dots <= 0) + dots_on_significant_points <- isTRUE(recipe$Analysis$Workflow$Visualization$dots_on_significant_points) + if (!isTRUE(dots_on_significant_points)) { + var_dots <- as.numeric(var_dots <= 0) + dots_caption <- "Statistically non-significant grid points are marked" + } else { + var_dots <- as.numeric(var_dots > 0) + dots_caption <- "Statistically significant grid points are marked" + } dim(var_dots) <- dim_dots } else { var_dots <- NULL @@ -231,7 +238,7 @@ plot_forecast_map <- function(recipe, fcst, mask = NULL, dots = NULL, fun <- VizEquiMap base_args <- list(data = NULL, dots = NULL, mask = NULL, lon = longitude, lat = latitude, - dot_symbol = 20, title_scale = 0.7, + dot_symbol = 4, title_scale = 0.7, font.main = 2, margin_scale = c(3, 5, 5, 5), bar_extra_margin = rep(0.9, 4), filled.continents = F, brks = brks, cols = cols, @@ -251,7 +258,7 @@ plot_forecast_map <- function(recipe, fcst, mask = NULL, dots = NULL, lon_dim = 'longitude', lat_dim = 'latitude', target_proj = target_proj, drawleg = 'bar', style = 'point', brks = brks, cols = cols, - dot_size = 0.2, dot_symbol = 47) + dot_size = 0.2, dot_symbol = 4) } output_configuration <- output_conf[[projection]]$forecast_map base_args[names(output_configuration)] <- output_configuration @@ -303,7 +310,8 @@ plot_forecast_map <- function(recipe, fcst, mask = NULL, dots = NULL, "%d-%m-%Y"), "\n", forecast_time_caption, "\n", "Reference: ", recipe$Analysis$Datasets$Reference, "\n", - "Units: ", units) + "Units: ", units, "\n", + if (!is.null(dots)) dots_caption else " ") # Modify base arguments base_args[[1]] <- i_var_fcst[i, , ] if (is.null(attributes(fcst$attrs$time_bounds))) { -- GitLab From 3f785c6a24d9cdba07a55a65534d452d712edb1f Mon Sep 17 00:00:00 2001 From: ARIADNA BATALLA FERRES Date: Tue, 2 Sep 2025 17:20:36 +0200 Subject: [PATCH 10/17] Add parameter to choose grid point to dot + caption + default cross in plot_metrics.R --- modules/Visualization/R/plot_metrics.R | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/modules/Visualization/R/plot_metrics.R b/modules/Visualization/R/plot_metrics.R index 6392609c..2ce1bd83 100644 --- a/modules/Visualization/R/plot_metrics.R +++ b/modules/Visualization/R/plot_metrics.R @@ -302,7 +302,7 @@ plot_metrics <- function(recipe, data_cube, metrics, data = asplit(metric, MARGIN = 1), lon = longitude, lat = latitude, special_args = metric_significance, - dot_symbol = 20, toptitle = toptitle, + dot_symbol = 4, toptitle = toptitle, title_scale = 0.6, titles = titles, filled.continents = FALSE, brks = brks, cols = cols, col_inf = col_inf, col_sup = col_sup, @@ -338,7 +338,7 @@ plot_metrics <- function(recipe, data_cube, metrics, fun <- VizEquiMap base_args <- list(data = NULL, dots = NULL, lon = longitude, lat = latitude, - dot_symbol = 20, dot_size = 1, + dot_symbol = 4, dot_size = 1, title_scale = 0.6, filled.continents = F, brks = brks, cols = cols, col_inf = col_inf, col_sup = col_sup, @@ -363,7 +363,7 @@ plot_metrics <- function(recipe, data_cube, metrics, target_proj = target_proj, drawleg = 'bar', style = 'point', dots = NULL, brks = brks, cols = cols, col_inf = col_inf, col_sup = col_sup, - units = units, dot_size = 0.2, dot_symbol = 47) + units = units, dot_size = 0.2, dot_symbol = 4) } output_configuration <- output_conf[[projection]]$skill_metrics base_args[names(output_configuration)] <- output_configuration @@ -483,10 +483,24 @@ plot_metrics <- function(recipe, data_cube, metrics, if (significance == 'dots') { if (projection != 'cylindrical_equidistant') { base_args[[10]] <- metric_significance[[i]][[1]] + dots_caption <- paste0("Statistically significant grid points are marked", "\n") + dots_on_significant_points <- + isTRUE(recipe$Analysis$Workflow$Visualization$dots_on_significant_points) + if (!isTRUE(dots_on_significant_points)) { + base_args[[10]] <- 1 - base_args[[10]] + dots_caption <- paste0("Statistically non-significant grid points are marked", "\n") + } } else { # The position of arguments in base_args requires this cond # so VizEquiMap plots dots when requested base_args[[2]] <- metric_significance[[i]][[1]] + dots_caption <- paste0("Statistically significant grid points are marked", "\n") + dots_on_significant_points <- + isTRUE(recipe$Analysis$Workflow$Visualization$dots_on_significant_points) + if (!isTRUE(dots_on_significant_points)) { + base_args[[2]] <- 1 - base_args[[2]] + dots_caption <- paste0("Statistically non-significant grid points are marked", "\n") + } } sign_file_label <- '_dots' } else if (significance == 'mask') { @@ -494,7 +508,7 @@ plot_metrics <- function(recipe, data_cube, metrics, sign_file_label <- '_mask' } } - significance_caption <- "\n alpha = 0.05" + significance_caption <- "alpha = 0.05" } else { significance_caption <- NULL sign_file_label <- NULL @@ -503,7 +517,8 @@ plot_metrics <- function(recipe, data_cube, metrics, base_args[['caption']] <- paste0("Nominal start date: ", nominal_startdate_caption, "\n", forecast_time_caption, "\n", - "Reference: ", recipe$Analysis$Datasets$Reference, + "Reference: ", recipe$Analysis$Datasets$Reference, "\n", + if (!is.null(dots)) dots_caption, significance_caption) fileout <- paste0(outfile, "_ft", forecast_time, -- GitLab From a8de23921a14437180aa2c69e43930e9c0f452b9 Mon Sep 17 00:00:00 2001 From: ARIADNA BATALLA FERRES Date: Wed, 3 Sep 2025 12:09:21 +0200 Subject: [PATCH 11/17] bugfix dots caption in plot_metrics.R --- modules/Visualization/R/plot_metrics.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/Visualization/R/plot_metrics.R b/modules/Visualization/R/plot_metrics.R index 2ce1bd83..c9666086 100644 --- a/modules/Visualization/R/plot_metrics.R +++ b/modules/Visualization/R/plot_metrics.R @@ -518,7 +518,7 @@ plot_metrics <- function(recipe, data_cube, metrics, paste0("Nominal start date: ", nominal_startdate_caption, "\n", forecast_time_caption, "\n", "Reference: ", recipe$Analysis$Datasets$Reference, "\n", - if (!is.null(dots)) dots_caption, + if (significance == 'dots') dots_caption, significance_caption) fileout <- paste0(outfile, "_ft", forecast_time, -- GitLab From a262d21c974b6cc676c69fa48140349a6438c7d7 Mon Sep 17 00:00:00 2001 From: ARIADNA BATALLA FERRES Date: Wed, 3 Sep 2025 12:37:07 +0200 Subject: [PATCH 12/17] Set 'dots_on_significant_points' default value in Visualization.R --- modules/Visualization/R/plot_extreme_probs.R | 7 +++---- modules/Visualization/R/plot_forecast_map.R | 3 +-- modules/Visualization/R/plot_metrics.R | 8 ++------ modules/Visualization/R/plot_most_likely_terciles_map.R | 9 +++++---- modules/Visualization/Visualization.R | 5 +++++ 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/modules/Visualization/R/plot_extreme_probs.R b/modules/Visualization/R/plot_extreme_probs.R index fc350bba..22df1f48 100644 --- a/modules/Visualization/R/plot_extreme_probs.R +++ b/modules/Visualization/R/plot_extreme_probs.R @@ -208,13 +208,12 @@ plot_extreme_probs <- function(recipe, fcst, indices = var, drop = 'selected') dim_dots <- dim(var_dots) - dots_on_significant_points <- isTRUE(recipe$Analysis$Workflow$Visualization$dots_on_significant_points) - if (!isTRUE(dots_on_significant_points)) { + if (!recipe$Analysis$Workflow$Visualization$dots_on_significant_points) { var_dots <- as.numeric(var_dots <= 0) - dots_caption <- "Non-significant grid points are masked" + dots_caption <- "Statistically non-significant grid points are marked" } else { var_dots <- as.numeric(var_dots > 0) - dots_caption <- "Significant grid points are masked" + dots_caption <- "Statistically significant grid points are marked" } dim(var_dots) <- dim_dots } else { diff --git a/modules/Visualization/R/plot_forecast_map.R b/modules/Visualization/R/plot_forecast_map.R index 27e503d8..04902002 100644 --- a/modules/Visualization/R/plot_forecast_map.R +++ b/modules/Visualization/R/plot_forecast_map.R @@ -159,8 +159,7 @@ plot_forecast_map <- function(recipe, fcst, mask = NULL, dots = NULL, indices = var, drop = 'selected') dim_dots <- dim(var_dots) - dots_on_significant_points <- isTRUE(recipe$Analysis$Workflow$Visualization$dots_on_significant_points) - if (!isTRUE(dots_on_significant_points)) { + if (!recipe$Analysis$Workflow$Visualization$dots_on_significant_points) { var_dots <- as.numeric(var_dots <= 0) dots_caption <- "Statistically non-significant grid points are marked" } else { diff --git a/modules/Visualization/R/plot_metrics.R b/modules/Visualization/R/plot_metrics.R index c9666086..482cf36f 100644 --- a/modules/Visualization/R/plot_metrics.R +++ b/modules/Visualization/R/plot_metrics.R @@ -484,9 +484,7 @@ plot_metrics <- function(recipe, data_cube, metrics, if (projection != 'cylindrical_equidistant') { base_args[[10]] <- metric_significance[[i]][[1]] dots_caption <- paste0("Statistically significant grid points are marked", "\n") - dots_on_significant_points <- - isTRUE(recipe$Analysis$Workflow$Visualization$dots_on_significant_points) - if (!isTRUE(dots_on_significant_points)) { + if (!recipe$Analysis$Workflow$Visualization$dots_on_significant_points) { base_args[[10]] <- 1 - base_args[[10]] dots_caption <- paste0("Statistically non-significant grid points are marked", "\n") } @@ -495,9 +493,7 @@ plot_metrics <- function(recipe, data_cube, metrics, # so VizEquiMap plots dots when requested base_args[[2]] <- metric_significance[[i]][[1]] dots_caption <- paste0("Statistically significant grid points are marked", "\n") - dots_on_significant_points <- - isTRUE(recipe$Analysis$Workflow$Visualization$dots_on_significant_points) - if (!isTRUE(dots_on_significant_points)) { + if (!recipe$Analysis$Workflow$Visualization$dots_on_significant_points) { base_args[[2]] <- 1 - base_args[[2]] dots_caption <- paste0("Statistically non-significant grid points are marked", "\n") } diff --git a/modules/Visualization/R/plot_most_likely_terciles_map.R b/modules/Visualization/R/plot_most_likely_terciles_map.R index f3c5efdc..67637c9b 100644 --- a/modules/Visualization/R/plot_most_likely_terciles_map.R +++ b/modules/Visualization/R/plot_most_likely_terciles_map.R @@ -159,11 +159,12 @@ plot_most_likely_terciles <- function(recipe, indices = var, drop = 'selected') dim_dots <- dim(var_dots) - dots_on_significant_points <- isTRUE(recipe$Analysis$Workflow$Visualization$dots_on_significant_points) - if (!isTRUE(dots_on_significant_points)) { - var_dots <- as.numeric(var_dots <= 0) # Dots on non-significant (default) + if (!recipe$Analysis$Workflow$Visualization$dots_on_significant_points) { + var_dots <- as.numeric(var_dots <= 0) + dots_caption <- "Statistically non-significant grid points are marked" } else { - var_dots <- as.numeric(var_dots > 0) # Dots on significant + var_dots <- as.numeric(var_dots > 0) + dots_caption <- "Statistically significant grid points are marked" } dim(var_dots) <- dim_dots } else { diff --git a/modules/Visualization/Visualization.R b/modules/Visualization/Visualization.R index 91b867e8..98f645bd 100644 --- a/modules/Visualization/Visualization.R +++ b/modules/Visualization/Visualization.R @@ -85,6 +85,11 @@ Visualization <- function(recipe, recipe$Analysis$Workflow$Visualization$multi_panel <- FALSE } + # Set default dotting of non-significant grid points if not specified + if (is.null(recipe$Analysis$Workflow$Visualization$dots_on_significant_points)) { + recipe$Analysis$Workflow$Visualization$dots_on_significant_points <- FALSE + } + # Warning if significance parameter not included in function call if (!missing(significance) && !is.null(recipe$Analysis$Workflow$Visualization$significance)) { if (significance != recipe$Analysis$Workflow$Visualization$significance) { -- GitLab From 27ea050f853020f1ecdbd197be52356f6600d418 Mon Sep 17 00:00:00 2001 From: ARIADNA BATALLA FERRES Date: Tue, 9 Sep 2025 15:23:53 +0200 Subject: [PATCH 13/17] Add dots caption to plot_most_likely_terciles_map.R --- .../Visualization/R/plot_most_likely_terciles_map.R | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/modules/Visualization/R/plot_most_likely_terciles_map.R b/modules/Visualization/R/plot_most_likely_terciles_map.R index 67637c9b..74a166f9 100644 --- a/modules/Visualization/R/plot_most_likely_terciles_map.R +++ b/modules/Visualization/R/plot_most_likely_terciles_map.R @@ -161,10 +161,10 @@ plot_most_likely_terciles <- function(recipe, dim_dots <- dim(var_dots) if (!recipe$Analysis$Workflow$Visualization$dots_on_significant_points) { var_dots <- as.numeric(var_dots <= 0) - dots_caption <- "Statistically non-significant grid points are marked" + dots_caption <- "Grid points with negative RPSS values are marked" } else { var_dots <- as.numeric(var_dots > 0) - dots_caption <- "Statistically significant grid points are marked" + dots_caption <- "Grid points with positive RPSS values are marked" } dim(var_dots) <- dim_dots } else { @@ -356,6 +356,12 @@ plot_most_likely_terciles <- function(recipe, tmp$bar_titles <- NULL tmp$nmap <- NULL tmp$var_limits <- NULL + if (i_bar == 1) { + if (!is.null(dots_caption)) { + mtext(dots_caption, side = 1, line = 12, at = NA, adj = 0, + cex = 0.9, col = "black") + } + } if (length(cb_info$brks[[i_bar]]) > 2) { # plot colorbar as normal do.call(ColorBar, tmp) -- GitLab From cd46f9ab5de64177347b657501a863a9e8dc2831 Mon Sep 17 00:00:00 2001 From: ARIADNA BATALLA FERRES Date: Tue, 9 Sep 2025 15:38:44 +0200 Subject: [PATCH 14/17] Update caption in extreme_probabilities and forecast_map to state dotting is based on RPSS --- modules/Visualization/R/plot_extreme_probs.R | 4 ++-- modules/Visualization/R/plot_forecast_map.R | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/Visualization/R/plot_extreme_probs.R b/modules/Visualization/R/plot_extreme_probs.R index 22df1f48..a82be809 100644 --- a/modules/Visualization/R/plot_extreme_probs.R +++ b/modules/Visualization/R/plot_extreme_probs.R @@ -210,10 +210,10 @@ plot_extreme_probs <- function(recipe, fcst, dim_dots <- dim(var_dots) if (!recipe$Analysis$Workflow$Visualization$dots_on_significant_points) { var_dots <- as.numeric(var_dots <= 0) - dots_caption <- "Statistically non-significant grid points are marked" + dots_caption <- "Grid points with negative RPSS values are marked" } else { var_dots <- as.numeric(var_dots > 0) - dots_caption <- "Statistically significant grid points are marked" + dots_caption <- "Grid points with positive RPSS values are marked" } dim(var_dots) <- dim_dots } else { diff --git a/modules/Visualization/R/plot_forecast_map.R b/modules/Visualization/R/plot_forecast_map.R index 04902002..5f3d770b 100644 --- a/modules/Visualization/R/plot_forecast_map.R +++ b/modules/Visualization/R/plot_forecast_map.R @@ -161,10 +161,10 @@ plot_forecast_map <- function(recipe, fcst, mask = NULL, dots = NULL, dim_dots <- dim(var_dots) if (!recipe$Analysis$Workflow$Visualization$dots_on_significant_points) { var_dots <- as.numeric(var_dots <= 0) - dots_caption <- "Statistically non-significant grid points are marked" + dots_caption <- "Grid points with negative RPSS values are marked" } else { var_dots <- as.numeric(var_dots > 0) - dots_caption <- "Statistically significant grid points are marked" + dots_caption <- "Grid points with positive RPSS values are marked" } dim(var_dots) <- dim_dots } else { -- GitLab From f83355ccafc3b8626d139050f6e40af20fbd79c7 Mon Sep 17 00:00:00 2001 From: ARIADNA BATALLA FERRES Date: Tue, 9 Sep 2025 16:04:50 +0200 Subject: [PATCH 15/17] Bugfix plot_most_likely_terciles_map.R --- modules/Visualization/R/plot_most_likely_terciles_map.R | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/Visualization/R/plot_most_likely_terciles_map.R b/modules/Visualization/R/plot_most_likely_terciles_map.R index 74a166f9..606aa50a 100644 --- a/modules/Visualization/R/plot_most_likely_terciles_map.R +++ b/modules/Visualization/R/plot_most_likely_terciles_map.R @@ -169,6 +169,7 @@ plot_most_likely_terciles <- function(recipe, dim(var_dots) <- dim_dots } else { var_dots <- NULL + dots_caption <- NULL } # Plot title labels look different depending on horizon and aggregation -- GitLab From befa614fcc35f7850350c03fb9c5a60787f8eccc Mon Sep 17 00:00:00 2001 From: ARIADNA BATALLA FERRES Date: Thu, 18 Sep 2025 10:21:56 +0200 Subject: [PATCH 16/17] Improve RPSS dots caption (suggestion by @nperez) --- modules/Visualization/R/plot_extreme_probs.R | 4 ++-- modules/Visualization/R/plot_forecast_map.R | 4 ++-- modules/Visualization/R/plot_most_likely_terciles_map.R | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/Visualization/R/plot_extreme_probs.R b/modules/Visualization/R/plot_extreme_probs.R index a82be809..b182c996 100644 --- a/modules/Visualization/R/plot_extreme_probs.R +++ b/modules/Visualization/R/plot_extreme_probs.R @@ -210,10 +210,10 @@ plot_extreme_probs <- function(recipe, fcst, dim_dots <- dim(var_dots) if (!recipe$Analysis$Workflow$Visualization$dots_on_significant_points) { var_dots <- as.numeric(var_dots <= 0) - dots_caption <- "Grid points with negative RPSS values are marked" + dots_caption <- "Dots indicate negative RPSS" } else { var_dots <- as.numeric(var_dots > 0) - dots_caption <- "Grid points with positive RPSS values are marked" + dots_caption <- "Dots indicate positive RPSS" } dim(var_dots) <- dim_dots } else { diff --git a/modules/Visualization/R/plot_forecast_map.R b/modules/Visualization/R/plot_forecast_map.R index 5f3d770b..9a013d5a 100644 --- a/modules/Visualization/R/plot_forecast_map.R +++ b/modules/Visualization/R/plot_forecast_map.R @@ -161,10 +161,10 @@ plot_forecast_map <- function(recipe, fcst, mask = NULL, dots = NULL, dim_dots <- dim(var_dots) if (!recipe$Analysis$Workflow$Visualization$dots_on_significant_points) { var_dots <- as.numeric(var_dots <= 0) - dots_caption <- "Grid points with negative RPSS values are marked" + dots_caption <- "Dots indicate negative RPSS" } else { var_dots <- as.numeric(var_dots > 0) - dots_caption <- "Grid points with positive RPSS values are marked" + dots_caption <- "Dots indicate positive RPSS" } dim(var_dots) <- dim_dots } else { diff --git a/modules/Visualization/R/plot_most_likely_terciles_map.R b/modules/Visualization/R/plot_most_likely_terciles_map.R index 606aa50a..b82d6b0f 100644 --- a/modules/Visualization/R/plot_most_likely_terciles_map.R +++ b/modules/Visualization/R/plot_most_likely_terciles_map.R @@ -161,10 +161,10 @@ plot_most_likely_terciles <- function(recipe, dim_dots <- dim(var_dots) if (!recipe$Analysis$Workflow$Visualization$dots_on_significant_points) { var_dots <- as.numeric(var_dots <= 0) - dots_caption <- "Grid points with negative RPSS values are marked" + dots_caption <- "Dots indicate negative RPSS" } else { var_dots <- as.numeric(var_dots > 0) - dots_caption <- "Grid points with positive RPSS values are marked" + dots_caption <- "Dots indicate positive RPSS" } dim(var_dots) <- dim_dots } else { -- GitLab From 9146235680530817efda4e1b1857decc96b6944b Mon Sep 17 00:00:00 2001 From: ARIADNA BATALLA FERRES Date: Thu, 18 Sep 2025 10:51:30 +0200 Subject: [PATCH 17/17] Variable name change to 'dots_on_points' so it's more user-friendly --- modules/Visualization/R/plot_extreme_probs.R | 4 ++-- modules/Visualization/R/plot_forecast_map.R | 4 ++-- modules/Visualization/R/plot_metrics.R | 18 ++++++++++-------- .../R/plot_most_likely_terciles_map.R | 4 ++-- modules/Visualization/Visualization.R | 4 ++-- recipe_template.yml | 2 +- 6 files changed, 19 insertions(+), 17 deletions(-) diff --git a/modules/Visualization/R/plot_extreme_probs.R b/modules/Visualization/R/plot_extreme_probs.R index b182c996..5669efd8 100644 --- a/modules/Visualization/R/plot_extreme_probs.R +++ b/modules/Visualization/R/plot_extreme_probs.R @@ -208,10 +208,10 @@ plot_extreme_probs <- function(recipe, fcst, indices = var, drop = 'selected') dim_dots <- dim(var_dots) - if (!recipe$Analysis$Workflow$Visualization$dots_on_significant_points) { + if (recipe$Analysis$Workflow$Visualization$dots_on_points == "significant") { var_dots <- as.numeric(var_dots <= 0) dots_caption <- "Dots indicate negative RPSS" - } else { + } else { # "non-significant" var_dots <- as.numeric(var_dots > 0) dots_caption <- "Dots indicate positive RPSS" } diff --git a/modules/Visualization/R/plot_forecast_map.R b/modules/Visualization/R/plot_forecast_map.R index 9a013d5a..7ba2e882 100644 --- a/modules/Visualization/R/plot_forecast_map.R +++ b/modules/Visualization/R/plot_forecast_map.R @@ -159,10 +159,10 @@ plot_forecast_map <- function(recipe, fcst, mask = NULL, dots = NULL, indices = var, drop = 'selected') dim_dots <- dim(var_dots) - if (!recipe$Analysis$Workflow$Visualization$dots_on_significant_points) { + if (recipe$Analysis$Workflow$Visualization$dots_on_points == "significant") { var_dots <- as.numeric(var_dots <= 0) dots_caption <- "Dots indicate negative RPSS" - } else { + } else { # "non-significant" var_dots <- as.numeric(var_dots > 0) dots_caption <- "Dots indicate positive RPSS" } diff --git a/modules/Visualization/R/plot_metrics.R b/modules/Visualization/R/plot_metrics.R index 482cf36f..43b012dd 100644 --- a/modules/Visualization/R/plot_metrics.R +++ b/modules/Visualization/R/plot_metrics.R @@ -482,20 +482,22 @@ plot_metrics <- function(recipe, data_cube, metrics, } else { if (significance == 'dots') { if (projection != 'cylindrical_equidistant') { - base_args[[10]] <- metric_significance[[i]][[1]] - dots_caption <- paste0("Statistically significant grid points are marked", "\n") - if (!recipe$Analysis$Workflow$Visualization$dots_on_significant_points) { + if (recipe$Analysis$Workflow$Visualization$dots_on_points == "significant") { + base_args[[10]] <- metric_significance[[i]][[1]] + dots_caption <- paste0("Dots indicate statistical significance", "\n") + } else { # "non-significant" base_args[[10]] <- 1 - base_args[[10]] - dots_caption <- paste0("Statistically non-significant grid points are marked", "\n") + dots_caption <- paste0("Dots indicate statistical non-significance", "\n") } } else { # The position of arguments in base_args requires this cond # so VizEquiMap plots dots when requested - base_args[[2]] <- metric_significance[[i]][[1]] - dots_caption <- paste0("Statistically significant grid points are marked", "\n") - if (!recipe$Analysis$Workflow$Visualization$dots_on_significant_points) { + if (recipe$Analysis$Workflow$Visualization$dots_on_points == "significant") { + base_args[[2]] <- metric_significance[[i]][[1]] + dots_caption <- paste0("Dots indicate statistical significance", "\n") + } else { base_args[[2]] <- 1 - base_args[[2]] - dots_caption <- paste0("Statistically non-significant grid points are marked", "\n") + dots_caption <- paste0("Dots indicate statistical non-significance", "\n") } } sign_file_label <- '_dots' diff --git a/modules/Visualization/R/plot_most_likely_terciles_map.R b/modules/Visualization/R/plot_most_likely_terciles_map.R index b82d6b0f..14406085 100644 --- a/modules/Visualization/R/plot_most_likely_terciles_map.R +++ b/modules/Visualization/R/plot_most_likely_terciles_map.R @@ -159,10 +159,10 @@ plot_most_likely_terciles <- function(recipe, indices = var, drop = 'selected') dim_dots <- dim(var_dots) - if (!recipe$Analysis$Workflow$Visualization$dots_on_significant_points) { + if (recipe$Analysis$Workflow$Visualization$dots_on_points == "significant") { var_dots <- as.numeric(var_dots <= 0) dots_caption <- "Dots indicate negative RPSS" - } else { + } else { # "non-significant" var_dots <- as.numeric(var_dots > 0) dots_caption <- "Dots indicate positive RPSS" } diff --git a/modules/Visualization/Visualization.R b/modules/Visualization/Visualization.R index 98f645bd..6fab018e 100644 --- a/modules/Visualization/Visualization.R +++ b/modules/Visualization/Visualization.R @@ -86,8 +86,8 @@ Visualization <- function(recipe, } # Set default dotting of non-significant grid points if not specified - if (is.null(recipe$Analysis$Workflow$Visualization$dots_on_significant_points)) { - recipe$Analysis$Workflow$Visualization$dots_on_significant_points <- FALSE + if (is.null(recipe$Analysis$Workflow$Visualization$dots_on_points)) { + recipe$Analysis$Workflow$Visualization$dots_on_points <- "non-significant" } # Warning if significance parameter not included in function call diff --git a/recipe_template.yml b/recipe_template.yml index 5fb59897..c948cb84 100644 --- a/recipe_template.yml +++ b/recipe_template.yml @@ -150,7 +150,7 @@ Analysis: significance: 'dots' # Type of mask for statistical significance. Options are 'dots', and yes/no. 'dots'. 'mask' and 'both' options are not available for projections other than cylindrical_equidistant. mask_terciles: no # Whether to mask the non-significant points by rpss in the most likely tercile plot. yes/true, no/false or 'both'. Default is no/false. (Optional, str) dots_terciles: yes # Whether to dot the non-significant points by rpss in the most likely tercile plot. yes/true, no/false or 'both'. Default is no/false. (Optional, str) - dots_on_significant_points: no # Whether to dot the significant grid points. Either yes/true or no/false. + dots_on_points: "non-significant" # Which grid points to dot, if dots are requested. Either "significant" or "non-significant". mask_ens: no # Whether to mask the non-significant points by rpss in the forecast ensemble mean plot. yes/true, no/false or 'both'. Default is no/false. (Optional, str) shapefile: # path to a shapefile (*.shp) to include in the plots. Only available for the cylindrical equidistant projection. (Optional, str) logo: tools/BSC_logo_95.jpg # path to a logo (*.png or *.jpg/jpeg) to include in the plots. (Optional, str) -- GitLab