diff --git a/geau/DESCRIPTION b/geau/DESCRIPTION index adf2a63b3a2494ae7e41e8fa30801a0eef4999ae..f98b01a78c96790b010b571b5d427905dba436c7 100644 --- a/geau/DESCRIPTION +++ b/geau/DESCRIPTION @@ -1,6 +1,6 @@ Package: geau Title: Utilities very useful to share within geau-inondation team -Version: 1.0.9.0 +Version: 1.0.10.0 Authors@R: c( person(given = "Frédéric", diff --git a/geau/R/map_so_ii.r b/geau/R/map_so_ii.r index f2c4f4df0e289c173e9f0a36efedd9321119273f..2976c9acdfc5ea80209156a1b4151ed437f7ca85 100644 --- a/geau/R/map_so_ii.r +++ b/geau/R/map_so_ii.r @@ -4,11 +4,11 @@ #' \subsection{detail specification}{ #' For the specification of detail, it depends on the theme chosen. #' \itemize{ +#' \item{\strong{catchment}: detail must be chosen in "none", "1", "2", "3" +#' for levels of detail. If missing, "1" will be chosen.} #' \item{\strong{catnat}: detail must be chosen in "inondation", #' "submersion", or "nappe". If missing all type will be chosen and #' aggregated before plotting.} -#' \item{\strong{catchment}: detail must be chosen in "none", "1", "2", "3" -#' for levels of detail. If missing, "1" will be chosen.} #' \item{\strong{collectivity}: detail must be chosen in "none", "syble", #' "symbo", "epci" or "syndicate". If missing, "none" will be chosen, #' and only the boundaries of collectivities are plotted.} @@ -18,15 +18,22 @@ #' everything is plotted.} #' \item{\strong{onrn}: detail must be chosen in "n_catnat", "freq_sin", #' "cost", "cost_hab", "cost_mean", "ratio", "balance", "ppri_year".} +#' \item{\strong{population}: detail must be chosen in "absolute", +#' "relative". It used only when more than one year is provided to plot +#' aither absolute or relative evolution.} #' } #' } #' \subsection{year specification}{ #' For the specification of year, it depends on the theme chosen. #' \itemize{ -#' \item{\strong{catnat}: year corresponds to the year of data. If missing, -#' nothing is plotted.} +#' \item{\strong{catnat}: year corresponds to the year of data. If 2 or more +#' years are given, the sum of the period corresponding to the range of +#' given years is plotted. If missing, the whole available period is +#' plotted.} #' \item{\strong{population}: year corresponds to the year of data. If -#' missing, last available year is plotted.} +#' missing, last available year is plotted. If 2 or more years are +#' provided an analysis of the evolution between the range of given +#' years is plotted.} #' } #' } #' @@ -90,7 +97,7 @@ map_so_ii = function( "collectivity" = map_theme_collectivity(detail, theme_legend), "hydro" = map_theme_hydro(detail, theme_legend), "onrn" = map_theme_onrn(detail, theme_legend), - "population" = map_theme_population(year, theme_legend), + "population" = map_theme_population(detail, year, theme_legend), NULL ) @@ -187,44 +194,27 @@ map_theme_catnat = function(detail, year, add_legend) { several.ok = TRUE ) - theme_legend = NULL - border = NA - color = NA - if (!missing(year)) { - border = "grey80" - color_none = color - color_with = scales::alpha("grey80", .5) - legend_title = switch( - EXPR = as.character(length(detail)), - "3" = "Cat Nat", - sprintf("Cat Nat [%s]", paste(sort(detail), collapse = " & ")) - ) - year = match.arg( - as.character(year), - dimnames(geau::so_ii_catnat)[["period"]] - ) - catnat = apply( - geau::so_ii_catnat[, year, detail, drop = FALSE], - 1:2, - sum - ) - color = ifelse( - catnat > 0, - color_with, - color_none - ) - theme_legend = list( - title = sprintf("%s %s", legend_title, year), - legend = c("Sans d\u00e9claration", "Avec d\u00e9claration"), - x = "topright", - cex = .8, - bg = "white", - inset = 0.01, - fill = c(color_none, color_with), - border = border - ) + if (missing(year)) { + year = range(dimnames(geau::so_ii_catnat)[["period"]]) } + year = match.arg( + as.character(year), + dimnames(geau::so_ii_catnat)[["period"]], + several.ok = TRUE + ) + year = as.character(seq(min(year), max(year))) + catnat = apply( + geau::so_ii_catnat[, year, detail, drop = FALSE], + 1, + sum + ) + border = "grey80" + catnat_palette = scales::colour_ramp(c("white", "grey50"), alpha = .5) + color = scales::cscale( + c(0, catnat), + catnat_palette + )[-1] plot( geau::so_ii_collectivity[["geometry"]], border = border, @@ -232,6 +222,34 @@ map_theme_catnat = function(detail, year, add_legend) { add = TRUE ) + legend_title = sprintf( + "Cat Nat %s", + if (length(detail) == 3) "" else paste(sort(detail), collapse = " & ") + ) + legend_title = sprintf( + "%s [%s]", + legend_title, + if (length(year) == 1) year else paste(range(year), collapse = "-") + ) + + value_legend = unique(sort(c(min(catnat), round(seq(0, max(catnat), length.out = 5))))) + color_legend = scales::cscale( + value_legend, + catnat_palette + ) + + theme_legend = list( + title = legend_title, + legend = value_legend, + x = "topright", + cex = .8, + bg = "white", + inset = 0.01, + fill = color_legend, + border = border, + text.width = max(graphics::strwidth(value_legend)) + ) + if (add_legend == TRUE) { return(theme_legend) } else { @@ -461,6 +479,7 @@ map_theme_onrn = function(detail, add_legend) { as.integer(signif(round(value_legend), 2)), big.mark = " " ) + text.width = max(graphics::strwidth(text_legend)) } color_legend = scales::cscale( c(onrn_range, value_legend), @@ -472,7 +491,7 @@ map_theme_onrn = function(detail, add_legend) { } title_onrn = switch( EXPR = detail, - "n_catnat" = "N arr\u00eat\u00e9s Cat-Nat (ONRN)", + "n_catnat" = "Arr\u00eat\u00e9s Cat-Nat [1982-2021]", "freq_sin" = "Sinistre / Risque [1995-2018]", "cost" = "Co\u00fbt cumul\u00e9 (\u20AC) [1995-2018]", "cost_hab" = "Co\u00fbt / hab (\u20ac) [1995-2018]", @@ -493,7 +512,10 @@ map_theme_onrn = function(detail, add_legend) { fill = color_legend, border = border ) - + if (detail %in% c("balance", "cost")) { + theme_legend[["text.width"]] = max(graphics::strwidth(text_legend)) + } + if (add_legend == TRUE) { return(theme_legend) } else { @@ -501,58 +523,191 @@ map_theme_onrn = function(detail, add_legend) { } } -map_theme_population = function(year, add_legend) { +map_theme_population = function(detail, year, add_legend) { if (missing(year)) { year = utils::tail(sort(colnames(geau::so_ii_population)), 1) } year = match.arg( as.character(year), - sort(colnames(geau::so_ii_population)) - ) - population_palette = scales::colour_ramp(c("white", "red"), alpha = .5) - color = matrix( - scales::cscale( - geau::so_ii_population, - population_palette, - trans = scales::log_trans()), - nrow = nrow(geau::so_ii_population), - dimnames = dimnames(geau::so_ii_population) + sort(colnames(geau::so_ii_population)), + several.ok = TRUE ) + border = "grey80" - plot( - geau::so_ii_collectivity[["geometry"]], - border = border, - col = color[ , year], - add = TRUE - ) - max_pop = max(geau::so_ii_population[ , year]) - min_pop = min(geau::so_ii_population[ , year]) - value_legend = unique(c( - min_pop, - 10^(ceiling(log(min_pop)/log(10)):floor(log(max_pop)/log(10))), - max_pop - )) - color_legend = scales::cscale( - c(range(geau::so_ii_population), value_legend), - population_palette, - trans = scales::log_trans() + + if (length(year) == 1) { + pop_palette = scales::colour_ramp(c("white", "red"), alpha = .5) + color = matrix( + scales::cscale( + geau::so_ii_population, + pop_palette, + trans = scales::log_trans()), + nrow = nrow(geau::so_ii_population), + dimnames = dimnames(geau::so_ii_population) + ) + + plot( + geau::so_ii_collectivity[["geometry"]], + border = border, + col = color[ , year], + add = TRUE + ) + max_pop = max(geau::so_ii_population[ , year]) + min_pop = min(geau::so_ii_population[ , year]) + base = 10 + + value_legend = unique(c( + min_pop, + base^(ceiling(log(min_pop)/log(base)):floor(log(max_pop)/log(base))), + max_pop + )) + color_legend = scales::cscale( + c(range(geau::so_ii_population), value_legend), + pop_palette, + trans = scales::log_trans() + )[-(1:2)] + text_legend = formatC( + as.integer(value_legend), + big.mark = " " + ) + + theme_legend = list( + title = sprintf("Population %s", year), + legend = text_legend, + x = "topright", + cex = .8, + bg = "white", + inset = 0.01, + fill = color_legend, + border = border, + text.width = max(graphics::strwidth(text_legend)) + ) + } + + if (length(year) > 1) { + if (missing(detail)) { + detail = "absolute" + } + detail = match.arg(as.character(detail), c("absolute", "relative")) + year = range(year) + + pop_palette = scales::colour_ramp( + c("red", "white", "green"), + alpha = .5 + ) + pop_data = switch( + EXPR = detail, + "absolute" = geau::so_ii_population[ , year[2]] - + geau::so_ii_population[ , year[1]], + "relative" = (geau::so_ii_population[ , year[2]] - + geau::so_ii_population[ , year[1]]) / + geau::so_ii_population[ , year[1]] + ) + range_data = max(abs(range(pop_data))) * c(-1, 1) + pop_trans = switch( + EXPR = detail, + "absolute" = scales::modulus_trans(0.2), + "relative" = scales::modulus_trans(0.1), + NULL + ) + color = scales::cscale( + c(range_data, pop_data), + pop_palette, + trans = pop_trans )[-(1:2)] - text_legend = formatC( - as.integer(value_legend), - big.mark = " " - ) + plot( + geau::so_ii_collectivity[["geometry"]], + border = border, + col = color, + add = TRUE + ) - theme_legend = list( - title = sprintf("Population %s", year), - legend = text_legend, - x = "topright", - cex = .8, - bg = "white", - inset = 0.01, - fill = color_legend, - border = border, - text.width = graphics::strwidth(utils::tail(text_legend, 1)) - ) + max_pop = max(pop_data) + min_pop = min(pop_data) + + if (detail == "absolute") { + range_pop = max(abs(c(max_pop, min_pop))) + base = max(10, 10^floor(ceiling(log(range_pop)/log(10)) / 2)) + + if (sign(min_pop) == -1) { + value_legend = c( + -base^(floor(log(abs(min_pop))/log(base)):1), + base^(1:floor(log(max_pop)/log(base))) + ) + value_legend = value_legend[ + value_legend < max_pop & + value_legend > min_pop & + abs(value_legend) >= base + ] + value_legend = sort(c(0, range(pop_data), value_legend)) + } else { + value_legend = unique(c( + min_pop, + base^(ceiling(log(min_pop)/log(base)):floor(log(max_pop)/log(base))), + max_pop + )) + } + color_legend = scales::cscale( + c(range_data, value_legend), + pop_palette, + trans = pop_trans + )[-(1:2)] + text_legend = formatC( + as.integer(value_legend), + big.mark = " " + ) + title_legend = sprintf("Population \u00e9volution [%s-%s]", year[1], year[2]) + } + + if (detail == "relative") { + max_pop = max(pop_data) * 100 + min_pop = min(pop_data) * 100 + range_pop = max(abs(c(max_pop, min_pop))) + base = max(10, 10^floor(ceiling(log(range_pop)/log(10)) / 2)) + + if (sign(min_pop) == -1) { + value_legend = unique(c( + min_pop, + -base^(floor(log(abs(min_pop))/log(base)):0), + 0, + base^(0:floor(log(max_pop)/log(base))), + max_pop + )) + } else { + value_legend = unique(c( + min_pop, + base^(ceiling(log(min_pop)/log(base)):floor(log(max_pop)/log(base))), + max_pop + )) + } + color_legend = scales::cscale( + c(range_data, value_legend / 100), + pop_palette, + trans = pop_trans + )[-(1:2)] + text_legend = sprintf( + "%s %%", + formatC( + signif(value_legend, 3), + digits = 2, format = "f", flag = "+", + big.mark = " " + ) + ) + title_legend = sprintf("Population \u00e9volution [%s-%s]", year[1], year[2]) + } + + theme_legend = list( + title = title_legend, + legend = text_legend, + x = "topright", + cex = .8, + bg = "white", + inset = 0.01, + fill = color_legend, + border = border, + text.width = max(graphics::strwidth(text_legend)) + ) + } if (add_legend == TRUE) { return(theme_legend) diff --git a/geau/data/so_ii_onrn.rda b/geau/data/so_ii_onrn.rda index 5985ecbfe976d7619b844a785b0f048fdb6ff0eb..abc37b177092e92315c09e26ccdc278834f42cf9 100644 Binary files a/geau/data/so_ii_onrn.rda and b/geau/data/so_ii_onrn.rda differ diff --git a/geau/man/map_so_ii.Rd b/geau/man/map_so_ii.Rd index a118b15c1603bdfb23da7bb3134b42e3e4a3bec7..ba06effad63d9fd1826c960f6483d1d9dda78902 100644 --- a/geau/man/map_so_ii.Rd +++ b/geau/man/map_so_ii.Rd @@ -47,11 +47,11 @@ Plot a thematic map of so-ii \subsection{detail specification}{ For the specification of detail, it depends on the theme chosen. \itemize{ +\item{\strong{catchment}: detail must be chosen in "none", "1", "2", "3" +for levels of detail. If missing, "1" will be chosen.} \item{\strong{catnat}: detail must be chosen in "inondation", "submersion", or "nappe". If missing all type will be chosen and aggregated before plotting.} -\item{\strong{catchment}: detail must be chosen in "none", "1", "2", "3" -for levels of detail. If missing, "1" will be chosen.} \item{\strong{collectivity}: detail must be chosen in "none", "syble", "symbo", "epci" or "syndicate". If missing, "none" will be chosen, and only the boundaries of collectivities are plotted.} @@ -61,15 +61,22 @@ hydrographic elements. If missing, "none" will be chosen, and everything is plotted.} \item{\strong{onrn}: detail must be chosen in "n_catnat", "freq_sin", "cost", "cost_hab", "cost_mean", "ratio", "balance", "ppri_year".} +\item{\strong{population}: detail must be chosen in "absolute", +"relative". It used only when more than one year is provided to plot +aither absolute or relative evolution.} } } \subsection{year specification}{ For the specification of year, it depends on the theme chosen. \itemize{ -\item{\strong{catnat}: year corresponds to the year of data. If missing, -nothing is plotted.} +\item{\strong{catnat}: year corresponds to the year of data. If 2 or more +years are given, the sum of the period corresponding to the range of +given years is plotted. If missing, the whole available period is +plotted.} \item{\strong{population}: year corresponds to the year of data. If -missing, last available year is plotted.} +missing, last available year is plotted. If 2 or more years are +provided an analysis of the evolution between the range of given +years is plotted.} } } } diff --git a/map_so_ii.rmd b/map_so_ii.rmd index 858fa58c44eeaa051269d7edb1216e3d8963a92d..e45d67920bae60034522d0f55090e366e3b9cdc9 100644 --- a/map_so_ii.rmd +++ b/map_so_ii.rmd @@ -9,7 +9,12 @@ map_so_ii(theme = "collectivity", detail = "epci", theme_legend = TRUE) map_so_ii(theme = "clc") map_so_ii(theme = "population", theme_legend = TRUE) map_so_ii(theme = "population", year = "2006", theme_legend = TRUE) -map_so_ii(theme = "catnat", year = 2019) +map_so_ii(theme = "population", year = c(2006, 2019), theme_legend = TRUE) +map_so_ii(theme = "population", year = c(1876, 2019), detail ="relative", theme_legend = TRUE) +map_so_ii(theme = "catnat") +map_so_ii(theme = "catnat", detail = "nappe") +map_so_ii(theme = "catnat", detail = "inondation", year = 2003) +map_so_ii(theme = "catnat", detail = "inondation", year = 2003:2014) map_so_ii(theme = "hydro") map_so_ii(theme = "hydro", detail = 2) map_so_ii(theme = "hydro", detail = "river") diff --git a/script/onrn.R b/script/onrn.R index bb96343a4ae93d88492e95f732f3d1e5382fe2c2..b8c9688c614566108d5b442191749a2a12ad5e40 100644 --- a/script/onrn.R +++ b/script/onrn.R @@ -266,10 +266,20 @@ result = merge(result, temp, by = "commune", all.x = TRUE) ### Bilan Sinistre - Prime : estimation +# result = read.csv2(geau::current_version("data-common/so-ii/onrn")) + +#### Some data to compute premium per habitant pop_france = 66992159 # INSEE (2018) premium_france = 1670000000 # (CCR2019a pour 2018) premium_hab = premium_france / pop_france -result[["balance"]] = (1 - result[["ratio"]]) * geau::so_ii_population[ , "2018"] * premium_hab + +#### Need to compute cumulative population +period = seq(1995, 2018) +available = as.integer(dimnames(geau::so_ii_population)[[2]]) +selection = as.character(available[sapply(period, function(x){which.min(abs(available - x))})]) +pop_commune = rowSums(geau::so_ii_population[, selection]) + +result[["balance"]] = (1 - result[["ratio"]]) * pop_commune * premium_hab result = result[c( "commune", "n_catnat", "freq_sin", "cost", "cost_mean", "cost_hab", "ratio", "balance", @@ -279,6 +289,7 @@ result = result[c( )] write.csv2(result, sprintf("data-common/so-ii/onrn/onrn-%s.csv", today), row.names = FALSE) +# write.csv2(result, geau::current_version("data-common/so-ii/onrn"), row.names = FALSE) unlink(onrn_raw, recursive = TRUE, force = TRUE)