From 8f63e694ff70aa22db5152e25c8b972366b988bd Mon Sep 17 00:00:00 2001 From: vagudets Date: Tue, 12 Mar 2024 09:47:02 +0100 Subject: [PATCH 1/6] Change default plot format to PDF --- modules/Indices/R/compute_nao.R | 16 ++++++++-------- modules/Indices/R/compute_nino.R | 16 ++++++++-------- modules/Visualization/R/plot_ensemble_mean.R | 4 ++-- .../R/plot_most_likely_terciles_map.R | 4 ++-- modules/Visualization/R/plot_skill_metrics.R | 4 ++-- tests/testthat/test-decadal_monthly_1.R | 4 ++-- tests/testthat/test-decadal_monthly_2.R | 2 +- tests/testthat/test-seasonal_NAO.R | 8 ++++---- tests/testthat/test-seasonal_monthly.R | 6 +++--- 9 files changed, 32 insertions(+), 32 deletions(-) diff --git a/modules/Indices/R/compute_nao.R b/modules/Indices/R/compute_nao.R index 5bb76e4e..bdf2bb85 100644 --- a/modules/Indices/R/compute_nao.R +++ b/modules/Indices/R/compute_nao.R @@ -182,7 +182,7 @@ compute_nao <- function(data, recipe, obsproj, plot_ts, plot_sp, plotfile <- paste0(recipe$Run$output_dir, "/plots/Indices/NAO_", system, "_", recipe$Analysis$Datasets$Reference$name, "_s", recipe$Analysis$Time$sdate, "_ftime", - sprintf("%02d", tstep - 1 + recipe$Analysis$Time$ftime_min), ".png") + sprintf("%02d", tstep - 1 + recipe$Analysis$Time$ftime_min), ".pdf") caption <- paste0("NAO method: ", ifelse(recipe$Analysis$Workflow$Indices$NAO$obsproj, "Pobs", "Pmod"), " (Doblas-Reyes et al., 2003)\n", @@ -199,7 +199,7 @@ compute_nao <- function(data, recipe, obsproj, plot_ts, plot_sp, plotfile <- paste0(recipe$Run$output_dir, "/plots/Indices/NAO_", system, "_", recipe$Analysis$Datasets$Reference$name, "_ftime", - sprintf("%02d", tstep - 1 + recipe$Analysis$Time$ftime_min), ".png") + sprintf("%02d", tstep - 1 + recipe$Analysis$Time$ftime_min), ".pdf") caption <- paste0("NAO method: ", ifelse(recipe$Analysis$Workflow$Indices$NAO$obsproj, "Pobs", "Pmod"), " (Doblas-Reyes et al., 2003)\n", @@ -277,7 +277,7 @@ compute_nao <- function(data, recipe, obsproj, plot_ts, plot_sp, recipe$Analysis$Variable$name, "_", recipe$Analysis$Datasets$Reference$name, "_s", recipe$Analysis$Time$sdate, - "_ftime", fmonth, ".png") + "_ftime", fmonth, ".pdf") caption <- paste0("NAO method: ", ifelse(recipe$Analysis$Workflow$Indices$NAO$obsproj, "Pobs", "Pmod"), " (Doblas-Reyes et al., 2003)\n", @@ -295,7 +295,7 @@ compute_nao <- function(data, recipe, obsproj, plot_ts, plot_sp, plotfile <- paste0(recipe$Run$output_dir, "/plots/Indices/NAO_correlation_", recipe$Analysis$Variable$name, "_", recipe$Analysis$Datasets$Reference$name, - "_ftime", fmonth, ".png") + "_ftime", fmonth, ".pdf") caption <- paste0("NAO method: ", ifelse(recipe$Analysis$Workflow$Indices$NAO$obsproj, "Pobs", "Pmod"), " (Doblas-Reyes et al., 2003)\n", @@ -335,7 +335,7 @@ compute_nao <- function(data, recipe, obsproj, plot_ts, plot_sp, recipe$Analysis$Variable$name, "_ensmean_", system, "_s", recipe$Analysis$Time$sdate, - "_ftime", fmonth, ".png") + "_ftime", fmonth, ".pdf") caption <- paste0("NAO method: ", ifelse(recipe$Analysis$Workflow$Indices$NAO$obsproj, "Pobs", "Pmod"), " (Doblas-Reyes et al., 2003)\n", @@ -355,7 +355,7 @@ compute_nao <- function(data, recipe, obsproj, plot_ts, plot_sp, recipe$Analysis$Variable$name, "_ensmean_", system, recipe$Analysis$Datasets$Reference$name, - "_ftime", fmonth, ".png") + "_ftime", fmonth, ".pdf") caption <- paste0("NAO method: ", ifelse(recipe$Analysis$Workflow$Indices$NAO$obsproj, "Pobs", "Pmod"), " (Doblas-Reyes et al., 2003)\n", @@ -392,7 +392,7 @@ compute_nao <- function(data, recipe, obsproj, plot_ts, plot_sp, recipe$Analysis$Variable$name, "_member_", system, "_s", recipe$Analysis$Time$sdate, - "_ftime", fmonth, ".png") + "_ftime", fmonth, ".pdf") caption <- paste0("NAO method: ", ifelse(recipe$Analysis$Workflow$Indices$NAO$obsproj, "Pobs", "Pmod"), " (Doblas-Reyes et al., 2003)\n", @@ -412,7 +412,7 @@ compute_nao <- function(data, recipe, obsproj, plot_ts, plot_sp, recipe$Analysis$Variable$name, "_member_", system, recipe$Analysis$Datasets$Reference$name, - "_ftime", fmonth, ".png") + "_ftime", fmonth, ".pdf") caption <- paste0("NAO method: ", ifelse(recipe$Analysis$Workflow$Indices$NAO$obsproj, "Pobs", "Pmod"), " (Doblas-Reyes et al., 2003)\n", diff --git a/modules/Indices/R/compute_nino.R b/modules/Indices/R/compute_nino.R index 915dc9ce..b47d9ee2 100644 --- a/modules/Indices/R/compute_nino.R +++ b/modules/Indices/R/compute_nino.R @@ -170,7 +170,7 @@ compute_nino <- function(data, recipe, region, standardised = TRUE, system, "_", recipe$Analysis$Datasets$Reference$name, "_s", recipe$Analysis$Time$sdate, "_ftime", sprintf("%02d", tstep - 1 + recipe$Analysis$Time$ftime_min), - ".png") + ".pdf") caption <- paste0("Nominal start date: 1st of ", month.name[as.numeric(substr(recipe$Analysis$Time$sdate, 1,2))], "\n", @@ -184,7 +184,7 @@ compute_nino <- function(data, recipe, region, standardised = TRUE, plotfile <- paste0(recipe$Run$output_dir, "/plots/Indices/", nino_name, "_", system, "_", recipe$Analysis$Datasets$Reference$name, "_ftime", - sprintf("%02d", tstep - 1 + recipe$Analysis$Time$ftime_min), ".png") + sprintf("%02d", tstep - 1 + recipe$Analysis$Time$ftime_min), ".pdf") caption <- paste0("Start date month: ", month.name[get_archive(recipe)$System[[recipe$Analysis$Datasets$System$name]]$initial_month], "\n", @@ -272,7 +272,7 @@ compute_nino <- function(data, recipe, region, standardised = TRUE, recipe$Analysis$Variable$name, "_", recipe$Analysis$Datasets$Reference$name, "_s", recipe$Analysis$Time$sdate, - "_ftime", fmonth, ".png") + "_ftime", fmonth, ".pdf") caption <- paste0("Nominal start date: 1st of ", month.name[as.numeric(substr(recipe$Analysis$Time$sdate, 1,2))], "\n", @@ -289,7 +289,7 @@ compute_nino <- function(data, recipe, region, standardised = TRUE, nino_name, "_correlation_", recipe$Analysis$Variable$name, "_", recipe$Analysis$Datasets$Reference$name, - "_ftime", fmonth, ".png") + "_ftime", fmonth, ".pdf") caption <- paste0("Start date: month ", month.name[get_archive(recipe)$System[[recipe$Analysis$Datasets$System$name]]$initial_month], "\n", @@ -330,7 +330,7 @@ compute_nino <- function(data, recipe, region, standardised = TRUE, recipe$Analysis$Variable$name, "_ensmean_", system, "_s", recipe$Analysis$Time$sdate, - "_ftime", fmonth, ".png") + "_ftime", fmonth, ".pdf") caption <- paste0("Ensemble mean\n", "Nominal start date: 1st of ", month.name[as.numeric(substr(recipe$Analysis$Time$sdate, 1,2))], @@ -348,7 +348,7 @@ compute_nino <- function(data, recipe, region, standardised = TRUE, recipe$Analysis$Variable$name, "_ensmean_", system, recipe$Analysis$Datasets$Reference$name, - "_ftime", fmonth, ".png") + "_ftime", fmonth, ".pdf") caption <- paste0("Correlation ensemble mean\n", "Start date month: ", month.name[get_archive(recipe)$System[[recipe$Analysis$Datasets$System$name]]$initial_month], @@ -384,7 +384,7 @@ compute_nino <- function(data, recipe, region, standardised = TRUE, recipe$Analysis$Variable$name, "_member_", system, "_s", recipe$Analysis$Time$sdate, - "_ftime", fmonth, ".png") + "_ftime", fmonth, ".pdf") caption <- paste0("Individual members\n", "Nominal start date: 1st of ", month.name[as.numeric(substr(recipe$Analysis$Time$sdate, 1,2))], @@ -402,7 +402,7 @@ compute_nino <- function(data, recipe, region, standardised = TRUE, recipe$Analysis$Variable$name, "_ensmean_", system, recipe$Analysis$Datasets$Reference$name, - "_ftime", fmonth, ".png") + "_ftime", fmonth, ".pdf") caption <- paste0("Correlation ensemble mean\n", "Start date month: ", month.name[get_archive(recipe)$System[[recipe$Analysis$Datasets$System$name]]$initial_month], diff --git a/modules/Visualization/R/plot_ensemble_mean.R b/modules/Visualization/R/plot_ensemble_mean.R index 3d00742d..b39a8f43 100644 --- a/modules/Visualization/R/plot_ensemble_mean.R +++ b/modules/Visualization/R/plot_ensemble_mean.R @@ -134,7 +134,7 @@ plot_ensemble_mean <- function(recipe, fcst, mask = NULL, dots = NULL, outdir, o units = units, cols = cols, brks = brks, - fileout = paste0(outfile, ".png"), + fileout = paste0(outfile, ".pdf"), bar_label_digits = 4, extra_margin = rep(1, 4), bar_label_scale = 1.5, @@ -204,7 +204,7 @@ plot_ensemble_mean <- function(recipe, fcst, mask = NULL, dots = NULL, outdir, o } # Modify base arguments base_args[[1]] <- i_var_ens_mean[i, , ] - fileout <- paste0(outfile, "_ft", sprintf("%02d", i), ".png") + fileout <- paste0(outfile, "_ft", sprintf("%02d", i), ".pdf") base_args$mask <- mask_i base_args$dots <- dots_i # Plot diff --git a/modules/Visualization/R/plot_most_likely_terciles_map.R b/modules/Visualization/R/plot_most_likely_terciles_map.R index 5d60f8c1..b4ea493e 100644 --- a/modules/Visualization/R/plot_most_likely_terciles_map.R +++ b/modules/Visualization/R/plot_most_likely_terciles_map.R @@ -130,7 +130,7 @@ plot_most_likely_terciles <- function(recipe, legend_scale = 0.8, #cex_bar_titles = 0.6, toptitle = toptitle, titles = titles, - fileout = paste0(outfile, ".png"), + fileout = paste0(outfile, ".pdf"), bar_label_digits = 2, bar_scale = rep(0.7, 4), extra_margin = rep(1, 4), @@ -191,7 +191,7 @@ plot_most_likely_terciles <- function(recipe, format(as.Date(i_syear, format="%Y%m%d"), "%d-%m-%Y")) # Plot - fileout <- paste0(outfile, "_ft", forecast_time, ".png") + fileout <- paste0(outfile, "_ft", forecast_time, ".pdf") base_args$probs <- i_var_probs[i, , , ] base_args$mask <- mask_i base_args$dots <- dots_i diff --git a/modules/Visualization/R/plot_skill_metrics.R b/modules/Visualization/R/plot_skill_metrics.R index b4c2b273..9ef90bf9 100644 --- a/modules/Visualization/R/plot_skill_metrics.R +++ b/modules/Visualization/R/plot_skill_metrics.R @@ -170,7 +170,7 @@ plot_skill_metrics <- function(recipe, data_cube, skill_metrics, cols = cols, col_inf = col_inf, col_sup = col_sup, - fileout = paste0(outfile, ".png"), + fileout = paste0(outfile, ".pdf"), bar_label_digits = 3, bar_extra_margin = rep(0.9, 4), extra_margin = rep(1, 4), @@ -241,7 +241,7 @@ plot_skill_metrics <- function(recipe, data_cube, skill_metrics, "Reference: ", recipe$Analysis$Datasets$Reference, "\n", significance_caption) } - fileout <- paste0(outfile, "_ft", forecast_time, ".png") + fileout <- paste0(outfile, "_ft", forecast_time, ".pdf") # Plot do.call(fun, diff --git a/tests/testthat/test-decadal_monthly_1.R b/tests/testthat/test-decadal_monthly_1.R index 3346e529..c33bd511 100644 --- a/tests/testthat/test-decadal_monthly_1.R +++ b/tests/testthat/test-decadal_monthly_1.R @@ -273,8 +273,8 @@ test_that("5. Visualization", { plots <- paste0(recipe$Run$output_dir, "/plots/") expect_equal( all(basename(list.files(plots, recursive = T)) %in% -c("forecast_ensemble_mean-2021.png", "forecast_most_likely_tercile-2021.png", - "rpss.png")), +c("forecast_ensemble_mean-2021.pdf", "forecast_most_likely_tercile-2021.pdf", + "rpss.pdf")), TRUE ) expect_equal( diff --git a/tests/testthat/test-decadal_monthly_2.R b/tests/testthat/test-decadal_monthly_2.R index 9adc16b6..02f42c0f 100644 --- a/tests/testthat/test-decadal_monthly_2.R +++ b/tests/testthat/test-decadal_monthly_2.R @@ -267,7 +267,7 @@ test_that("5. Visualization", { plots <- paste0(recipe$Run$output_dir, "/plots/") expect_equal( all(basename(list.files(plots, recursive = T)) %in% -c("bss10_specs.png", "enscorr_specs.png", "forecast_ensemble_mean-2020.png", "forecast_ensemble_mean-2021.png", "forecast_most_likely_tercile-2020.png", "forecast_most_likely_tercile-2021.png", "frps_specs.png", "frps.png", "rpss_specs.png") +c("bss10_specs.pdf", "enscorr_specs.pdf", "forecast_ensemble_mean-2020.pdf", "forecast_ensemble_mean-2021.pdf", "forecast_most_likely_tercile-2020.pdf", "forecast_most_likely_tercile-2021.pdf", "frps_specs.pdf", "frps.pdf", "rpss_specs.pdf") ), TRUE ) diff --git a/tests/testthat/test-seasonal_NAO.R b/tests/testthat/test-seasonal_NAO.R index 9582bdfc..90b446c3 100644 --- a/tests/testthat/test-seasonal_NAO.R +++ b/tests/testthat/test-seasonal_NAO.R @@ -190,10 +190,10 @@ outputs <- paste0(recipe$Run$output_dir, "/plots/") expect_equal( all(list.files(outputs, recursive = T) %in% paste0("Indices/", - c("NAO_ECMWF-SEAS5_ERA5_s0301_ftime02.png", - "NAO_correlation_psl_ERA5_s0301_ftime02.png", - "NAO_correlation_psl_ensmean_ECMWF-SEAS5_s0301_ftime02.png", - "NAO_correlation_psl_member_ECMWF-SEAS5_s0301_ftime02.png"))), + c("NAO_ECMWF-SEAS5_ERA5_s0301_ftime02.pdf", + "NAO_correlation_psl_ERA5_s0301_ftime02.pdf", + "NAO_correlation_psl_ensmean_ECMWF-SEAS5_s0301_ftime02.pdf", + "NAO_correlation_psl_member_ECMWF-SEAS5_s0301_ftime02.pdf"))), TRUE) expect_equal( diff --git a/tests/testthat/test-seasonal_monthly.R b/tests/testthat/test-seasonal_monthly.R index d9b7b3c3..18bde4c0 100644 --- a/tests/testthat/test-seasonal_monthly.R +++ b/tests/testthat/test-seasonal_monthly.R @@ -235,9 +235,9 @@ test_that("5. Visualization", { plots <- paste0(recipe$Run$output_dir, "/plots/") expect_equal( all(basename(list.files(plots, recursive = T)) %in% -c("crpss-november.png", "enscorr_specs-november.png", "enscorr-november.png", - "forecast_ensemble_mean-20201101.png", "forecast_most_likely_tercile-20201101.png", - "rpss-november.png")), +c("crpss-november.pdf", "enscorr_specs-november.pdf", "enscorr-november.pdf", + "forecast_ensemble_mean-20201101.pdf", "forecast_most_likely_tercile-20201101.pdf", + "rpss-november.pdf")), TRUE ) expect_equal( -- GitLab From 7ec4c058cb2748fa60a2bd4c43c49288920fb34e Mon Sep 17 00:00:00 2001 From: vagudets Date: Fri, 15 Mar 2024 13:22:20 +0100 Subject: [PATCH 2/6] Add option to transform plot files --- modules/Visualization/Visualization.R | 19 ++++++++++++++++++- .../atomic_recipes/recipe_test_multivar.yml | 3 ++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/modules/Visualization/Visualization.R b/modules/Visualization/Visualization.R index ae94ed3d..400af2a2 100644 --- a/modules/Visualization/Visualization.R +++ b/modules/Visualization/Visualization.R @@ -55,6 +55,7 @@ Visualization <- function(recipe, # Get plot types and create output directories plots <- strsplit(recipe$Analysis$Workflow$Visualization$plots, ", | |,")[[1]] + ## TODO: Do not modify output dir here recipe$Run$output_dir <- paste0(recipe$Run$output_dir, "/plots/") outdir <- get_dir(recipe = recipe, variable = data$hcst$attrs$Variable$varName) @@ -209,5 +210,21 @@ Visualization <- function(recipe, "probabilities must be provided.")) } } -} + # Convert plots to user-chosen format + if (!is.null(recipe$Analysis$Workflow$Visualization$file_format)) { + extension <- tolower(recipe$Analysis$Workflow$Visualization$file_format) + plot_files <- list.files(path = recipe$Run$output_dir, pattern = "\\.pdf$", + recursive = TRUE, full.names = TRUE) + for (file in plot_files) { + system_command <- paste("convert -density 300", file, + "-resize 40% -alpha remove", + paste0(tools::file_path_sans_ext(file), ".", + extension)) + system(system_command) + } + unlink(plot_files) + info(recipe$Run$logger, + paste0("##### PLOT FILES CONVERTED TO ", toupper(extension), " #####")) + } +} diff --git a/recipes/atomic_recipes/recipe_test_multivar.yml b/recipes/atomic_recipes/recipe_test_multivar.yml index 01625d40..86bc59f9 100644 --- a/recipes/atomic_recipes/recipe_test_multivar.yml +++ b/recipes/atomic_recipes/recipe_test_multivar.yml @@ -43,11 +43,12 @@ Analysis: percentiles: [[1/3, 2/3], [1/10, 9/10]] save: 'all' Visualization: - plots: most_likely_terciles + plots: most_likely_terciles, skill_metrics, forecast_ensemble_mean multi_panel: no projection: cylindrical_equidistant dots: both mask_terciles: both + file_format: PNG Indicators: index: no ncores: 7 -- GitLab From a51479954ad3def307a5b3133baac30a64d827af Mon Sep 17 00:00:00 2001 From: vagudets Date: Fri, 15 Mar 2024 13:24:30 +0100 Subject: [PATCH 3/6] Add a TODO --- modules/Visualization/Visualization.R | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/Visualization/Visualization.R b/modules/Visualization/Visualization.R index 400af2a2..6b1b4ea4 100644 --- a/modules/Visualization/Visualization.R +++ b/modules/Visualization/Visualization.R @@ -212,6 +212,7 @@ Visualization <- function(recipe, } # Convert plots to user-chosen format + ## TODO: Set PDF as default in recipe checker if (!is.null(recipe$Analysis$Workflow$Visualization$file_format)) { extension <- tolower(recipe$Analysis$Workflow$Visualization$file_format) plot_files <- list.files(path = recipe$Run$output_dir, pattern = "\\.pdf$", -- GitLab From f5c890b2e542e286958f321ddfcd703279beceac Mon Sep 17 00:00:00 2001 From: vagudets Date: Mon, 18 Mar 2024 13:06:38 +0100 Subject: [PATCH 4/6] If file_format is PDF, do not do image conversion --- modules/Visualization/Visualization.R | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/Visualization/Visualization.R b/modules/Visualization/Visualization.R index 6b1b4ea4..37d84044 100644 --- a/modules/Visualization/Visualization.R +++ b/modules/Visualization/Visualization.R @@ -213,7 +213,8 @@ Visualization <- function(recipe, # Convert plots to user-chosen format ## TODO: Set PDF as default in recipe checker - if (!is.null(recipe$Analysis$Workflow$Visualization$file_format)) { + if (!is.null(recipe$Analysis$Workflow$Visualization$file_format) && + tolower(recipe$Analysis$Workflow$Visualization$file_format) != "pdf") { extension <- tolower(recipe$Analysis$Workflow$Visualization$file_format) plot_files <- list.files(path = recipe$Run$output_dir, pattern = "\\.pdf$", recursive = TRUE, full.names = TRUE) -- GitLab From 65a5d023a48e31fb9c75d7153cf9ce67982643ce Mon Sep 17 00:00:00 2001 From: vagudets Date: Mon, 18 Mar 2024 14:36:57 +0100 Subject: [PATCH 5/6] Add plot file format recipe check --- tools/check_recipe.R | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tools/check_recipe.R b/tools/check_recipe.R index 01b790b8..cf469975 100644 --- a/tools/check_recipe.R +++ b/tools/check_recipe.R @@ -577,6 +577,16 @@ check_recipe <- function(recipe) { "yes/True, no/False, 'both'")) } } + # Check user-defined file format for plots + PLOT_FILE_FORMATS <- c("pdf", "png", "jpg", "jpeg", "eps") + if (!is.null(recipe$Analysis$Workflow$Visualization$file_format) && + !(tolower(recipe$Analysis$Workflow$Visualization$file_format)) %in% + PLOT_FILE_FORMATS) { + error(recipe$Run$logger, + paste0("Visualization:file_format must be one of the following: ", + paste(PLOT_FILE_FORMATS, collapse = ", "), ".")) + error_status <- TRUE + } } # Scorecards if ("Scorecards" %in% names(recipe$Analysis$Workflow)) { -- GitLab From d9ff24a0943e2152768164f4f553ddffc34063cf Mon Sep 17 00:00:00 2001 From: vagudets Date: Mon, 18 Mar 2024 14:43:36 +0100 Subject: [PATCH 6/6] remove TODO --- modules/Visualization/Visualization.R | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/Visualization/Visualization.R b/modules/Visualization/Visualization.R index 37d84044..fb12c66a 100644 --- a/modules/Visualization/Visualization.R +++ b/modules/Visualization/Visualization.R @@ -212,7 +212,6 @@ Visualization <- function(recipe, } # Convert plots to user-chosen format - ## TODO: Set PDF as default in recipe checker if (!is.null(recipe$Analysis$Workflow$Visualization$file_format) && tolower(recipe$Analysis$Workflow$Visualization$file_format) != "pdf") { extension <- tolower(recipe$Analysis$Workflow$Visualization$file_format) -- GitLab