#' map
#'
#' This function produce different kinds of maps for the rmap package.
#' Each figure is accompanied with a csv table.
#'
#' @keywords charts, diffplots
#' @return Returns the formatted data used to produce chart
#' @param data Default = NULL,
#' @param region Default = NULL. Set the boundary region for subRegion maps. Useful when multiple subRegions in different regions.
#' @param fillColumn (Optional). Default = NULL. Only for direct map plotting.
#' @param shape Default = NULL, Cusotm shape can be provided as a SpatialPolygonDataFrame with features corresponding to subRegion columns in the data provided.
#' @param fileName (Optional). Default = "map". Only for direct map plotting.
#' @param save (Optional). Default = T. Only for direct map plotting.
#' @param theme Default = NULL,
#' @param show Default = T. Print maps in console as they are processed.
#' @param folder Default = paste(getwd(),"/outputs",sep=""),
#' @param labels Default = F,
#' @param labelCol Default = NULL,
#' @param labelRepel Default = 0,
#' @param labelColor Default = "black",
#' @param labelSize Default = 3
#' @param labelAlpha Default = 0.7,
#' @param labelFill Default = NA,
#' @param labelBorderSize Default = NA
#' @param shapeFolder Default = paste(getwd(),"/dataFiles/gis/admin_gadm36",sep=""),
#' @param shapeFile Default = paste("gadm36_1",sep=""),
#' @param subRegion Default ="subRegion",
#' @param value Default = "value",
#' @param x Default = NULL
#' @param class Default = "class"
#' @param scenario Default = "scenario"
#' @param nameAppend Default =""
#' @param legendTitle Default = NULL
#' @param legendType Default ="kmeans", Options include c("pretty","kmeans","freescale","all")
#' @param legendBreaksn Default = "5",
#' @param legendFixedBreaks Default = NULL,
#' @param animate Default = T,
#' @param fps Default = 1,
#' @param projX Default = projX="+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"
#' @param width Default =9
#' @param height Default =7
#' @param scenRef Reference Scenario. Default = NULL
#' @param scenDiff Scenarios to Diff. Default = NULL
#' @param scaleRange Default NULL. A vector with c(max,min) (Applied to all params) or a dataframe with cols param, max, min
#' @param scaleRangeDiffAbs Default =NULL, A vector with c(max,min) (Applied to all params) or a dataframe with cols param, max, min
#' @param scaleRangeDiffPrcnt Default =NULL, A vector with c(max,min) (Applied to all params) or a dataframe with cols param, max, min
#' @param xRef Reference year. Default = NULL
#' @param xDiff years to Diff. Default = NULL
#' @param scaleRangexDiffAbs Default =NULL, A vector with c(max,min) (Applied to all params) or a dataframe with cols param, max, min
#' @param scaleRangexDiffPrcnt Default =NULL, A vector with c(max,min) (Applied to all params) or a dataframe with cols param, max, min
#' @param col Default ="multiFacetRow",
#' @param row Default ="multiFacetCol",
#' @param title Default=NULL
#' @param numeric2Cat_list Default=NULL,
#' @param fill Default = NULL. Fill of polygon shapes. Same as palette.
#' @param color Default = "grey40". Color of polygon lines.
#' @param lwd Default = 0.1. Line width of polygon boundaries.
#' @param underLayer Default = NULL
#' @param underLayerLabelCol Default = NULL
#' @param underLayerColor Default = "gray40"
#' @param underLayerFill Default = "gray90"
#' @param underLayerLwd Default = 0.5
#' @param underLayerAlpha Default = 1
#' @param underLayerLabels Default = F
#' @param overLayerLabels Default = F
#' @param overLayerLabelCol Default = NULL
#' @param overLayer Default = NULL
#' @param overLayerColor Default = "gray40"
#' @param overLayerFill Default = NA
#' @param overLayerLwd Default = 0.5
#' @param overLayerAlpha Default = 0
#' @param zoom Default =-1. Zoom into or out of map. Positive values zoom in and negative out.
#' @param zoomx Default = NULL. Zoom into or out of map along x. Positive values zoom in and negative out.
#' @param zoomy Default = NULL. Zoom into or out of map along y. Positive values zoom in and negative out.
#' @param asp Default = 1.2. Aspect ratio of lat and lon.
#' @param pdfpng Save IO figures as pdf or png. Type=String. Options: 'pdf' or 'png'. Default = 'png'
#' @param legendSingleValue Default=F. Change to True to get default single value or provide a numeric value.
#' @param legendSingleColor Default="white"
#' @param legendDigitsOverride Default=NULL
#' @param palette Default = NULL
#' @param paletteDiff Default = "pal_div_BrGn"
#' @param crop Default = T. This crops the map to the extent of your data regions. If false will zoom out to the extent of the larget layer.
#' @param crop_to_underLayer Default = F. Crop to the underLayer boundary provided.
#' @param crop_to_overLayer Default = F. Crop to the overLayer boundary provided.
#' @param colorNA Default = "gray50"
#' @param showNA Default = F
#' @param ncol Default = 3. Number of columns to wrap maps
#' @param size Default = 12. Text size of plots.
#' @param alpha Default = 1. Transparency of fill colors.
#' @param background Default = F. Add background water color, border and default underlayer map.
#' @param transparent Default = T. To make map background transparent for maps without backgrounds.
#' @param legendShow Default = T
#' @param legendShowForce Default = F. Force legend to show for maps without values.
#' @param diffOnly Default = F. Only run diff plots and not individual scenarios.
#' @param forceFacets Default = F. Used to force facet label for single scenario which is usually dropped.
#' @param crs Default = "+proj=longlat +datum=WGS84 +no_defs". A proj4 string from EPSG https://epsg.io/
#' @return A list of maps
#' @import sf
#' @importFrom rlang :=
#' @importFrom magrittr %>%
#' @export
map <- function(data = NULL,
region = NULL,
fillColumn = NULL,
shape = NULL,
fileName = "map",
save=T,
theme = NULL,
show = T,
folder = paste(getwd(), "/outputs", sep = ""),
labels = F,
labelCol = NULL,
labelRepel = 0,
labelColor = "black",
labelSize = 2,
labelAlpha = 1,
labelFill = NA,
labelBorderSize = NA,
shapeFolder = NULL,
shapeFile = NULL,
subRegion = "subRegion",
value = "value",
x = NULL,
class = "class",
scenario = "scenario",
nameAppend = "",
legendTitle = NULL,
legendType ="kmeans",
legendBreaksn = 5,
legendFixedBreaks = NULL,
animate = T,
fps = 1,
crop = T,
crop_to_underLayer = F,
crop_to_overLayer = F,
fill = NULL,
color = "grey40",
lwd = 0.1,
underLayer = NULL,
underLayerColor = "gray40",
underLayerFill = "gray90",
underLayerLwd = 0.1,
underLayerAlpha = 1,
underLayerLabels= F,
underLayerLabelCol = NULL,
overLayerLabelCol = NULL,
overLayerLabels = F,
overLayer = NULL,
overLayerColor = "gray40",
overLayerFill = NA,
overLayerLwd = 0.2,
overLayerAlpha = 0,
zoom = 0,
zoomx = NULL,
zoomy = NULL,
asp = 1.2,
projX = "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0",
width = 7,
height = 8,
scenRef = NULL,
scenDiff = NULL,
scaleRange = NULL,
scaleRangeDiffAbs = NULL,
scaleRangeDiffPrcnt = NULL,
xRef = NULL,
xDiff = NULL,
scaleRangexDiffAbs = NULL,
scaleRangexDiffPrcnt = NULL,
col = NULL,
row = NULL,
title=NULL,
numeric2Cat_list = NULL,
pdfpng = 'png',
legendDigitsOverride = NULL,
legendSingleColor ="white",
legendSingleValue =F,
palette = NULL,
paletteDiff = "pal_div_BluRd",
colorNA = "gray50",
showNA = F,
ncol = 3,
size = 16,
alpha = 1,
background = F,
transparent = T,
legendShow = T,
legendShowForce = F,
diffOnly = F,
forceFacets = F,
crs = "+proj=longlat +datum=WGS84 +no_defs") {
# # data = NULL
# crs = "+proj=longlat +datum=WGS84 +no_defs"
# legendSingleValue =F
# show = T
# fill = NULL
# lwd = 0.1
# color = "grey40"
# fillColumn = NULL
# fileName = "map"
# save=T
# theme = NULL
# folder = paste(getwd(), "/outputs", sep = "")
# labels = F
# labelCol = NULL,
# shapeFolder = NULL
# shapeFile = NULL
# subRegCol = "subRegion"
# valueCol = "value"
# nameAppend = ""
# legendType ="kmeans"
# legendBreaksn = 5
# legendFixedBreaks = NULL
# animate = T
# fps = 1
# crop = F
# underLayer = NULL
# underLayerColor = "gray40"
# underLayerFill = "gray90"
# underLayerLwd = 0.5
# underLayerAlpha = 1
# overLayer = NULL
# overLayerColor = "gray40"
# overLayerFill = NA
# overLayerLwd = 0.5
# overLayerAlpha = 0
# overLayerLabels = F
# zoom = 0
# zoomx = NULL
# zoomy = NULL
# projX = "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"
# width = 7
# height = 8
# scenRef = NULL
# scenDiff = NULL
# scaleRange = NULL
# scaleRangeDiffAbs = NULL
# scaleRangeDiffPrcnt = NULL
# xRef = NULL
# xDiff = NULL
# scaleRangexDiffAbs = NULL
# scaleRangexDiffPrcnt = NULL
# col = NULL
# row = NULL
# title=NULL
# numeric2Cat_list = NULL
# pdfpng = 'png'
# legendDigitsOverride = NULL
# legendSingleColor ="white"
# palette = NULL
# paletteDiff = "pal_div_BluRd"
# colorNA = "gray50"
# showNA = F
# ncol = 3
# size = 12
# alpha = 1
# background = F
# asp = 1.2
# legendTitle = NULL
# transparent = F
# legendShow = T
# legendShowForce = F
# underLayerLabels=F
# shape = NULL
# diffOnly = F
# forceFacets = F
# labelCol = NULL
# labels = F
# labelRepel = 0
# labelColor = "black"
# labelSize = 2
# labelAlpha = 1
# labelFill = NA
# labelBorderSize = NA
# crop_to_underLayer = F
# crop_to_overLayer = F
# region = NULL
# underLayerLabelCol = NULL
# overLayerLabelCol = NULL
rlang::inform("Starting map...")
#.................-
# Initialize variables
# .................
if(T){
NULL->lat->lon->param->
year->gridID->maxScale->minScale->
valueDiff->rowid->catParam->include->Var1->Var2->Var3->maxX->minX->
dataTblDiff -> dataTblxDiff -> countCheck->
multiFacetCol -> multiFacetRow->paletteOrig->
xLabel->vintage->aggregate->query->subRegNotInShape ->dataTblOrig -> subRegionAlt -> subRegion1 ->
paramsGrid -> paramsShape -> scaleRange_i -> boundaryRegShapeLimits -> dataTbl -> subRegType -> paramsdata
if(!is.null(fill) & is.null(palette)){ palette = fill}
if(!save){animate=F}
return_i = 1; # Index for return maps list
mapsReturn = list(); # Return maps list
paletteOrig <- palette
shapeFileOrig <- shapeFile
shapeFolderOrig <- shapeFolder
animateOrig <- animate
legendTitleOrig <- legendTitle
forceFacetsOrig = forceFacets
valueCol = value; value = NULL;
subRegCol = subRegion; subRegion = NULL;
xCol = x; x=NULL
classCol = class; class = NULL
scenarioCol = scenario; scenario = NULL;
# Fix legend single value
if(legendSingleValue==0){legendSingleValue=T}
# Read in csv as tibble
if (!is.null(data)) {
if ((length(data) == 1) & (any(grepl("character",class(data))))) {
if (grepl(".csv",data)) {
if (file.exists(data)) {
data <- data.table::fread(data) %>% tibble::as_tibble()
}
}
}
}
if(!is.null(legendFixedBreaks)){
# Must be a vector of more than one number
if(length(legendFixedBreaks)<2){
stop("legendFixedBreaks must be a vector of more than one number")
}
if(any(!is.numeric(legendFixedBreaks))){
stop("legendFixedBreaks must be a vector of more than one number")
}
}
# Rename SubRegCol
if(T){
if(!is.null(data)){
if(nrow(data)>0){
if(subRegCol != "subRegion"){
if(any(subRegCol %in% names(data))){
if(!grepl("subRegion",subRegCol)){
if(any("subRegion" %in% names(data))){
data <- data %>%
dplyr::select(-subRegion)
}
data <- data %>%
dplyr::mutate(subRegion := !!rlang::sym(subRegCol)) %>%
dplyr::mutate(subRegion = as.character(subRegion))
}
}
}
}
}
}
# Remove NA subRegion
if(T){
if(any(grepl("tbl_df|tbl|data.frame",class(data)))){
if(!is.null(data)){
if(nrow(data)>0){
if(any("subRegion" %in% names(data))){
data <- data %>%
dplyr::filter(!is.na(subRegion))
}
}
}
}
}
# Rename valueCol
if(T){
if(!is.null(data)){
if(nrow(data)>0){
if(valueCol != "value"){
if(any(valueCol %in% names(data))){
if(!grepl("value",valueCol)){
if(any("value" %in% names(data))){
data <- data %>%
dplyr::select(-value)
}
data <- data %>%
dplyr::mutate(value := !!rlang::sym(valueCol)) %>%
dplyr::mutate(value = as.numeric(value))
}
}
}
}
}
}
# Rename Class
if(T){
if(!is.null(data)){
if(nrow(data)>0){
if(classCol != "class"){
if(any(classCol %in% names(data))){
if(!grepl("class",classCol)){
if(any("class" %in% names(data))){
data <- data %>%
dplyr::select(-class)
}
data <- data %>%
dplyr::mutate(class := !!rlang::sym(classCol)) %>%
dplyr::mutate(class = as.character(class))
}
}
}
}
}
}
# Rename scenario
if(T){
if(!is.null(data)){
if(nrow(data)>0){
if(scenarioCol != "scenario"){
if(any(scenarioCol %in% names(data))){
if(!grepl("scenario",scenarioCol)){
if(any("scenario" %in% names(data))){
data <- data %>%
dplyr::select(-scenario)
}
data <- data %>%
dplyr::mutate(scenario := !!rlang::sym(scenarioCol)) %>%
dplyr::mutate(scenario = as.character(scenario))
}
}
}
}
}
}
# Rename xCol
if(T){
if(!is.null(data)){
if(nrow(data)>0){
if(!is.null(xCol)){
if(any(xCol %in% names(data))){
if(!grepl("x",xCol)){
if(any("x" %in% names(data))){
data <- data %>%
dplyr::select(-x)
}
data <- data %>%
dplyr::mutate(x := !!rlang::sym(xCol))
}
} else {
rlang::inform("xCol selected does not exist in data.")
}
}
}
}
}
}
#.................-
# Check for Shape files
# .................
if(any(grepl("SpatialPolygonsDataFrame",class(data)))){
data <- sf::st_as_sf(data)
}
# Custom Shape
if(!is.null(shape)){
if(!any(grepl("sf",class(shape)))){
shapex <- sf::st_as_sf(shape)
} else {
shapex = shape
}
}else{
shapex = NULL
}
#.................-
# Run map_plot directly if a shpefile is provided
# .................
if(any(grepl("tbl_df|tbl|data.frame",class(data))) &
!"value" %in% names(data)){
if(!"subRegion" %in% names(data)){stop("Data must have 'subRegion' column or specify another column using the `subRegCol` argument instead.")}
if(is.null(palette)) {
palettex = "Set3"
}else{
palettex <- palette
}
colm=1
rowm=1
rmap::map_plot(crs=crs, underLayerLabelCol = underLayerLabelCol, overLayerLabelCol = overLayerLabelCol, labelCol=labelCol, region=region,color=color, lwd=lwd, legendType=legendType,
pdfpng=pdfpng, shape=shape,
overLayer=overLayer,
overLayerColor=overLayerColor,
overLayerFill = overLayerFill,
overLayerLwd = overLayerLwd,
overLayerAlpha = overLayerAlpha,
underLayerColor,
underLayerFill = underLayerFill,
underLayerLwd = underLayerLwd,
underLayerAlpha = underLayerAlpha,
background=background,
zoom=zoom, zoomx = zoomx, zoomy=zoomy, asp=asp, legendShow=legendShowForce, crop = crop, crop_to_underLayer = crop_to_underLayer, crop_to_overLayer = crop_to_overLayer, transparent=transparent,
alpha = alpha, size=max(1,(size+(colm+rowm)*3 - 12)),
theme = theme,
legendTitle=NULL,
underLayer=underLayer,
data = data,
palette=palettex,
folder=folder,
labels=labels, labelRepel=labelRepel, underLayerLabels=underLayerLabels, overLayerLabels=overLayerLabels,
labelColor=labelColor,
labelSize=labelSize,
labelAlpha=labelAlpha,
labelFill=labelFill,
labelBorderSize=labelBorderSize,
fileName = paste0(fileName,nameAppend),
fillColumn = fillColumn,
show=show,
save = save,
width = width,
height = height,
title=title) ->
mapsReturn[[return_i]];
names(mapsReturn)[return_i] <- paste0(fileName,nameAppend); return_i = return_i + 1
# labelCol = labelCol
# overLayer=overLayer
# overLayerColor=overLayerColor
# overLayerFill = overLayerFill
# overLayerLwd = overLayerLwd
# overLayerAlpha = overLayerAlpha
# underLayerColor
# underLayerFill = underLayerFill
# underLayerLwd = underLayerLwd
# underLayerAlpha = underLayerAlpha
# background=background
# zoom=zoom
# zoomx = zoomx
# zoomy=zoomy
# asp=asp
# legendShow=legendShow
# crop = crop
# crop_to_underLayer = crop_to_underLayer
# crop_to_overLayer = crop_to_overLayer
# transparent=transparent
# alpha = alpha
# size=max(1,(size+(colm+rowm)*3 - 12))
# theme = theme
# legendTitle=NULL
# underLayer=underLayer
# data = data
# palette=palettex
# folder=folder
# labels=labels
# labelRepel=labelRepel
# underLayerLabels=underLayerLabels
# overLayerLabels=overLayerLabels
# labelColor=labelColor
# labelSize=labelSize
# labelAlpha=labelAlpha
# labelFill=labelFill
# labelBorderSize=labelBorderSize
# fileName = fileName
# fillColumn = fillColumn
# save = save
# width = width
# height = height
# title=title
# .................
# Return Data
# .................
rlang::inform("map run completed.")
invisible(mapsReturn)
} else {
#.................-
# Function for adding any missing columns if needed
# .................
if(T){
addMissingScale<-function(data){
data <- data %>% dplyr::ungroup()
if(!any(grepl("\\<param\\>",names(data),ignore.case = T))){data<-data%>%dplyr::mutate(param="param")}else{
data <- data %>% dplyr::rename(!!"param" := (names(data)[grepl("\\<param\\>",names(data),ignore.case = T)])[1])
data<-data%>%dplyr::mutate(param=as.character(param),param=dplyr::case_when(is.na(param)~"param",TRUE~param))}
if(!any(grepl("\\<params\\>",names(data),ignore.case = T))){}else{
data <- data %>% dplyr::rename(!!"param" := (names(data)[grepl("\\<params\\>",names(data),ignore.case = T)])[1])
data<-data%>%dplyr::mutate(param=as.character(param),param=dplyr::case_when(is.na(param)~"params",TRUE~param))}
if(!any(grepl("max",names(data),ignore.case = T))){data<-data%>%dplyr::mutate(maxScale=NA_real_)}else{
data <- data %>% dplyr::rename(!!"maxScale" := (names(data)[grepl("max",names(data),ignore.case = T)])[1])
data<-data %>%dplyr::mutate(maxScale=as.numeric(maxScale))
data<-data %>%dplyr::mutate(maxScale=dplyr::case_when(is.na(maxScale)~NA_real_,TRUE~maxScale))}
if(!any(grepl("min",names(data),ignore.case = T))){data<-data%>%dplyr::mutate(minScale=NA_real_)}else{
data <- data %>% dplyr::rename(!!"minScale" := (names(data)[grepl("min",names(data),ignore.case = T)])[1])
data<-data %>%dplyr::mutate(minScale=as.numeric(minScale))
data<-data %>%dplyr::mutate(minScale=dplyr::case_when(is.na(minScale)~NA_real_,TRUE~minScale))}
data = data %>% dplyr::select(param,maxScale,minScale)
return(data)
}
addMissing<-function(data, xCol){
if(!any(grepl("\\<scenario\\>",names(data),ignore.case = T))){data<-data%>%dplyr::mutate(scenario="scenario")}else{
data <- data %>% dplyr::rename(!!"scenario" := (names(data)[grepl("\\<scenario\\>",names(data),ignore.case = T)])[1])
if(!class(data$scenario)=="factor"){
data<-data%>%dplyr::mutate(scenario=as.character(scenario),scenario=dplyr::case_when(is.na(scenario)~"scenario",TRUE~scenario))}}
if(!any(grepl("\\<scenarios\\>",names(data),ignore.case = T))){}else{
data <- data %>% dplyr::rename(!!"scenario" := (names(data)[grepl("\\<scenarios\\>",names(data),ignore.case = T)])[1])
data<-data%>%dplyr::mutate(scenario=as.character(scenario),scenario=dplyr::case_when(is.na(scenario)~"scenario",TRUE~scenario))}
if(any(grepl("^x$",names(data),ignore.case = T)) & any(grepl("^year$",names(data),ignore.case = T)) & is.null(xCol)){
if(any(is.na(data$x)) & !any(is.na(data$year))){
data <- data %>% dplyr::rename(!!"year" := (names(data)[grepl("\\<year\\>",names(data),ignore.case = T)])[1])
data<-data%>%dplyr::mutate(x=year)
rlang::inform("Both 'x' and 'year' columns present. Since 'x' column has NAs using year.")
rlang::inform("Users can specify the column to use for the time dimension by setting the 'xCol' argument.")
} else {
data <- data %>% dplyr::rename(!!"x" := (names(data)[grepl("\\<x\\>",names(data),ignore.case = T)])[1])
rlang::inform("Both 'x' and 'year' columns present. Using 'x' column for the time dimension.")
rlang::inform("Users can specify the column to use for the time dimension by setting the 'xCol' argument.")
}
}
if(!any(grepl("^x$",names(data),ignore.case = T)) & is.null(xCol)){if(any(grepl("^year$",names(data),ignore.case = T))){
data <- data %>% dplyr::rename(!!"year" := (names(data)[grepl("\\<year\\>",names(data),ignore.case = T)])[1])
data<-data%>%dplyr::mutate(x=year)
}else{
data<-data%>%dplyr::mutate(x="x")}
}
if(any(grepl("\\<subregion\\>",names(data),ignore.case = T))){
data <- data %>% dplyr::rename(!!"subRegion" := (names(data)[grepl("\\<subregion\\>",names(data),ignore.case = T)])[1])
data<-data%>%dplyr::mutate(subRegion=as.character(subRegion))}
if(!any(grepl("\\<subregtype\\>",names(data),ignore.case = T))){data<-data%>%dplyr::mutate(subRegType="subRegType")}else{
data <- data %>% dplyr::rename(!!"subRegType" := (names(data)[grepl("\\<subregtype\\>",names(data),ignore.case = T)])[1])
data<-data%>%dplyr::mutate(subRegType=as.character(subRegType),subRegType=dplyr::case_when(is.na(subRegType)~"subRegType",TRUE~subRegType))}
if(!any(grepl("\\<unit\\>",names(data),ignore.case = T))){}else{
data <- data %>% dplyr::rename(!!"units" := (names(data)[grepl("\\<unit\\>",names(data),ignore.case = T)])[1])
data<-data%>%dplyr::mutate(units=as.character(units),units=dplyr::case_when(is.na(units)~"units",TRUE~units))}
if(!any(grepl("\\<units\\>",names(data),ignore.case = T))){data<-data%>%dplyr::mutate(units="units")}else{
data <- data %>% dplyr::rename(!!"units" := (names(data)[grepl("\\<units\\>",names(data),ignore.case = T)])[1])
data<-data%>%dplyr::mutate(units=as.character(units),units=dplyr::case_when(is.na(units)~"units",TRUE~units))}
if(!any(grepl("\\<region\\>",names(data),ignore.case = T))){data<-data%>%dplyr::mutate(region="region")}else{
data <- data %>% dplyr::rename(!!"region" := (names(data)[grepl("\\<region\\>",names(data),ignore.case = T)])[1])
data<-data%>%dplyr::mutate(region=as.character(region),region=dplyr::case_when(is.na(region)~"region",TRUE~region))}
if(!any(grepl("\\<class\\>",names(data),ignore.case = T))){data<-data%>%dplyr::mutate(class="class")}else{
data <- data %>% dplyr::rename(!!"class" := (names(data)[grepl("\\<class\\>",names(data),ignore.case = T)])[1])
data<-data%>%dplyr::mutate(class=as.character(class),class=dplyr::case_when(is.na(class)~"class",TRUE~class))}
if(!any(grepl("\\<regions\\>",names(data),ignore.case = T))){}else{
data <- data %>% dplyr::rename(!!"region" := (names(data)[grepl("\\<regions\\>",names(data),ignore.case = T)])[1])
data<-data%>%dplyr::mutate(region=as.character(region),region=dplyr::case_when(is.na(region)~"region",TRUE~region))}
if(!any(grepl("\\<palette\\>",names(data),ignore.case = T))){data<-data%>%dplyr::mutate(palette="pal_hot")}else{
data <- data %>% dplyr::rename(!!"palette" := (names(data)[grepl("\\<palette\\>",names(data),ignore.case = T)])[1])
data<-data%>%dplyr::mutate(palette=as.character(palette),palette=dplyr::case_when(is.na(palette)~"pal_hot",TRUE~palette))}
if(!any(grepl("\\<param\\>",names(data),ignore.case = T))){data<-data%>%dplyr::mutate(param="param")}else{
data <- data %>% dplyr::rename(!!"param" := (names(data)[grepl("\\<param\\>",names(data),ignore.case = T)])[1])
data<-data%>%dplyr::mutate(param=as.character(param),param=dplyr::case_when(is.na(param)~"param",TRUE~param))}
if(!any(grepl("\\<params\\>",names(data),ignore.case = T))){}else{
data <- data %>% dplyr::rename(!!"param" := (names(data)[grepl("\\<params\\>",names(data),ignore.case = T)])[1])
data<-data%>%dplyr::mutate(param=as.character(param),param=dplyr::case_when(is.na(param)~"params",TRUE~param))}
if(!any(grepl("\\<multiFacetCol\\>",names(data),ignore.case = T))){data<-data%>%dplyr::mutate(multiFacetCol="multiFacetCol")}else{
data <- data %>% dplyr::rename(!!"multiFacetCol" := (names(data)[grepl("\\<multiFacetCol\\>",names(data),ignore.case = T)])[1])
data<-data %>%dplyr::mutate(multiFacetCol=dplyr::case_when(is.na(multiFacetCol)~"multiFacetCol",TRUE~multiFacetCol))}
if(!any(grepl("\\<multiFacetRow\\>",names(data),ignore.case = T))){data<-data%>%dplyr::mutate(multiFacetRow="multiFacetRow")}else{
data <- data %>% dplyr::rename(!!"multiFacetRow" := (names(data)[grepl("\\<multiFacetRow\\>",names(data),ignore.case = T)])[1])
data<-data%>%dplyr::mutate(multiFacetRow=dplyr::case_when(is.na(multiFacetRow)~"multiFacetRow",TRUE~multiFacetRow))}
return(data)
}
if(is.null(data)){
stop ("Data is NULL. Need to provide valid data.")
} else{
if("subRegion" %in% names(data)){
# Make sure subRegion is character
data <- data %>%
dplyr::mutate(subRegion = as.character(subRegion))
}
}
} # Close custom functions
#.................-
# Create Folders
#.................-
if(save){
if(!dir.exists(folder)){dir.create(folder)}
} # Close create folders
#.................-
# Read in data Tables (Either csv tables or an R Table)
#.................-
if(T){
dataTbl<-data.frame()
if(!is.null(data)){
if(all(!class(data) %in% c("tbl_df","tbl","data.frame"))){
for(data_i in data){
if(file.exists(data_i)){
dataTblNew<-data.table::fread(paste(data_i),encoding="Latin-1")%>%as.data.frame()
dataTbl<-dplyr::bind_rows(dataTbl,dataTblNew)
rm(dataTblNew)
} else {stop(paste(data_i," does not exist"))}
}
}else{dataTbl<-data}
}else{dataTbl=data}
if(!is.null(dataTbl)){
if(nrow(dataTbl)>0){
# Add missing columns
dataTbl<-addMissing(data=dataTbl, x=xCol)
if(!"value" %in% names(dataTbl)){stop("'value' column not present in data provided. Check data.")}
if(!"lat" %in% names(dataTbl) &
!"lon" %in% names(dataTbl) &
!"subRegion" %in% names(dataTbl)){
stop(paste0("Must have atleast either 'lat' and 'lon columns or subRegion column in data."))}
# Set palette if given
if(!is.null(paletteOrig) & (length(paletteOrig)==1)){
dataTbl <- dataTbl %>% dplyr::mutate(palette = paletteOrig)
}
}}
if(!is.null(dataTbl)){
if(nrow(dataTbl)==0){
dataTbl = NULL
}
}
} # Close read in data Tables
#.................-
# Subset Data
#.................-
if(T){
# Keep only Unique Values
if(!is.null(dataTbl)){
if(nrow(dataTbl)>0){
dataTbl<-dataTbl %>%
#dplyr::filter(!is.na(value)) %>%
dplyr::mutate(value = signif(value,10)) %>%
dplyr::ungroup() %>%
dplyr::distinct()
}
}
} # Subset data
#.................-
# xRange
#.................-
if(T){
if(!is.null(dataTbl)){
xRange = unique(c(unique(dataTbl$x)))
}
}
#.................-
# Compare Scenarios & X diff
#.................-
if(T){
# Get Params and Scenarios
if(!is.null(dataTbl)){
if(nrow(dataTbl)>0){
params <- unique(c(unique(dataTbl$param)))
scenarios <- unique(c(unique(dataTbl$scenario)))
}
# Compare Scenarios
if(length(scenarios)>1){
if(!is.null(scenRef)){
if(!any(scenRef %in% scenarios)){
rlang::inform(paste0("scenRef chosen: ", scenRef, " is not in any of the available scenarios: "))
rlang::inform(paste(scenarios,collapse=", "))
rlang::inform(paste0("Setting scenRef to first scenario: ", scenarios[1],"."))
scenRef <- scenarios[1]
}
if(is.null(scenDiff)){
scenDiff <- scenarios[!scenarios %in% scenRef]
rlang::inform(paste0("Running difference against all available scenarios:"))
rlang::inform(paste(scenDiff,collapse=", "))
}else{
if(!any(scenDiff %in% scenarios)){
rlang::inform(paste("None of the scenDiff are in any of the available scenarios: "))
rlang::inform(paste(scenarios[!scenarios %in% scenRef],collapse=", "))
rlang::inform(paste0("Skipping Diff."))
}
}
dataTblDiff <- data.frame()
for(i in 1:length(params)){
NULL -> param_i -> scenRef_i -> scenDiff_i
param_i <- params[i]
scenRef_i <- as.character(scenRef)
scenDiff_i <- as.character(scenDiff)
if(!is.null(param_i) & !is.null(scenRef_i) & !is.null(scenDiff_i)){
# Compare Data
if(!is.null(dataTbl)){
dataTblDiffa <- dataTbl %>% dplyr::filter(param==param_i & (scenario %in% c(scenRef_i,scenDiff_i)))
if(length(unique(dataTblDiffa$scenario))>1){
if(any(scenRef_i %in% unique(dataTblDiffa$scenario))){
rlang::inform(paste("Ref scenario chosen for param: ", param_i, " is ", paste(scenRef_i,collapse=", "),sep=""))
if(any(scenDiff_i %in% unique(dataTblDiffa$scenario))){
rlang::inform(paste("Diff scenarios chosen for param: ", param_i, " are ",
paste(scenDiff_i[scenDiff_i %in% unique(dataTblDiffa$scenario)],collapse=", "),sep=""))}
scenDiff_i <- scenDiff_i[scenDiff_i %in% unique(dataTblDiffa$scenario)]
# Calculate Diff Values
dataTblDiffb<-dataTblDiffa%>%dplyr::filter(param==param_i, scenario %in% dplyr::all_of(c(scenRef_i,scenDiff_i)))%>%
dplyr::select(lat,lon,subRegion,region,subRegType,param,x,xLabel,vintage,units,aggregate,palette,class,scenario,value)%>%
tidyr::spread(scenario,value)
# If paletteDiff is a character vector collapse it to a string.
if(length(paletteDiff)>1){
paletteDiff <-paste(paletteDiff,collapse=",")
}
for (scenario_i in unique(dataTblDiffa$scenario)[unique(dataTblDiffa$scenario) %in% scenDiff_i]){
tbl_temp1 <-dataTblDiffb%>%
dplyr::mutate(!!paste(scenario_i,"_DiffAbs_",scenRef_i,sep=""):=get(scenario_i)-get(scenRef_i),
palette=paletteDiff)%>%
dplyr::select(-dplyr::one_of(as.vector(unique(dataTblDiffa$scenario))))
tbl_temp1<-tbl_temp1%>%
tidyr::gather(key=scenario,value=value,
-c(names(tbl_temp1)[!names(tbl_temp1) %in% paste(scenario_i,"_DiffAbs_",scenRef_i,sep="")]))%>%
dplyr::mutate(value = dplyr::if_else(is.nan(value),0,value))
tbl_temp2 <-dataTblDiffb%>%
dplyr::mutate(!!paste(scenario_i,"_DiffPrcnt_",scenRef_i,sep=""):=((get(scenario_i)-get(scenRef_i))*100/get(scenRef_i)),
palette=paletteDiff)%>%
dplyr::select(-dplyr::one_of(as.vector(unique(dataTblDiffa$scenario))))
tbl_temp2<-tbl_temp2%>%
tidyr::gather(key=scenario,value=value,
-c(names(tbl_temp2)[!names(tbl_temp2) %in% paste(scenario_i,"_DiffPrcnt_",scenRef_i,sep="")]))%>%
dplyr::mutate(value = dplyr::if_else(is.nan(value),0,value))
dataTblDiff<-dplyr::bind_rows(dataTblDiff,tbl_temp1,tbl_temp2)
}
}}
}
}
}
}
#.................-
# Check Inf in Diff
#.................
if (T) {
# data table
if (!is.null(dataTblDiff)) {
if (any(dataTblDiff$value == Inf)) {
dataTblDiff <- dataTblDiff %>%
dplyr::mutate(value = dplyr::if_else((is.infinite(value) | (is.nan(value))), NA_real_, value))
rlang::warn(
"When calculating difference, diving by '0' results in 'Inf'. 'Inf' values converted to NAs."
)
}
}
}
dataTbl <- dataTbl %>%
dplyr::bind_rows(dataTblDiff) %>%
dplyr::ungroup() %>%
dplyr::distinct();
}else{
scenRef = NULL
scenDiff = NULL
} # Compare Scenarios
# Compare X
if(length(unique(dataTbl$x))>1){
if(!is.null(xRef)){
if(!any(xRef %in% xRange)){
rlang::inform(paste("xRef chosen: ", xRef, " is not in any of the available x values: ",sep=""))
rlang::inform(paste(xRange,collapse=", "))
rlang::inform(paste("Setting xRef to first x value: ", xRange[1],".",sep=""))
xRef <- xRange[1]
}
if(is.null(xDiff)){
xDiff <- xRange[!xRange %in% xRef]
rlang::inform(paste("Running difference against all available x:",sep=""))
rlang::inform(paste(xDiff,collapse=", "))
}else{
if(!any(xDiff %in% xRange)){
rlang::inform(paste("None of the xDiff are in any of the available scenarios: "))
rlang::inform(paste(xRange[!xRange %in% xRef],collapse=", "))
rlang::inform(paste("Skipping x Diff.",sep=""))
} else {
if(!all(xDiff %in% xRange)){
rlang::inform(paste0("Not all xDiff chosen: ",paste(xDiff,collapse=",")))
xDiff <- xDiff[xDiff %in% xRange]
rlang::inform(paste0("Setting xDiff to available x: ",xDiff))
}
}
}
dataTblxDiff <- data.frame()
for(i in 1:length(params)){
NULL -> param_i -> xRef_i -> xDiff_i
param_i <- params[i]
xRef_i <- xRef
xDiff_i <- xDiff
if(!is.null(param_i) & !is.null(xRef_i) & !is.null(xDiff_i)){
# Compare Data
if(nrow(dataTbl)>0){
dataTblDiffa <- dataTbl %>% dplyr::filter(param==param_i & (x %in% c(xRef_i,xDiff_i)));dataTblDiffa
if(nrow(dataTblDiffa)>0){
# Calculate Diff Values
if(xRef_i %in% unique(dataTblDiffa$x)){
rlang::inform(paste("Ref x chosen for param: ", param_i, " is ", paste(xRef_i,collapse=", "),sep=""))
if(any(xDiff_i %in% unique(dataTblDiffa$x))){
rlang::inform(paste("Diff x chosen for param: ", param_i, " are ",
paste(xDiff_i[xDiff_i %in% unique(dataTblDiffa$x)],collapse=", "),sep=""))
}
xDiff_i <- xDiff_i[xDiff_i %in% unique(dataTblDiffa$x)]
colsx <- c("region","subRegion","lat","lon","subRegType","param","x","xLabel","units","aggregate","palette","class","scenario","value")
colsx1 <- names(dataTbl)[names(dataTbl) %in% colsx]; colsx1
colsx2 <- colsx1[!colsx1 %in% "value"]; colsx2
dataTblDiffb<-dataTbl%>%dplyr::filter(param==param_i, x %in% c(xRef_i,xDiff_i))%>%
dplyr::select(dplyr::all_of(colsx1))%>%
dplyr::group_by_at(colsx2)%>%
dplyr::summarize(value=sum(value,na.rm=T))%>%
tidyr::spread(x,value);dataTblDiffb%>%as.data.frame(); names(dataTblDiffb)
for (scen_i in scenarios){
for (x_i in unique(dataTbl$x)[(unique(dataTbl$x) %in% xDiff_i)]){
tbl_temp1 <-dataTblDiffb%>%
dplyr::filter(scenario==scen_i)%>%
dplyr::mutate(!!paste(scen_i,"_xDiffAbs_",xRef_i,sep=""):=(!!as.name(x_i)-!!as.name(xRef_i)),
palette=paletteDiff)%>%
dplyr::select(-!!as.character(xDiff_i),-!!as.character(xRef_i))
tbl_temp1<-tbl_temp1%>%
tidyr::gather(key=scenario,value=value,
-c(names(tbl_temp1)[!names(tbl_temp1) %in% paste(scen_i,"_xDiffAbs_",xRef_i,sep="")]))%>%
dplyr::mutate(x=x_i)%>%
dplyr::mutate(value = dplyr::if_else(is.nan(value),0,value))
tbl_temp2 <-dataTblDiffb%>%
dplyr::filter(scenario==scen_i)%>%
dplyr::mutate(!!paste(scen_i,"_xDiffPrcnt_",xRef_i,sep=""):=((!!as.name(x_i)-!!as.name(xRef_i))*100/!!as.name(xRef_i)),
palette=paletteDiff)%>%
dplyr::select(-!!as.character(xDiff_i),-!!as.character(xRef_i))
tbl_temp2<-tbl_temp2%>%
tidyr::gather(key=scenario,value=value,
-c(names(tbl_temp2)[!names(tbl_temp2) %in% paste(scen_i,"_xDiffPrcnt_",xRef_i,sep="")]))%>%
dplyr::mutate(x=x_i)%>%
dplyr::mutate(value = dplyr::if_else(is.nan(value),0,value))
dataTblxDiff<-dplyr::bind_rows(dataTblxDiff,tbl_temp1,tbl_temp2)
}
} # Close Scenario
}
}
}
}
}
}
#.................-
# Check Inf in xDiff
#.................
if (T) {
# data table
if (!is.null(dataTblxDiff)) {
if (any(dataTblxDiff$value == Inf)) {
dataTblxDiff <- dataTblxDiff %>%
dplyr::mutate(value = dplyr::if_else((is.infinite(value) | (is.nan(value))), NA_real_, value))
rlang::warn(
"When calculating x difference, diving by '0' results in 'Inf' values. 'Inf' values converted to NAs."
)
}
}
}
dataTbl <- dataTbl %>%
dplyr::bind_rows(dataTblxDiff) %>%
dplyr::ungroup() %>%
dplyr::distinct();
}else{
xRef = NULL
xDiff = NULL
} # Compare X
}
}
#.................-
# Check MultiFacet Columns
#.................-
if(T){ # Check facet column/Rows selected exist
# Shape Table
# data table
if(!is.null(dataTbl)){
if(!is.null(col)){
if(!any(col %in% names(dataTbl))){
rlang::inform(paste0("col chosen: ", col ,"do not exist:"))
col <- NULL
}}
if(!is.null(row)){
if(!any(row %in% names(dataTbl))){
rlang::inform(paste0("row chosen: ", row ,"do not exist:"))
row <- NULL
}
}
}
} # Check facet column/rows selected exist
#................
# Check scaleRanges
#.............--
if(T){
# Get list of params in data or shapex data
if(!is.null(dataTbl)){if(nrow(dataTbl)>0){paramsdata <- unique(dataTbl$param)}}
paramsRange <- unique(c(paramsdata)); paramsRange
# Scale Range
if(!is.null(scaleRange)){
# Scale Range
scaleRange[is.na(scaleRange)]<-NA_real_
scaleRange[scaleRange=="NA"]<-NA_real_
# If scale range is a vector of two numbers set as limits for all params
if(is.numeric(scaleRange) & length(scaleRange)==2){
scaleRange = data.frame(param=paramsRange,maxScale=max(scaleRange),minScale=min(scaleRange))
} else {
# Else format the scaleRange data frame as needed
if(!is.null(nrow(scaleRange))){
scaleRange = addMissingScale(scaleRange)
if(!any(unique(scaleRange$param) %in% paramsRange)){
rlang::inform(paste("None of the params in scaleRange: ",
paste(unique(scaleRange$param),collapse=", "),sep=""))
rlang::inform("are present in the data params:")
rlang::inform(paste(paramsRange,collapse=", "))
rlang::inform("Setting scaleRange to NULL")
scaleRange=NULL
}
}else{scaleRange=NULL}
}
}
# Scale Range Diff Abs
if(!is.null(scaleRangeDiffAbs)){
scaleRangeDiffAbs[is.na(scaleRangeDiffAbs)]<-NA_real_
scaleRangeDiffAbs[scaleRangeDiffAbs=="NA"]<-NA_real_
# If scale range is a vector of two numbers set as limits for all params
if(is.numeric(scaleRangeDiffAbs) & length(scaleRangeDiffAbs)==2){
scaleRangeDiffAbs = data.frame(param=paramsRange,maxScale=max(scaleRangeDiffAbs),minScale=min(scaleRangeDiffAbs))
} else {
if(!is.null(nrow(scaleRangeDiffAbs))){
scaleRangeDiffAbs = addMissingScale(scaleRangeDiffAbs)
if(!any(unique(scaleRangeDiffAbs$param) %in% paramsRange)){
rlang::inform(paste("None of the params in scaleRangeDiffAbs: ",
paste(unique(scaleRangeDiffAbs$param),collapse=", "),sep=""))
rlang::inform("are present in the data params:")
rlang::inform(paste(paramsRange,collapse=", "))
rlang::inform("Setting scaleRangeDiffAbs to NULL")
scaleRangeDiffAbs=NULL
}
}else{scaleRangeDiffAbs=NULL}
}
}
if(!is.null(scaleRangeDiffPrcnt)){
# Scale Range Diff Prcnt
scaleRangeDiffPrcnt[is.na(scaleRangeDiffPrcnt)]<-NA_real_
scaleRangeDiffPrcnt[scaleRangeDiffPrcnt=="NA"]<-NA_real_
# If scale range is a vector of two numbers set as limits for all params
if(is.numeric(scaleRangeDiffPrcnt) & length(scaleRangeDiffPrcnt)==2){
scaleRangeDiffPrcnt = data.frame(param=paramsRange,maxScale=max(scaleRangeDiffPrcnt),minScale=min(scaleRangeDiffPrcnt))
} else {
# Else format the scaleRangeDiffPrcnt data frame as needed
if(!is.null(nrow(scaleRangeDiffPrcnt))){
scaleRangeDiffPrcnt = addMissingScale(scaleRangeDiffPrcnt)
if(!any(unique(scaleRangeDiffPrcnt$param) %in% paramsRange)){
rlang::inform(paste("None of the params in scaleRangeDiffPrcnt: ",
paste(unique(scaleRangeDiffPrcnt$param),collapse=", "),sep=""))
rlang::inform("are present in the data params:")
rlang::inform(paste(paramsRange,collapse=", "))
rlang::inform("Setting scaleRangeDiffPrcnt to NULL")
scaleRangeDiffPrcnt=NULL
}
}else{scaleRangeDiffPrcnt=NULL}
}
}
# Scale Range Diff X Abs
if(!is.null(scaleRangexDiffAbs)){
scaleRangexDiffAbs[is.na(scaleRangexDiffAbs)]<-NA_real_
scaleRangexDiffAbs[scaleRangexDiffAbs=="NA"]<-NA_real_
# If scale range is a vector of two numbers set as limits for all params
if(is.numeric(scaleRangexDiffAbs) & length(scaleRangexDiffAbs)==2){
scaleRangexDiffAbs = data.frame(param=paramsRange,maxScale=max(scaleRangexDiffAbs),minScale=min(scaleRangexDiffAbs))
} else {
if(!is.null(nrow(scaleRangexDiffAbs))){
scaleRangexDiffAbs = addMissingScale(scaleRangexDiffAbs)
if(!any(unique(scaleRangexDiffAbs$param) %in% paramsRange)){
rlang::inform(paste("None of the params in scaleRangexDiffAbs: ",
paste(unique(scaleRangexDiffAbs$param),collapse=", "),sep=""))
rlang::inform("are present in the data params:")
rlang::inform(paste(paramsRange,collapse=", "))
rlang::inform("Setting scaleRangexDiffAbs to NULL")
scaleRangexDiffAbs=NULL
}
}else{scaleRangexDiffAbs=NULL}
}
}
# Scale Range Diff X Prcnt
if(!is.null(scaleRangexDiffPrcnt)){
scaleRangexDiffPrcnt[is.na(scaleRangexDiffPrcnt)]<-NA_real_
scaleRangexDiffPrcnt[scaleRangexDiffPrcnt=="NA"]<-NA_real_
# If scale range is a vector of two numbers set as limits for all params
if(is.numeric(scaleRangexDiffPrcnt) & length(scaleRangexDiffPrcnt)==2){
scaleRangexDiffPrcnt = data.frame(param=paramsRange,maxScale=max(scaleRangexDiffPrcnt),minScale=min(scaleRangexDiffPrcnt))
} else {
# Else format the scaleRangexDiffPrcnt data frame as needed
if(!is.null(nrow(scaleRangexDiffPrcnt))){
scaleRangexDiffPrcnt = addMissingScale(scaleRangexDiffPrcnt)
if(!any(unique(scaleRangexDiffPrcnt$param) %in% paramsRange)){
rlang::inform(paste("None of the params in scaleRangexDiffPrcnt: ",
paste(unique(scaleRangexDiffPrcnt$param),collapse=", "),sep=""))
rlang::inform("are present in the data params:")
rlang::inform(paste(paramsRange,collapse=", "))
rlang::inform("Setting scaleRangexDiffPrcnt to NULL")
scaleRangexDiffPrcnt=NULL
}
}else{scaleRangexDiffPrcnt=NULL}
}
}
}# Close Check Scale Range
#.................-
# Set Palettes
#.................-
if(T){
if(!is.null(dataTbl)){
if(nrow(dataTbl)>0){
if(length(paletteOrig)>1){
dataTbl <- dataTbl %>%
dplyr::mutate(palette = dplyr::case_when(palette=="pal_hot" ~ paste(paletteOrig,collapse=","),
TRUE ~ palette))
}
if(length(paletteDiff)>1){
dataTbl <- dataTbl %>%
dplyr::mutate(palette = dplyr::case_when(palette=="pal_div_BluRd" ~ paste(paletteDiff,collapse=","),
TRUE ~ palette))
}
}
}
}
# .................--
# Create Plots
# .................--
if(T){ # Create Plots
if(!is.null(dataTbl)){
if(nrow(dataTbl)>0){
dataTblOrig <- dataTbl
dataTbl_scenariosOrig <- unique(dataTbl$scenario)
if(!length(unique(dataTblOrig$x))>1){animate=F}
for (param_i in unique(dataTblOrig$param)){
# If not diffOnly
if(!diffOnly){
if(length(unique(dataTblOrig$param))==1){param_if=NULL}else{param_if=param_i}
if(nrow(dataTblOrig%>%dplyr::filter(param==param_i))>0){
dataTblx <- dataTblOrig%>%dplyr::filter(param==param_i,
scenario %in% dataTbl_scenariosOrig[!grepl("_xDiff|_DiffAbs|_DiffPrcnt",dataTbl_scenariosOrig)])
if(nrow(dataTblx)>0){
#.................-
# Create data Table Folders If Needed
#.................-
if(save){
if(!dir.exists(paste(folder,"/",sep = ""))){
dir.create(paste(folder,"/",sep = ""))}
if(!dir.exists(paste(folder,"/",param_if,sep = ""))){
dir.create(paste(folder,"/",param_if,sep = ""))}
if(!dir.exists(paste(folder,"/",param_if,sep = ""))){
dir.create(paste(folder, "/",param_if,sep = ""))}
if(length(unique(dataTblx$x))>1){
if(!dir.exists(paste(folder,"/",param_if,"/byYear",sep = ""))){
dir.create(paste(folder, "/",param_if,"/byYear",sep = ""))}
}
} # Create data table folder if needed
#.................--
# Save Map related Data Table
#.................--
if(save){
if(nrow(dataTblx %>% dplyr::filter(param==param_i))>0){
data.table::fwrite(dataTblx %>% dplyr::filter(param==param_i)%>%
dplyr::select(scenario,lat,lon,subRegion,region,param,class,x,value,units),
paste(folder,"/",param_if,"/map_",param_i,nameAppend,".csv",sep = ""))
rlang::inform(paste("Map data table written to ",folder,"/",param_if,"/map_",param_i,nameAppend,".csv",sep = ""))
}
}
#.............................
# By Year
#.............................
# Set Legends
if(T){
scalex<-dataTblx$value
scalex <- scalex[!is.infinite(scalex)]
scalex <- scalex[!is.nan(scalex)]
scalex <- scalex[!is.na(scalex)]
# Choose correct scaleRange
scaleRange_i=scaleRange
if(!is.null(scaleRange_i)){
if(any(param_i %in% unique(scaleRange_i$param))){
if(max(scalex) < (scaleRange_i %>% dplyr::filter(param==param_i))$maxScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$maxScale,
scalex[scalex<(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale])
}
if(min(scalex) > (scaleRange_i %>% dplyr::filter(param==param_i))$minScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$minScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$minScale,
scalex[scalex>(scaleRange_i %>% dplyr::filter(param==param_i))$minScale])
}
}
}
prettyBreaks<-scales::pretty_breaks(n=legendBreaksn)(scalex); prettyBreaks
kmeanBreaks<-sort(as.vector((stats::kmeans(scalex,
centers=max(1,min(length(unique(scalex))-1,(legendBreaksn-1)))))$centers[,1]));kmeanBreaks
if(!min(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(min(scalex),kmeanBreaks))}
if(!max(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(kmeanBreaks,max(scalex)))};kmeanBreaks
if(!is.null(legendFixedBreaks)){
if(min(scalex) < min(legendFixedBreaks)){
legendFixedBreaks <- sort(c(min(scalex),legendFixedBreaks))}
if(max(scalex) > max(legendFixedBreaks)){
legendFixedBreaks <- sort(c(legendFixedBreaks,max(scalex)))};legendFixedBreaks
}
if((max(range(scalex))-min(range(scalex)))<1E-10 &
(max(range(scalex))-min(range(scalex)))>-1E-10){scaleRangex=min(scalex)}else{
scaleRangex=range(scalex)
}
if(abs(min(scaleRangex,na.rm = T))==abs(max(scaleRangex,na.rm = T))){scaleRangex=abs(min(scaleRangex,na.rm = T))}
if(mean(scaleRangex,na.rm = T)<0.01 & mean(scaleRangex,na.rm = T)>(-0.01)){legendDigits<-5}else{
if(mean(scaleRangex,na.rm = T)<0.1 & mean(scaleRangex,na.rm = T)>(-0.1)){legendDigits<-4}else{
if(mean(scaleRangex,na.rm = T)<1 & mean(scaleRangex,na.rm = T)>(-1)){legendDigits<-3}else{
if(mean(scaleRangex,na.rm = T)<10 & mean(scaleRangex,na.rm = T)>(-10)){legendDigits<-2}else{legendDigits<-1}}}}
}
# By Year
if(length(unique(dataTblx$x))>1){
for (x_i in unique(dataTblx$x)){
datax<-dataTblx%>%dplyr::filter(x==x_i)
if(nrow(datax)>0){
if(is.null(legendTitleOrig)){legendTitle<-unique(datax$units)}
palette<-as.character(unique(datax$palette)); if(grepl(",",palette)){palette = unlist(stringr::str_split(palette,","))}
# Set Facets
if(length(unique(datax$scenario))>1){
multiFacetColsx <- "scenario"
colm <- length(unique(datax$scenario))
if((length(unique(datax$class))>1)){
multiFacetColsx <- "class"
colm <- length(unique(datax$class))
multiFacetRowsx <- c("scenario")
rowm <- length(unique(datax$scenario))
}else{
multiFacetRowsx <- NULL
rowm = 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}
}else{
if((length(unique(datax$class))>1)){
multiFacetColsx <- c("class")
multiFacetRowsx <- NULL
colm = length(unique(datax$class))
rowm = 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}else{
if(forceFacets){
multiFacetColsx <- "scenario"
} else {
multiFacetColsx <- NULL
}
multiFacetRowsx <- NULL
colm = 1
rowm = 1
}
}
# Add facet or Rows if selected
if(!is.null(col)){
if(!is.null(multiFacetColsx)){
multiFacetColsx <- c(multiFacetColsx,col)
colm <- colm + length(col)
} else { multiFacetColsx <- col; colm <- length(col)}
}
if(!is.null(row)){
if(!is.null(multiFacetRowsx)){
multiFacetRowsx <- c(multiFacetRowsx,row)
rowm <- rowm + length(row)
} else { multiFacetRowsx <- row; rowm <- length(row)}
}
# Check for Duplicates
if(duplicated(datax %>%
dplyr::select(lat,lon,subRegion,region,x,dplyr::all_of(multiFacetRowsx),dplyr::all_of(multiFacetColsx))) %>%
any()){stop("input data has multiple values. Please check your data.")}
# Set title
if(is.null(title)){
if(param_i == "param"){
titlex <- paste(x_i,sep="")
} else {
titlex <- paste(param_i," ",x_i,sep="")
}
} else if(title == F){
titlex <- NULL
} else {
titlex <- title
}
# Assign variables based on legend type choice
if(any(grepl("all|kmean",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))){
fileNameTag <- "KMEANS"
legendBreaksx <- kmeanBreaks
} else if(any(grepl("all|continuous",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "CONTINUOUS"
legendBreaksx <- prettyBreaks
} else if(any(grepl("all|pretty",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "PRETTY"
legendBreaksx <- prettyBreaks
} else if(!is.null(legendFixedBreaks)){
fileNameTag <- "FIXED"
legendBreaksx <- legendFixedBreaks
}
rmap::map_plot(crs=crs, underLayerLabelCol = underLayerLabelCol, overLayerLabelCol = overLayerLabelCol, labelCol=labelCol, region=region,color=color, lwd=lwd, legendType=legendType, save=save, show=show, shape = shapex, overLayer=overLayer, overLayerColor=overLayerColor,
overLayerFill = overLayerFill, overLayerLwd = overLayerLwd,
overLayerAlpha = overLayerAlpha, underLayerColor=underLayerColor,
underLayerFill = underLayerFill, underLayerLwd = underLayerLwd,
underLayerAlpha = underLayerAlpha, background=background,
zoom=zoom, zoomx = zoomx, zoomy=zoomy, asp=asp, legendShow=legendShow,
crop = crop, crop_to_underLayer = crop_to_underLayer, crop_to_overLayer = crop_to_overLayer, transparent=transparent,
alpha = alpha, size=max(1,(size+(colm+rowm)*3 - 12)),
ncol=ncol, showNA=showNA, colorNA=colorNA,
theme = theme, legendTitle=legendTitle,
legendDigitsOverride=legendDigitsOverride,
numeric2Cat_list=numeric2Cat_list, catParam = param_i,
underLayer=underLayer,
data=datax,
labelColor=labelColor,
labelSize=labelSize,
labelAlpha=labelAlpha,
labelFill=labelFill,
labelBorderSize=labelBorderSize,
legendBreaksn=legendBreaksn,
legendDigits = legendDigits,
palette = palette,
width=width*max(1,colm/1),
height=height*max(1,rowm/1),
pdfpng = pdfpng, legendSingleColor = legendSingleColor, legendSingleValue = legendSingleValue,
labels=labels, labelRepel=labelRepel, underLayerLabels=underLayerLabels, overLayerLabels=overLayerLabels,
legendBreaks = legendBreaksx,
fillColumn = "value",
col = multiFacetColsx,
row = multiFacetRowsx,
title=titlex ,
fileName = paste("map_",param_i,"_",x_i,"_",fileNameTag,nameAppend,sep=""),
folder = paste(folder,"/",param_if,"/byYear",sep = "")) ->
mapsReturn[[return_i]];
names(mapsReturn)[return_i] <- paste("map_",param_i,"_",x_i,"_",fileNameTag,nameAppend,sep="");
return_i = return_i + 1
# theme_ggplot = theme_ggplot
# theme_custom = theme_custom
# theme_rmap = theme_rmap
# legendDigitsOverride=legendDigitsOverride
# numeric2Cat_list=numeric2Cat_list
# underLayer=underLayer
# data=datax
# legendBreaksn=legendBreaksn
# legendDigits = legendDigits
# palette = palette
# width=width*max(1,colm/1),
# height=height*max(1,rowm/1),
# pdfpng = pdfpng
# legendSingleColor = legendSingleColor
# legendSingleValue = legendSingleValue
# labels=labels
# legendBreaks = kmeanBreaks
# fillColumn = "value"
# col = multiFacetColsx
# row = multiFacetRowsx
# title=paste(param_i," ",x_i,sep="")
# fileName = paste("map_",param_i,"_",x_i,"_",fileNameTag,nameAppend,sep="")
# folder = paste(folder,"/",param_if,"/byYear",sep = "")
}
} # Close years x_i loop
# Animations
if(animate==T){
animName<-paste("anim_",param_i,"_",fileNameTag,nameAppend,".gif",sep="")
animFiles <- list.files(path = paste(folder,"/",param_if,"/byYear",sep=""),
pattern = paste(".*",param_i,".*",fileNameTag,nameAppend,"", ".", pdfpng,sep=""), full.names=T,ignore.case = T, include.dirs = T);
animation <- magick::image_animate(magick::image_join(lapply(animFiles, magick::image_read)),fps=fps)
magick::image_write(animation,paste(folder,"/",param_if,"/",
animName,sep = ""))
rlang::inform(gsub("//","/",paste("animation saved in :",folder,"/",param_if,"/",
animName,sep = "")))
}
}
# Multi-Year-Single Chart
datax<-dataTblx%>%dplyr::filter(param==param_i)
if(nrow(datax)>0){
if(is.null(legendTitleOrig)){legendTitle<-unique(datax$units)}
palette<-as.character(unique(datax$palette)); if(grepl(",",palette)){palette = unlist(stringr::str_split(palette,","))}
scalex<-datax$value
scalex <- scalex[!is.infinite(scalex)]
scalex <- scalex[!is.nan(scalex)]
scalex <- scalex[!is.na(scalex)]
# Choose correct scaleRange
if(T){
scaleRange_i=scaleRange
if(!is.null(scaleRange_i)){
if(any(param_i %in% unique(scaleRange_i$param))){
if(max(scalex) < (scaleRange_i %>% dplyr::filter(param==param_i))$maxScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$maxScale,
scalex[scalex<(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale])
}
if(min(scalex) > (scaleRange_i %>% dplyr::filter(param==param_i))$minScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$minScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$minScale,
scalex[scalex>(scaleRange_i %>% dplyr::filter(param==param_i))$minScale])
}
}
}
prettyBreaks<-scales::pretty_breaks(n=legendBreaksn)(scalex)
kmeanBreaks<-sort(as.vector((stats::kmeans(scalex,
centers=max(1,min(length(unique(scalex))-1,(legendBreaksn-1)))))$centers[,1]))
if(!min(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(min(scalex),kmeanBreaks))}
if(!max(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(kmeanBreaks,max(scalex)))}
if(!is.null(legendFixedBreaks)){
if(min(scalex) < min(legendFixedBreaks)){
legendFixedBreaks <- sort(c(min(scalex),legendFixedBreaks))}
if(max(scalex) > max(legendFixedBreaks)){
legendFixedBreaks <- sort(c(legendFixedBreaks,max(scalex)))};legendFixedBreaks
}
if((max(range(scalex))-min(range(scalex)))<1E-10 &
(max(range(scalex))-min(range(scalex)))>-1E-10){scaleRangex=min(scalex)}else{
scaleRangex=range(scalex)
}
if(abs(min(scaleRangex,na.rm = T))==abs(max(scaleRangex,na.rm = T))){scaleRangex=abs(min(scaleRangex,na.rm = T))}
if(mean(scaleRangex,na.rm = T)<0.01 & mean(scaleRangex,na.rm = T)>(-0.01)){legendDigits<-5}else{
if(mean(scaleRangex,na.rm = T)<0.1 & mean(scaleRangex,na.rm = T)>(-0.1)){legendDigits<-4}else{
if(mean(scaleRangex,na.rm = T)<1 & mean(scaleRangex,na.rm = T)>(-1)){legendDigits<-3}else{
if(mean(scaleRangex,na.rm = T)<10 & mean(scaleRangex,na.rm = T)>(-10)){legendDigits<-2}else{legendDigits<-1}}}}
}
# Set Facets
if(length(unique(datax$x))>1){
multiFacetColsx <- "x"
colm <- length(unique(datax$x))
if((length(unique(datax$scenario))>1) & (length(unique(datax$class))>1)){
multiFacetRowsx <- "x"
rowm <- length(unique(datax$x))
multiFacetColsx <- c("scenario","class")
colm <- length(unique(datax$scenario))*length(unique(datax$class))
}
if((length(unique(datax$scenario))>1) & (!length(unique(datax$class))>1)){
multiFacetRowsx <- c("scenario")
rowm <- length(unique(datax$scenario))
}
if((!length(unique(datax$scenario))>1) & (length(unique(datax$class))>1)){
multiFacetRowsx <- "x"
rowm <- length(unique(datax$x))
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
}
if((!length(unique(datax$scenario))>1) & (!length(unique(datax$class))>1)){
multiFacetRowsx <- NULL
rowm <- 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}
}else{
if(length(unique(datax$scenario))>1){
multiFacetColsx <- "scenario"
colm <- length(unique(datax$scenario))
if((length(unique(datax$class))>1)){
multiFacetRowsx <- "scenario"
rowm <- length(unique(datax$scenario))
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
}else{
multiFacetRowsx <- NULL
rowm <- 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}
}else{
if((length(unique(datax$class))>1)){
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
multiFacetRowsx <- NULL
rowm <- 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}else{
if(forceFacets){
multiFacetColsx <- "scenario"
} else {
multiFacetColsx <- NULL
}
multiFacetRowsx <- NULL
colm <- 1
rowm <- 1
}
}
}
# Add facet or Rows if selected
if(!is.null(col)){
if(!is.null(multiFacetColsx)){
multiFacetColsx <- c(multiFacetColsx,col)
colm <- colm + length(col)
} else { multiFacetColsx <- col; colm <- length(col)}
}
if(!is.null(row)){
if(!is.null(multiFacetRowsx)){
multiFacetRowsx <- c(multiFacetRowsx,row)
rowm <- rowm + length(row)
} else { multiFacetRowsx <- row; rowm <- length(row)}
}
# Check for Duplicates
if(duplicated(datax %>%
dplyr::select(subRegion,region,lat,lon,x,dplyr::all_of(multiFacetRowsx),dplyr::all_of(multiFacetColsx))) %>%
any()){stop("input data has multiple values. Please check your data.")}
# Set title
if(is.null(title)){
if(param_i != "param"){
titlex <- paste(param_i,sep="")
} else {
titlex <- NULL
}
} else if(title == F){
titlex <- NULL
} else {
titlex <- title
}
# Assign variables based on legend type choice
if(any(grepl("all|kmean",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))){
fileNameTag <- "KMEANS"
legendBreaksx <- kmeanBreaks
} else if(any(grepl("all|continuous",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "CONTINUOUS"
legendBreaksx <- prettyBreaks
} else if(any(grepl("all|pretty",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "PRETTY"
legendBreaksx <- prettyBreaks
} else if(!is.null(legendFixedBreaks)){
fileNameTag <- "FIXED"
legendBreaksx <- legendFixedBreaks
}
rmap::map_plot(crs=crs, underLayerLabelCol = underLayerLabelCol, overLayerLabelCol = overLayerLabelCol, labelCol=labelCol, region=region,color=color, lwd=lwd, legendType=legendType, save=save, show=show, shape = shapex, overLayer=overLayer, overLayerColor=overLayerColor,
overLayerFill = overLayerFill, overLayerLwd = overLayerLwd,
overLayerAlpha = overLayerAlpha, underLayerColor=underLayerColor,
underLayerFill = underLayerFill, underLayerLwd = underLayerLwd,
underLayerAlpha = underLayerAlpha, background=background, zoom=zoom,
zoomx = zoomx, zoomy=zoomy, asp=asp, legendShow=legendShow,
crop = crop, crop_to_underLayer = crop_to_underLayer, crop_to_overLayer = crop_to_overLayer, transparent=transparent,
alpha = alpha, size=max(1,(size+(colm+rowm)*3 - 12)), ncol=ncol,
showNA=showNA, colorNA=colorNA,
labelColor=labelColor,
labelSize=labelSize,
labelAlpha=labelAlpha,
labelFill=labelFill,
labelBorderSize=labelBorderSize,
theme = theme, legendTitle=legendTitle,
legendDigitsOverride=legendDigitsOverride,
numeric2Cat_list=numeric2Cat_list, catParam = param_i,
underLayer=underLayer,
data=datax,
legendBreaksn=legendBreaksn,
legendDigits = legendDigits,
palette = palette,
width=width*max(1,colm/1),
height=height*max(1,rowm/1),
pdfpng = pdfpng, legendSingleColor = legendSingleColor, legendSingleValue = legendSingleValue,
labels=labels, labelRepel=labelRepel, underLayerLabels=underLayerLabels, overLayerLabels=overLayerLabels,
legendBreaks = legendBreaksx,
fillColumn = "value",
col = multiFacetColsx,
row = multiFacetRowsx,
title= titlex,
fileName = paste("map_",param_i,"_",fileNameTag,nameAppend,sep=""),
folder = sub("/$","",paste(folder,"/",param_if,sep = ""))) ->
mapsReturn[[return_i]];
names(mapsReturn)[return_i] <- paste("map_",param_i,"_",fileNameTag,nameAppend,sep="");
return_i = return_i + 1
# color=color; lwd=lwd; legendType=legendType; save=save; show=show; shape = shapex; overLayer=overLayer; overLayerColor=overLayerColor;
# overLayerFill = overLayerFill; overLayerLwd = overLayerLwd;
# overLayerAlpha = overLayerAlpha; underLayerColor=underLayerColor;
# underLayerFill = underLayerFill; underLayerLwd = underLayerLwd;
# underLayerAlpha = underLayerAlpha; background=background; zoom=zoom;
# zoomx = zoomx; zoomy=zoomy; asp=asp; legendShow=legendShow;
# crop = crop; crop_to_underLayer = crop_to_underLayer; crop_to_overLayer = crop_to_overLayer; transparent=transparent;
# alpha = alpha; size=max(1,(size+(colm+rowm)*3 - 12)); ncol=ncol;
# showNA=showNA; colorNA=colorNA;
# labelColor=labelColor;
# labelSize=labelSize;
# labelAlpha=labelAlpha;
# labelFill=labelFill;
# labelBorderSize=labelBorderSize;
# theme = theme; legendTitle=legendTitle;
# legendDigitsOverride=legendDigitsOverride;
# numeric2Cat_list=numeric2Cat_list; catParam = param_i;
# underLayer=underLayer;
# data=datax;
# legendBreaksn=legendBreaksn;
# legendDigits = legendDigits;
# palette = palette;
# width=width*max(1,colm/1);
# height=height*max(1,rowm/1);
# pdfpng = pdfpng; legendSingleColor = legendSingleColor; legendSingleValue = legendSingleValue;
# labels=labels; labelRepel=labelRepel; underLayerLabels=underLayerLabels; overLayerLabels=overLayerLabels;
# legendBreaks = legendBreaksx;
# fillColumn = "value";
# col = multiFacetColsx;
# row = multiFacetRowsx;
# title= titlex;
# fileName = paste("map_",param_i,"_",fileNameTag,nameAppend,sep="");
# folder = sub("/$","",paste(folder,"/",param_if,sep = ""))
} # if(nrow(datax)>0){
# Mean for all years provided
datax<-dataTblx%>%dplyr::filter(param==param_i)
if(length(unique(datax$x))>1){
if(nrow(datax)>0){
if(is.null(legendTitleOrig)){legendTitle<-unique(datax$units)}
palette<-as.character(unique(datax$palette)); if(grepl(",",palette)){palette = unlist(stringr::str_split(palette,","))}
meanCol = paste("Mean_",min(datax$x),"_to_",max(datax$x),sep="")
colsPresentGroup = c("lon","lat","subRegion","region","scenario","class")
colsPresentGroup = colsPresentGroup[colsPresentGroup %in% names(datax)]
datax<-datax%>%
dplyr::select(lat,lon,subRegion,region,scenario,class,x,value)%>%
dplyr::group_by_at(dplyr::all_of(colsPresentGroup))%>%
dplyr::summarize(!!meanCol:=mean(value))%>%
dplyr::ungroup()
scalex<-datax[[meanCol]];scalex
scalex <- scalex[!is.infinite(scalex)]
scalex <- scalex[!is.nan(scalex)]
scalex <- scalex[!is.na(scalex)]
# Choose correct scaleRange
if(T){
scaleRange_i=scaleRange
if(!is.null(scaleRange_i)){
if(any(param_i %in% unique(scaleRange_i$param))){
if(max(scalex) < (scaleRange_i %>% dplyr::filter(param==param_i))$maxScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$maxScale,
scalex[scalex<(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale])
}
if(min(scalex) > (scaleRange_i %>% dplyr::filter(param==param_i))$minScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$minScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$minScale,
scalex[scalex>(scaleRange_i %>% dplyr::filter(param==param_i))$minScale])
}
}
}
prettyBreaks<-scales::pretty_breaks(n=legendBreaksn)(scalex)
kmeanBreaks<-sort(as.vector((stats::kmeans(scalex,
centers=max(1,min(length(unique(scalex))-1,(legendBreaksn-1)))))$centers[,1]))
if(!min(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(min(scalex),kmeanBreaks))}
if(!max(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(kmeanBreaks,max(scalex)))}
if(!is.null(legendFixedBreaks)){
if(min(scalex) < min(legendFixedBreaks)){
legendFixedBreaks <- sort(c(min(scalex),legendFixedBreaks))}
if(max(scalex) > max(legendFixedBreaks)){
legendFixedBreaks <- sort(c(legendFixedBreaks,max(scalex)))};legendFixedBreaks
}
if((max(range(scalex))-min(range(scalex)))<1E-10 &
(max(range(scalex))-min(range(scalex)))>-1E-10){scaleRangex=min(scalex)}else{
scaleRangex=range(scalex)
}
if(abs(min(scaleRangex,na.rm = T))==abs(max(scaleRangex,na.rm = T))){scaleRangex=abs(min(scaleRangex,na.rm = T))}
if(mean(scaleRangex,na.rm = T)<0.01 & mean(scaleRangex,na.rm = T)>(-0.01)){legendDigits<-5}else{
if(mean(scaleRangex,na.rm = T)<0.1 & mean(scaleRangex,na.rm = T)>(-0.1)){legendDigits<-4}else{
if(mean(scaleRangex,na.rm = T)<1 & mean(scaleRangex,na.rm = T)>(-1)){legendDigits<-3}else{
if(mean(scaleRangex,na.rm = T)<10 & mean(scaleRangex,na.rm = T)>(-10)){legendDigits<-2}else{legendDigits<-1}}}}
}
# Set Facets
if(length(unique(datax$scenario))>1){
multiFacetColsx <- "scenario"
colm <- length(unique(datax$scenario))
if((length(unique(datax$class))>1)){
multiFacetRowsx <- "scenario"
rowm <- length(unique(datax$scenario))
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
}else{
multiFacetRowsx <- NULL
rowm <- 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}
}else{
if((length(unique(datax$class))>1)){
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
multiFacetRowsx <- NULL
rowm <- 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}else{
if(forceFacets){
multiFacetColsx <- "scenario"
} else {
multiFacetColsx <- NULL
}
multiFacetRowsx <- NULL
colm <- 1
rowm <- 1
}
}
# Add facet or Rows if selected
if(!is.null(col)){
if(!is.null(multiFacetColsx)){
multiFacetColsx <- c(multiFacetColsx,col)
colm <- colm + length(col)
} else { multiFacetColsx <- col; colm <- length(col)}
}
if(!is.null(row)){
if(!is.null(multiFacetRowsx)){
multiFacetRowsx <- c(multiFacetRowsx,row)
rowm <- rowm + length(row)
} else { multiFacetRowsx <- row; rowm <- length(row)}
}
# Check for Duplicates
if(duplicated(datax %>%
dplyr::select(lat,lon,subRegion,region,x,dplyr::all_of(multiFacetRowsx),dplyr::all_of(multiFacetColsx))) %>%
any()){stop("input data has multiple values. Please check your data.")}
# Set title
if(is.null(title)){
if(param_i == "param"){
titlex <- paste(meanCol,sep="")
} else {
titlex <- paste(param_i," ",meanCol,sep="")
}
} else if(title == F){
titlex <- NULL
} else {
titlex <- title
}
# Assign variables based on legend type choice
if(any(grepl("all|kmean",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))){
fileNameTag <- "KMEANS"
legendBreaksx <- kmeanBreaks
} else if(any(grepl("all|continuous",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "CONTINUOUS"
legendBreaksx <- prettyBreaks
} else if(any(grepl("all|pretty",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "PRETTY"
legendBreaksx <- prettyBreaks
} else if(!is.null(legendFixedBreaks)){
fileNameTag <- "FIXED"
legendBreaksx <- legendFixedBreaks
}
rmap::map_plot(crs=crs, underLayerLabelCol = underLayerLabelCol, overLayerLabelCol = overLayerLabelCol, labelCol=labelCol, region=region,color=color, lwd=lwd, legendType=legendType, save=save, show=show, shape = shapex, overLayer=overLayer, overLayerColor=overLayerColor,
overLayerFill = overLayerFill, overLayerLwd = overLayerLwd,
overLayerAlpha = overLayerAlpha, underLayerColor=underLayerColor,
underLayerFill = underLayerFill, underLayerLwd = underLayerLwd,
underLayerAlpha = underLayerAlpha, background=background,
zoom=zoom, zoomx = zoomx, zoomy=zoomy, asp=asp, legendShow=legendShow,
crop = crop, crop_to_underLayer = crop_to_underLayer, crop_to_overLayer = crop_to_overLayer, transparent=transparent,
alpha = alpha, size=max(1,(size+(colm+rowm)*3 - 12)),
ncol=ncol, showNA=showNA, colorNA=colorNA,
labelColor=labelColor,
labelSize=labelSize,
labelAlpha=labelAlpha,
labelFill=labelFill,
labelBorderSize=labelBorderSize,
theme = theme, legendTitle=legendTitle,
legendDigitsOverride=legendDigitsOverride,
numeric2Cat_list=numeric2Cat_list, catParam = param_i,
underLayer=underLayer,
data=datax,
legendBreaksn=legendBreaksn,
legendDigits = legendDigits,
palette = palette,
width=width*max(1,colm/1),
height=height*max(1,rowm/1),
pdfpng = pdfpng, legendSingleColor = legendSingleColor, legendSingleValue = legendSingleValue,
labels=labels, labelRepel=labelRepel, underLayerLabels=underLayerLabels, overLayerLabels=overLayerLabels,
legendBreaks = legendBreaksx,
fillColumn = meanCol,
col = multiFacetColsx,
row = multiFacetRowsx,
title = titlex,
fileName = paste("map_",param_i,"_MEAN_",fileNameTag,nameAppend,sep=""),
folder = sub("/$","",paste(folder,"/",param_if,sep = ""))) ->
mapsReturn[[return_i]];
names(mapsReturn)[return_i] <- paste("map_",param_i,"_MEAN_",fileNameTag,nameAppend,sep="");
return_i = return_i + 1
# dataxtest <- datax
# crs=crs; underLayerLabelCol = underLayerLabelCol; overLayerLabelCol = overLayerLabelCol; labelCol=labelCol; region=region;color=color; lwd=lwd; legendType=legendType; save=save; show=show; shape = shapex; overLayer=overLayer; overLayerColor=overLayerColor;
# overLayerFill = overLayerFill; overLayerLwd = overLayerLwd;
# overLayerAlpha = overLayerAlpha; underLayerColor=underLayerColor;
# underLayerFill = underLayerFill; underLayerLwd = underLayerLwd;
# underLayerAlpha = underLayerAlpha; background=background;
# zoom=zoom; zoomx = zoomx; zoomy=zoomy; asp=asp; legendShow=legendShow;
# crop = crop; crop_to_underLayer = crop_to_underLayer; crop_to_overLayer = crop_to_overLayer; transparent=transparent;
# alpha = alpha; size=max(1,(size+(colm+rowm)*3 - 12));
# ncol=ncol; showNA=showNA; colorNA=colorNA;
# labelColor=labelColor;
# labelSize=labelSize;
# labelAlpha=labelAlpha;
# labelFill=labelFill;
# labelBorderSize=labelBorderSize;
# theme = theme; legendTitle=legendTitle;
# legendDigitsOverride=legendDigitsOverride;
# numeric2Cat_list=numeric2Cat_list; catParam = param_i;
# underLayer=underLayer;
# data=datax;
# legendBreaksn=legendBreaksn;
# legendDigits = legendDigits;
# palette = palette;
# width=width*max(1,colm/1);
# height=height*max(1,rowm/1);
# pdfpng = pdfpng; legendSingleColor = legendSingleColor; legendSingleValue = legendSingleValue;
# labels=labels; labelRepel=labelRepel; underLayerLabels=underLayerLabels; overLayerLabels=overLayerLabels;
# legendBreaks = legendBreaksx
# fillColumn = meanCol
# col = multiFacetColsx
# row = multiFacetRowsx
# title = titlex
# fileName = paste("map_",param_i,"_MEAN_",fileNameTag,nameAppend,sep="")
# folder = sub("/$","",paste(folder,"/",param_if,sep = ""))
} # if(nrow(datax)>0){
}# If multiple years
} # if nrow of dataTblx dplyr::filtered for Diff scenarios
}# Close if nrow dataTbl < 0
}
# if scenRef chosen
if(!is.null(scenRef)){
# Diff Abs
if(T){
if(length(unique(dataTblOrig$param))==1){param_if=NULL}else{param_if=param_i}
if(nrow(dataTblOrig%>%dplyr::filter(param==param_i))>0){
dataTblx <- dataTblOrig%>%dplyr::filter(param==param_i,
scenario %in% dataTbl_scenariosOrig[grepl("_DiffAbs",dataTbl_scenariosOrig)])
if(nrow(dataTblx)>0){
#.................-
# Create data Table Folders If Needed
#.................-
if(save){
if(!dir.exists(paste(folder,"/",sep = ""))){
dir.create(paste(folder,"/",sep = ""))}
if(!dir.exists(paste(folder,"/",param_if,sep = ""))){
dir.create(paste(folder,"/",param_if,sep = ""))}
if(!dir.exists(paste(folder,"/",param_if,sep = ""))){
dir.create(paste(folder, "/",param_if,sep = ""))}
if(length(unique(dataTblx$x))>1){
if(!dir.exists(paste(folder,"/",param_if,"/byYear",sep = ""))){
dir.create(paste(folder, "/",param_if,"/byYear",sep = ""))}
}
} # Create data table folder if needed
#.................--
# Save Map related Data Table
#.................--
if(save){
if(nrow(dataTblx %>% dplyr::filter(param==param_i))>0){
data.table::fwrite(dataTblx %>% dplyr::filter(param==param_i)%>%
dplyr::select(scenario,lat,lon,subRegion,region,param,class,x,value,units),
paste(folder,"/",param_if,"/map_",param_i,nameAppend,".csv",sep = ""))
rlang::inform(paste("Map data table written to ",folder,"/",param_if,"/map_",param_i,nameAppend,".csv",sep = ""))
}
}
#.............................
# By Year
#.............................
# Set Legends
if(T){
scalex<-dataTblx$value
scalex <- scalex[!is.infinite(scalex)]
scalex <- scalex[!is.nan(scalex)]
scalex <- scalex[!is.na(scalex)]
# Choose correct scaleRange
scaleRange_i=scaleRangeDiffAbs
if(!is.null(scaleRange_i)){
if(any(param_i %in% unique(scaleRange_i$param))){
if(max(scalex) < (scaleRange_i %>% dplyr::filter(param==param_i))$maxScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$maxScale,
scalex[scalex<(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale])
}
if(min(scalex) > (scaleRange_i %>% dplyr::filter(param==param_i))$minScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$minScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$minScale,
scalex[scalex>(scaleRange_i %>% dplyr::filter(param==param_i))$minScale])
}
}
}
prettyBreaks<-scales::pretty_breaks(n=legendBreaksn)(scalex); prettyBreaks
kmeanBreaks<-sort(as.vector((stats::kmeans(scalex,
centers=max(1,min(length(unique(scalex))-1,(legendBreaksn-1)))))$centers[,1]));kmeanBreaks
if(!min(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(min(scalex),kmeanBreaks))}
if(!max(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(kmeanBreaks,max(scalex)))};kmeanBreaks
if(!is.null(legendFixedBreaks)){
if(min(scalex) < min(legendFixedBreaks)){
legendFixedBreaks <- sort(c(min(scalex),legendFixedBreaks))}
if(max(scalex) > max(legendFixedBreaks)){
legendFixedBreaks <- sort(c(legendFixedBreaks,max(scalex)))};legendFixedBreaks
}
if((max(range(scalex))-min(range(scalex)))<1E-10 &
(max(range(scalex))-min(range(scalex)))>-1E-10){scaleRangex=min(scalex)}else{
scaleRangex=range(scalex)
}
if(abs(min(scaleRangex,na.rm = T))==abs(max(scaleRangex,na.rm = T))){scaleRangex=abs(min(scaleRangex,na.rm = T))}
if(mean(scaleRangex,na.rm = T)<0.01 & mean(scaleRangex,na.rm = T)>(-0.01)){legendDigits<-5}else{
if(mean(scaleRangex,na.rm = T)<0.1 & mean(scaleRangex,na.rm = T)>(-0.1)){legendDigits<-4}else{
if(mean(scaleRangex,na.rm = T)<1 & mean(scaleRangex,na.rm = T)>(-1)){legendDigits<-3}else{
if(mean(scaleRangex,na.rm = T)<10 & mean(scaleRangex,na.rm = T)>(-10)){legendDigits<-2}else{legendDigits<-1}}}}
}
# By Year
if(length(unique(dataTblx$x))>1){
for (x_i in unique(dataTblx$x)){
datax<-dataTblx%>%dplyr::filter(x==x_i)
if(nrow(datax)>0){
if(is.null(legendTitleOrig)){legendTitle<-unique(datax$units)}
palette<-as.character(unique(datax$palette)); if(grepl(",",palette)){palette = unlist(stringr::str_split(palette,","))}
# Set Facets
if(length(unique(datax$scenario))>1){
multiFacetColsx <- "scenario"
colm <- length(unique(datax$scenario))
if((length(unique(datax$class))>1)){
multiFacetRowsx <- "scenario"
rowm <- length(unique(datax$scenario))
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
}else{
multiFacetRowsx <- NULL
rowm = 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}
}else{
if((length(unique(datax$class))>1)){
multiFacetColsx <- c("class")
multiFacetRowsx <- NULL
colm = length(unique(datax$class))
rowm = 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}else{
if(forceFacets){
multiFacetColsx <- "scenario"
} else {
multiFacetColsx <- NULL
}
multiFacetRowsx <- NULL
colm = 1
rowm = 1
}
}
# Add facet or Rows if selected
if(!is.null(col)){
if(!is.null(multiFacetColsx)){
multiFacetColsx <- c(multiFacetColsx,col)
colm <- colm + length(col)
} else { multiFacetColsx <- col; colm <- length(col)}
}
if(!is.null(row)){
if(!is.null(multiFacetRowsx)){
multiFacetRowsx <- c(multiFacetRowsx,row)
rowm <- rowm + length(row)
} else { multiFacetRowsx <- row; rowm <- length(row)}
}
# Check for Duplicates
if(duplicated(datax %>%
dplyr::select(lat,lon,subRegion,region,x,dplyr::all_of(multiFacetRowsx),dplyr::all_of(multiFacetColsx))) %>%
any()){stop("input data has multiple values. Please check your data.")}
# Set title
if(is.null(title)){
if(param_i == "param"){
if(length(scenDiff)==1){
titlex <- paste(x_i," ",scenDiff," diffAbs ", scenRef,sep="")
}else{
titlex <- paste(x_i,sep="")
}
} else {
if(length(scenDiff)==1){
titlex <- paste(param_i," ",x_i," ",scenDiff," diffAbs ", scenRef,sep="")
}else{
titlex <- paste(param_i," ",x_i,sep="")
}
}
} else if(title == F){
titlex <- NULL
} else {
titlex <- title
}
# Assign variables based on legend type choice
if(any(grepl("all|kmean",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))){
fileNameTag <- "KMEANS"
legendBreaksx <- kmeanBreaks
} else if(any(grepl("all|continuous",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "CONTINUOUS"
legendBreaksx <- prettyBreaks
} else if(any(grepl("all|pretty",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "PRETTY"
legendBreaksx <- prettyBreaks
} else if(!is.null(legendFixedBreaks)){
fileNameTag <- "FIXED"
legendBreaksx <- legendFixedBreaks
}
rmap::map_plot(crs=crs, underLayerLabelCol = underLayerLabelCol, overLayerLabelCol = overLayerLabelCol, labelCol=labelCol, region=region,color=color, lwd=lwd, legendType=legendType, save=save, show=show, shape = shapex, overLayer=overLayer, overLayerColor=overLayerColor,
overLayerFill = overLayerFill, overLayerLwd = overLayerLwd,
overLayerAlpha = overLayerAlpha, underLayerColor=underLayerColor,
underLayerFill = underLayerFill, underLayerLwd = underLayerLwd,
underLayerAlpha = underLayerAlpha, background=background,
zoom=zoom, zoomx = zoomx, zoomy=zoomy, asp=asp, legendShow=legendShow,
crop = crop, crop_to_underLayer = crop_to_underLayer, crop_to_overLayer = crop_to_overLayer, transparent=transparent,
alpha = alpha, size=max(1,(size+(colm+rowm)*3 - 12)),
ncol=ncol, showNA=showNA, colorNA=colorNA,
theme = theme, legendTitle=legendTitle,
legendDigitsOverride=legendDigitsOverride,
numeric2Cat_list=numeric2Cat_list, catParam = param_i,
underLayer=underLayer,
data=datax,
labelColor=labelColor,
labelSize=labelSize,
labelAlpha=labelAlpha,
labelFill=labelFill,
labelBorderSize=labelBorderSize,
legendBreaksn=legendBreaksn,
legendDigits = legendDigits,
palette = palette,
width=width*max(1,colm/1),
height=height*max(1,rowm/1),
pdfpng = pdfpng, legendSingleColor = legendSingleColor, legendSingleValue = legendSingleValue,
labels=labels, labelRepel=labelRepel, underLayerLabels=underLayerLabels, overLayerLabels=overLayerLabels,
legendBreaks = legendBreaksx,
fillColumn = "value",
col = multiFacetColsx,
row = multiFacetRowsx,
title=titlex ,
fileName = paste("map_",param_i,"_",x_i,"_",fileNameTag,"_DiffAbs",nameAppend,sep=""),
folder = paste(folder,"/",param_if,"/byYear",sep = "")) ->
mapsReturn[[return_i]];
names(mapsReturn)[return_i] <- paste("map_",param_i,"_",x_i,"_",fileNameTag,"_DiffAbs",nameAppend,sep="");
return_i = return_i + 1
}
} # Close years x_i loop
# Animations
if(animate==T){
animName<-paste("anim_",param_i,"_",fileNameTag,"_DiffAbs",nameAppend,".gif",sep="")
animFiles <- list.files(path = paste(folder,"/",param_if,"/byYear",sep=""),
pattern = paste(".*",param_i,".*",fileNameTag,"_DiffAbs",nameAppend, ".", pdfpng,sep=""), full.names=T,ignore.case = T, include.dirs = T);
animation <- magick::image_animate(magick::image_join(lapply(animFiles, magick::image_read)),fps=fps)
magick::image_write(animation,paste(folder,"/",param_if,"/",
animName,sep = ""))
rlang::inform(gsub("//","/",paste("animation saved in :",folder,"/",param_if,"/",
animName,sep = "")))
}
}
# Multi-Year-Single Chart
datax<-dataTblx%>%dplyr::filter(param==param_i)
if(nrow(datax)>0){
if(is.null(legendTitleOrig)){legendTitle<-unique(datax$units)}
palette<-as.character(unique(datax$palette)); if(grepl(",",palette)){palette = unlist(stringr::str_split(palette,","))}
scalex<-datax$value
scalex <- scalex[!is.infinite(scalex)]
scalex <- scalex[!is.nan(scalex)]
scalex <- scalex[!is.na(scalex)]
# Choose correct scaleRange
if(T){
scaleRange_i=scaleRangeDiffAbs
if(!is.null(scaleRange_i)){
if(any(param_i %in% unique(scaleRange_i$param))){
if(max(scalex) < (scaleRange_i %>% dplyr::filter(param==param_i))$maxScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$maxScale,
scalex[scalex<(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale])
}
if(min(scalex) > (scaleRange_i %>% dplyr::filter(param==param_i))$minScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$minScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$minScale,
scalex[scalex>(scaleRange_i %>% dplyr::filter(param==param_i))$minScale])
}
}
}
prettyBreaks<-scales::pretty_breaks(n=legendBreaksn)(scalex)
kmeanBreaks<-sort(as.vector((stats::kmeans(scalex,
centers=max(1,min(length(unique(scalex))-1,(legendBreaksn-1)))))$centers[,1]))
if(!min(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(min(scalex),kmeanBreaks))}
if(!max(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(kmeanBreaks,max(scalex)))}
if(!is.null(legendFixedBreaks)){
if(min(scalex) < min(legendFixedBreaks)){
legendFixedBreaks <- sort(c(min(scalex),legendFixedBreaks))}
if(max(scalex) > max(legendFixedBreaks)){
legendFixedBreaks <- sort(c(legendFixedBreaks,max(scalex)))};legendFixedBreaks
}
if((max(range(scalex))-min(range(scalex)))<1E-10 &
(max(range(scalex))-min(range(scalex)))>-1E-10){scaleRangex=min(scalex)}else{
scaleRangex=range(scalex)
}
if(abs(min(scaleRangex,na.rm = T))==abs(max(scaleRangex,na.rm = T))){scaleRangex=abs(min(scaleRangex,na.rm = T))}
if(mean(scaleRangex,na.rm = T)<0.01 & mean(scaleRangex,na.rm = T)>(-0.01)){legendDigits<-5}else{
if(mean(scaleRangex,na.rm = T)<0.1 & mean(scaleRangex,na.rm = T)>(-0.1)){legendDigits<-4}else{
if(mean(scaleRangex,na.rm = T)<1 & mean(scaleRangex,na.rm = T)>(-1)){legendDigits<-3}else{
if(mean(scaleRangex,na.rm = T)<10 & mean(scaleRangex,na.rm = T)>(-10)){legendDigits<-2}else{legendDigits<-1}}}}
}
# Set Facets
if(length(unique(datax$x))>1){
multiFacetColsx <- "x"
colm <- length(unique(datax$x))
if((length(unique(datax$scenario))>1) & (length(unique(datax$class))>1)){
multiFacetRowsx <- "x"
rowm <- length(unique(datax$x))
multiFacetColsx <- c("scenario","class")
colm <- length(unique(datax$scenario))*length(unique(datax$class))
}
if((length(unique(datax$scenario))>1) & (!length(unique(datax$class))>1)){
multiFacetRowsx <- c("scenario")
rowm <- length(unique(datax$scenario))
}
if((!length(unique(datax$scenario))>1) & (length(unique(datax$class))>1)){
multiFacetRowsx <- "x"
rowm <- length(unique(datax$x))
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
}
if((!length(unique(datax$scenario))>1) & (!length(unique(datax$class))>1)){
multiFacetRowsx <- NULL
rowm <- 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}
}else{
if(length(unique(datax$scenario))>1){
multiFacetColsx <- "scenario"
colm <- length(unique(datax$scenario))
if((length(unique(datax$class))>1)){
multiFacetRowsx <- "scenario"
rowm <- length(unique(datax$scenario))
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
}else{
multiFacetRowsx <- NULL
rowm <- 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}
}else{
if((length(unique(datax$class))>1)){
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
multiFacetRowsx <- NULL
rowm <- 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}else{
if(forceFacets | length(scenDiff)==1){
multiFacetColsx <- "scenario"
} else {
multiFacetColsx <- NULL
}
multiFacetRowsx <- NULL
colm <- 1
rowm <- 1
}
}
}
# Add facet or Rows if selected
if(!is.null(col)){
if(!is.null(multiFacetColsx)){
multiFacetColsx <- c(multiFacetColsx,col)
colm <- colm + length(col)
} else { multiFacetColsx <- col; colm <- length(col)}
}
if(!is.null(row)){
if(!is.null(multiFacetRowsx)){
multiFacetRowsx <- c(multiFacetRowsx,row)
rowm <- rowm + length(row)
} else { multiFacetRowsx <- row; rowm <- length(row)}
}
# Check for Duplicates
if(duplicated(datax %>%
dplyr::select(subRegion,region,lat,lon,x,dplyr::all_of(multiFacetRowsx),dplyr::all_of(multiFacetColsx))) %>%
any()){stop("input data has multiple values. Please check your data.")}
# Set title
if(is.null(title)){
if(param_i != "param"){
if(length(scenDiff)==1){
titlex <- paste(param_i," ",scenDiff," diffAbs ", scenRef,sep="")
}else{
titlex <- paste(param_i,sep="")
}
} else {
if(length(scenDiff)==1){
titlex <- paste(scenDiff," diffAbs ", scenRef,sep="")
}else{
titlex <- NULL
}
}
} else if(title == F){
titlex <- NULL
} else {
titlex <- title
}
# Assign variables based on legend type choice
if(any(grepl("all|kmean",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))){
fileNameTag <- "KMEANS"
legendBreaksx <- kmeanBreaks
} else if(any(grepl("all|continuous",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "CONTINUOUS"
legendBreaksx <- prettyBreaks
} else if(any(grepl("all|pretty",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "PRETTY"
legendBreaksx <- prettyBreaks
} else if(!is.null(legendFixedBreaks)){
fileNameTag <- "FIXED"
legendBreaksx <- legendFixedBreaks
}
rmap::map_plot(crs=crs, underLayerLabelCol = underLayerLabelCol, overLayerLabelCol = overLayerLabelCol, labelCol=labelCol, region=region,color=color, lwd=lwd, legendType=legendType, save=save, show=show, shape = shapex, overLayer=overLayer, overLayerColor=overLayerColor,
overLayerFill = overLayerFill, overLayerLwd = overLayerLwd,
overLayerAlpha = overLayerAlpha, underLayerColor=underLayerColor,
underLayerFill = underLayerFill, underLayerLwd = underLayerLwd,
underLayerAlpha = underLayerAlpha, background=background, zoom=zoom,
zoomx = zoomx, zoomy=zoomy, asp=asp, legendShow=legendShow,
crop = crop, crop_to_underLayer = crop_to_underLayer, crop_to_overLayer = crop_to_overLayer, transparent=transparent,
alpha = alpha, size=max(1,(size+(colm+rowm)*3 - 12)), ncol=ncol,
showNA=showNA, colorNA=colorNA,
labelColor=labelColor,
labelSize=labelSize,
labelAlpha=labelAlpha,
labelFill=labelFill,
labelBorderSize=labelBorderSize,
theme = theme, legendTitle=legendTitle,
legendDigitsOverride=legendDigitsOverride,
numeric2Cat_list=numeric2Cat_list, catParam = param_i,
underLayer=underLayer,
data=datax,
legendBreaksn=legendBreaksn,
legendDigits = legendDigits,
palette = palette,
width=width*max(1,colm/1),
height=height*max(1,rowm/1),
pdfpng = pdfpng, legendSingleColor = legendSingleColor, legendSingleValue = legendSingleValue,
labels=labels, labelRepel=labelRepel, underLayerLabels=underLayerLabels, overLayerLabels=overLayerLabels,
legendBreaks = legendBreaksx,
fillColumn = "value",
col = multiFacetColsx,
row = multiFacetRowsx,
title= titlex,
fileName = paste("map_",param_i,"_",fileNameTag,"_DiffAbs",nameAppend,sep=""),
folder = sub("/$","",paste(folder,"/",param_if,sep = ""))) ->
mapsReturn[[return_i]];
names(mapsReturn)[return_i] <- paste("map_",param_i,"_",fileNameTag,"_DiffAbs",nameAppend,sep="");
return_i = return_i + 1
} # if(nrow(datax)>0){
# Mean for all years provided
datax<-dataTblx%>%dplyr::filter(param==param_i)
if(length(unique(datax$x))>1){
if(nrow(datax)>0){
if(is.null(legendTitleOrig)){legendTitle<-unique(datax$units)}
palette<-as.character(unique(datax$palette)); if(grepl(",",palette)){palette = unlist(stringr::str_split(palette,","))}
meanCol = paste("Mean_",min(datax$x),"_to_",max(datax$x),sep="")
colsPresentGroup = c("lon","lat","subRegion","region","scenario","class")
colsPresentGroup = colsPresentGroup[colsPresentGroup %in% names(datax)]
datax<-datax%>%
dplyr::select(lat,lon,subRegion,region,scenario,class,x,value)%>%
dplyr::group_by_at(dplyr::all_of(colsPresentGroup))%>%
dplyr::summarize(!!meanCol:=mean(value))%>%
dplyr::ungroup()
scalex<-datax[[meanCol]];scalex
scalex <- scalex[!is.infinite(scalex)]
scalex <- scalex[!is.nan(scalex)]
scalex <- scalex[!is.na(scalex)]
# Choose correct scaleRange
if(T){
scaleRange_i=scaleRangeDiffAbs
if(!is.null(scaleRange_i)){
if(any(param_i %in% unique(scaleRange_i$param))){
if(max(scalex) < (scaleRange_i %>% dplyr::filter(param==param_i))$maxScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$maxScale,
scalex[scalex<(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale])
}
if(min(scalex) > (scaleRange_i %>% dplyr::filter(param==param_i))$minScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$minScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$minScale,
scalex[scalex>(scaleRange_i %>% dplyr::filter(param==param_i))$minScale])
}
}
}
prettyBreaks<-scales::pretty_breaks(n=legendBreaksn)(scalex)
kmeanBreaks<-sort(as.vector((stats::kmeans(scalex,
centers=max(1,min(length(unique(scalex))-1,(legendBreaksn-1)))))$centers[,1]))
if(!min(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(min(scalex),kmeanBreaks))}
if(!max(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(kmeanBreaks,max(scalex)))}
if(!is.null(legendFixedBreaks)){
if(min(scalex) < min(legendFixedBreaks)){
legendFixedBreaks <- sort(c(min(scalex),legendFixedBreaks))}
if(max(scalex) > max(legendFixedBreaks)){
legendFixedBreaks <- sort(c(legendFixedBreaks,max(scalex)))};legendFixedBreaks
}
if((max(range(scalex))-min(range(scalex)))<1E-10 &
(max(range(scalex))-min(range(scalex)))>-1E-10){scaleRangex=min(scalex)}else{
scaleRangex=range(scalex)
}
if(abs(min(scaleRangex,na.rm = T))==abs(max(scaleRangex,na.rm = T))){scaleRangex=abs(min(scaleRangex,na.rm = T))}
if(mean(scaleRangex,na.rm = T)<0.01 & mean(scaleRangex,na.rm = T)>(-0.01)){legendDigits<-5}else{
if(mean(scaleRangex,na.rm = T)<0.1 & mean(scaleRangex,na.rm = T)>(-0.1)){legendDigits<-4}else{
if(mean(scaleRangex,na.rm = T)<1 & mean(scaleRangex,na.rm = T)>(-1)){legendDigits<-3}else{
if(mean(scaleRangex,na.rm = T)<10 & mean(scaleRangex,na.rm = T)>(-10)){legendDigits<-2}else{legendDigits<-1}}}}
}
# Set Facets
if(length(unique(datax$scenario))>1){
multiFacetColsx <- "scenario"
colm <- length(unique(datax$scenario))
if((length(unique(datax$class))>1)){
multiFacetRowsx <- "scenario"
rowm <- length(unique(datax$scenario))
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
}else{
multiFacetRowsx <- NULL
rowm <- 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}
}else{
if((length(unique(datax$class))>1)){
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
multiFacetRowsx <- NULL
rowm <- 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}else{
if(forceFacets){
multiFacetColsx <- "scenario"
} else {
multiFacetColsx <- NULL
}
multiFacetRowsx <- NULL
colm <- 1
rowm <- 1
}
}
# Add facet or Rows if selected
if(!is.null(col)){
if(!is.null(multiFacetColsx)){
multiFacetColsx <- c(multiFacetColsx,col)
colm <- colm + length(col)
} else { multiFacetColsx <- col; colm <- length(col)}
}
if(!is.null(row)){
if(!is.null(multiFacetRowsx)){
multiFacetRowsx <- c(multiFacetRowsx,row)
rowm <- rowm + length(row)
} else { multiFacetRowsx <- row; rowm <- length(row)}
}
# Check for Duplicates
if(duplicated(datax %>%
dplyr::select(lat,lon,subRegion,region,x,dplyr::all_of(multiFacetRowsx),dplyr::all_of(multiFacetColsx))) %>%
any()){stop("input data has multiple values. Please check your data.")}
if(length(scenDiff)==1){
titlex <- paste(param_i," ",scenDiff," diffAbs ", scenRef,sep="")
}else{
titlex <- paste(param_i,sep="")
}
# Set title
if(is.null(title)){
if(param_i == "param"){
if(length(scenDiff)==1){
titlex <- paste(meanCol," ",scenDiff," diffAbs ", scenRef,sep="")
}else{
titlex <- paste(meanCol," diffAbs",sep="")
}
} else {
if(length(scenDiff)==1){
titlex <- paste(param_i," ",meanCol," ",scenDiff," diffAbs ", scenRef,sep="")
}else{
titlex <- paste(param_i," ",meanCol," diffAbs",sep="")
}
}
} else if(title == F){
titlex <- NULL
} else {
titlex <- title
}
# Assign variables based on legend type choice
if(any(grepl("all|kmean",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))){
fileNameTag <- "KMEANS"
legendBreaksx <- kmeanBreaks
} else if(any(grepl("all|continuous",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "CONTINUOUS"
legendBreaksx <- prettyBreaks
} else if(any(grepl("all|pretty",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "PRETTY"
legendBreaksx <- prettyBreaks
} else if(!is.null(legendFixedBreaks)){
fileNameTag <- "FIXED"
legendBreaksx <- legendFixedBreaks
}
rmap::map_plot(crs=crs, underLayerLabelCol = underLayerLabelCol, overLayerLabelCol = overLayerLabelCol, labelCol=labelCol, region=region,color=color, lwd=lwd, legendType=legendType, save=save, show=show, shape = shapex, overLayer=overLayer, overLayerColor=overLayerColor,
overLayerFill = overLayerFill, overLayerLwd = overLayerLwd,
overLayerAlpha = overLayerAlpha, underLayerColor=underLayerColor,
underLayerFill = underLayerFill, underLayerLwd = underLayerLwd,
underLayerAlpha = underLayerAlpha, background=background,
zoom=zoom, zoomx = zoomx, zoomy=zoomy, asp=asp, legendShow=legendShow,
crop = crop, crop_to_underLayer = crop_to_underLayer, crop_to_overLayer = crop_to_overLayer, transparent=transparent,
alpha = alpha, size=max(1,(size+(colm+rowm)*3 - 12)),
ncol=ncol, showNA=showNA, colorNA=colorNA,
labelColor=labelColor,
labelSize=labelSize,
labelAlpha=labelAlpha,
labelFill=labelFill,
labelBorderSize=labelBorderSize,
theme = theme, legendTitle=legendTitle,
legendDigitsOverride=legendDigitsOverride,
numeric2Cat_list=numeric2Cat_list, catParam = param_i,
underLayer=underLayer,
data=datax,
legendBreaksn=legendBreaksn,
legendDigits = legendDigits,
palette = palette,
width=width*max(1,colm/1),
height=height*max(1,rowm/1),
pdfpng = pdfpng, legendSingleColor = legendSingleColor, legendSingleValue = legendSingleValue,
labels=labels, labelRepel=labelRepel, underLayerLabels=underLayerLabels, overLayerLabels=overLayerLabels,
legendBreaks = legendBreaksx,
fillColumn = meanCol,
col = multiFacetColsx,
row = multiFacetRowsx,
title = titlex,
fileName = paste("map_",param_i,"_MEAN_",fileNameTag,"_DiffAbs",nameAppend,sep=""),
folder = sub("/$","",paste(folder,"/",param_if,sep = ""))) ->
mapsReturn[[return_i]];
names(mapsReturn)[return_i] <- paste("map_",param_i,"_MEAN_",fileNameTag,"_DiffAbs",nameAppend,sep="");
return_i = return_i + 1
} # if(nrow(datax)>0){
}# If multiple years
} # if nrow of dataTblx dplyr::filtered for Diff scenarios
}# Close if nrow dataTbl < 0
} # Close Diff Abs
# DiffPrcnt Scenarios
if(T){
if(length(unique(dataTblOrig$param))==1){param_if=NULL}else{param_if=param_i}
if(nrow(dataTblOrig%>%dplyr::filter(param==param_i))>0){
dataTblx <- dataTblOrig%>%dplyr::filter(param==param_i,
scenario %in% dataTbl_scenariosOrig[grepl("_DiffPrcnt",dataTbl_scenariosOrig)])
if(nrow(dataTblx)>0){
#.................-
# Create data Table Folders If Needed
#.................-
if(save){
if(!dir.exists(paste(folder,"/",sep = ""))){
dir.create(paste(folder,"/",sep = ""))}
if(!dir.exists(paste(folder,"/",param_if,sep = ""))){
dir.create(paste(folder,"/",param_if,sep = ""))}
if(!dir.exists(paste(folder,"/",param_if,sep = ""))){
dir.create(paste(folder, "/",param_if,sep = ""))}
if(length(unique(dataTblx$x))>1){
if(!dir.exists(paste(folder,"/",param_if,"/byYear",sep = ""))){
dir.create(paste(folder, "/",param_if,"/byYear",sep = ""))}
}
} # Create data table folder if needed
#.................--
# Save Map related Data Table
#.................--
if(save){
if(nrow(dataTblx %>% dplyr::filter(param==param_i))>0){
data.table::fwrite(dataTblx %>% dplyr::filter(param==param_i)%>%
dplyr::select(scenario,lat,lon,subRegion,region,param,class,x,value,units),
paste(folder,"/",param_if,"/map_",param_i,nameAppend,".csv",sep = ""))
rlang::inform(paste("Map data table written to ",folder,"/",param_if,"/map_",param_i,nameAppend,".csv",sep = ""))
}
}
#.............................
# By Year
#.............................
# Set Legends
if(T){
scalex<-dataTblx$value
scalex <- scalex[!is.infinite(scalex)]
scalex <- scalex[!is.nan(scalex)]
scalex <- scalex[!is.na(scalex)]
# Choose correct scaleRange
scaleRange_i=scaleRangeDiffPrcnt
if(!is.null(scaleRange_i)){
if(any(param_i %in% unique(scaleRange_i$param))){
if(max(scalex) < (scaleRange_i %>% dplyr::filter(param==param_i))$maxScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$maxScale,
scalex[scalex<(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale])
}
if(min(scalex) > (scaleRange_i %>% dplyr::filter(param==param_i))$minScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$minScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$minScale,
scalex[scalex>(scaleRange_i %>% dplyr::filter(param==param_i))$minScale])
}
}
}
prettyBreaks<-scales::pretty_breaks(n=legendBreaksn)(scalex); prettyBreaks
kmeanBreaks<-sort(as.vector((stats::kmeans(scalex,
centers=max(1,min(length(unique(scalex))-1,(legendBreaksn-1)))))$centers[,1]));kmeanBreaks
if(!min(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(min(scalex),kmeanBreaks))}
if(!max(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(kmeanBreaks,max(scalex)))};kmeanBreaks
if(!is.null(legendFixedBreaks)){
if(min(scalex) < min(legendFixedBreaks)){
legendFixedBreaks <- sort(c(min(scalex),legendFixedBreaks))}
if(max(scalex) > max(legendFixedBreaks)){
legendFixedBreaks <- sort(c(legendFixedBreaks,max(scalex)))};legendFixedBreaks
}
if((max(range(scalex))-min(range(scalex)))<1E-10 &
(max(range(scalex))-min(range(scalex)))>-1E-10){scaleRangex=min(scalex)}else{
scaleRangex=range(scalex)
}
if(abs(min(scaleRangex,na.rm = T))==abs(max(scaleRangex,na.rm = T))){scaleRangex=abs(min(scaleRangex,na.rm = T))}
if(mean(scaleRangex,na.rm = T)<0.01 & mean(scaleRangex,na.rm = T)>(-0.01)){legendDigits<-5}else{
if(mean(scaleRangex,na.rm = T)<0.1 & mean(scaleRangex,na.rm = T)>(-0.1)){legendDigits<-4}else{
if(mean(scaleRangex,na.rm = T)<1 & mean(scaleRangex,na.rm = T)>(-1)){legendDigits<-3}else{
if(mean(scaleRangex,na.rm = T)<10 & mean(scaleRangex,na.rm = T)>(-10)){legendDigits<-2}else{legendDigits<-1}}}}
}
# By Year
if(length(unique(dataTblx$x))>1){
for (x_i in unique(dataTblx$x)){
datax<-dataTblx%>%dplyr::filter(x==x_i)
if(nrow(datax)>0){
if(is.null(legendTitleOrig)){legendTitle<-unique(datax$units)}
palette<-as.character(unique(datax$palette)); if(grepl(",",palette)){palette = unlist(stringr::str_split(palette,","))}
# Set Facets
if(length(unique(datax$scenario))>1){
multiFacetColsx <- "scenario"
colm <- length(unique(datax$scenario))
if((length(unique(datax$class))>1)){
multiFacetRowsx <- "scenario"
rowm <- length(unique(datax$scenario))
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
}else{
multiFacetRowsx <- NULL
rowm = 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}
}else{
if((length(unique(datax$class))>1)){
multiFacetColsx <- c("class")
multiFacetRowsx <- NULL
colm = length(unique(datax$class))
rowm = 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}else{
if(forceFacets){
multiFacetColsx <- "scenario"
} else {
multiFacetColsx <- NULL
}
multiFacetRowsx <- NULL
colm = 1
rowm = 1
}
}
# Add facet or Rows if selected
if(!is.null(col)){
if(!is.null(multiFacetColsx)){
multiFacetColsx <- c(multiFacetColsx,col)
colm <- colm + length(col)
} else { multiFacetColsx <- col; colm <- length(col)}
}
if(!is.null(row)){
if(!is.null(multiFacetRowsx)){
multiFacetRowsx <- c(multiFacetRowsx,row)
rowm <- rowm + length(row)
} else { multiFacetRowsx <- row; rowm <- length(row)}
}
# Check for Duplicates
if(duplicated(datax %>%
dplyr::select(lat,lon,subRegion,region,x,dplyr::all_of(multiFacetRowsx),dplyr::all_of(multiFacetColsx))) %>%
any()){stop("input data has multiple values. Please check your data.")}
# Set title
if(is.null(title)){
if(param_i == "param"){
if(length(scenDiff)==1){
titlex <- paste(x_i," ",scenDiff," diffPrcnt ", scenRef,sep="")
}else{
titlex <- paste(x_i,sep="")
}
} else {
if(length(scenDiff)==1){
titlex <- paste(param_i," ",x_i," ",scenDiff," diffPrcnt ", scenRef,sep="")
}else{
titlex <- paste(param_i," ",x_i,sep="")
}
}
} else if(title == F){
titlex <- NULL
} else {
titlex <- title
}
# Assign variables based on legend type choice
if(any(grepl("all|kmean",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))){
fileNameTag <- "KMEANS"
legendBreaksx <- kmeanBreaks
} else if(any(grepl("all|continuous",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "CONTINUOUS"
legendBreaksx <- prettyBreaks
} else if(any(grepl("all|pretty",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "PRETTY"
legendBreaksx <- prettyBreaks
} else if(!is.null(legendFixedBreaks)){
fileNameTag <- "FIXED"
legendBreaksx <- legendFixedBreaks
}
rmap::map_plot(crs=crs, underLayerLabelCol = underLayerLabelCol, overLayerLabelCol = overLayerLabelCol, labelCol=labelCol, region=region,color=color, lwd=lwd, legendType=legendType, save=save, show=show, shape = shapex, overLayer=overLayer, overLayerColor=overLayerColor,
overLayerFill = overLayerFill, overLayerLwd = overLayerLwd,
overLayerAlpha = overLayerAlpha, underLayerColor=underLayerColor,
underLayerFill = underLayerFill, underLayerLwd = underLayerLwd,
underLayerAlpha = underLayerAlpha, background=background,
zoom=zoom, zoomx = zoomx, zoomy=zoomy, asp=asp, legendShow=legendShow,
crop = crop, crop_to_underLayer = crop_to_underLayer, crop_to_overLayer = crop_to_overLayer, transparent=transparent,
alpha = alpha, size=max(1,(size+(colm+rowm)*3 - 12)),
ncol=ncol, showNA=showNA, colorNA=colorNA,
theme = theme, legendTitle=legendTitle,
legendDigitsOverride=legendDigitsOverride,
numeric2Cat_list=numeric2Cat_list, catParam = param_i,
underLayer=underLayer,
data=datax,
labelColor=labelColor,
labelSize=labelSize,
labelAlpha=labelAlpha,
labelFill=labelFill,
labelBorderSize=labelBorderSize,
legendBreaksn=legendBreaksn,
legendDigits = legendDigits,
palette = palette,
width=width*max(1,colm/1),
height=height*max(1,rowm/1),
pdfpng = pdfpng, legendSingleColor = legendSingleColor, legendSingleValue = legendSingleValue,
labels=labels, labelRepel=labelRepel, underLayerLabels=underLayerLabels, overLayerLabels=overLayerLabels,
legendBreaks = legendBreaksx,
fillColumn = "value",
col = multiFacetColsx,
row = multiFacetRowsx,
title=titlex ,
fileName = paste("map_",param_i,"_",x_i,"_",fileNameTag,"_DiffPrcnt",nameAppend,sep=""),
folder = paste(folder,"/",param_if,"/byYear",sep = "")) ->
mapsReturn[[return_i]];
names(mapsReturn)[return_i] <- paste("map_",param_i,"_",x_i,"_",fileNameTag,"_DiffPrcnt",nameAppend,sep="");
return_i = return_i + 1
}
} # Close years x_i loop
# Animations
if(animate==T){
animName<-paste("anim_",param_i,"_",fileNameTag,"_DiffPrcnt",nameAppend,".gif",sep="")
animFiles <- list.files(path = paste(folder,"/",param_if,"/byYear",sep=""),
pattern = paste(".*",param_i,".*",fileNameTag,"_DiffPrcnt",nameAppend, ".", pdfpng,sep=""), full.names=T,ignore.case = T, include.dirs = T);
animation <- magick::image_animate(magick::image_join(lapply(animFiles, magick::image_read)),fps=fps)
magick::image_write(animation,paste(folder,"/",param_if,"/",
animName,sep = ""))
rlang::inform(gsub("//","/",paste("animation saved in :",folder,"/",param_if,"/",
animName,sep = "")))
}
}
# Multi-Year-Single Chart
datax<-dataTblx%>%dplyr::filter(param==param_i)
if(nrow(datax)>0){
if(is.null(legendTitleOrig)){legendTitle<-unique(datax$units)}
palette<-as.character(unique(datax$palette)); if(grepl(",",palette)){palette = unlist(stringr::str_split(palette,","))}
scalex<-datax$value
scalex <- scalex[!is.infinite(scalex)]
scalex <- scalex[!is.nan(scalex)]
scalex <- scalex[!is.na(scalex)]
# Choose correct scaleRange
if(T){
scaleRange_i=scaleRangeDiffPrcnt
if(!is.null(scaleRange_i)){
if(any(param_i %in% unique(scaleRange_i$param))){
if(max(scalex) < (scaleRange_i %>% dplyr::filter(param==param_i))$maxScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$maxScale,
scalex[scalex<(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale])
}
if(min(scalex) > (scaleRange_i %>% dplyr::filter(param==param_i))$minScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$minScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$minScale,
scalex[scalex>(scaleRange_i %>% dplyr::filter(param==param_i))$minScale])
}
}
}
prettyBreaks<-scales::pretty_breaks(n=legendBreaksn)(scalex)
kmeanBreaks<-sort(as.vector((stats::kmeans(scalex,
centers=max(1,min(length(unique(scalex))-1,(legendBreaksn-1)))))$centers[,1]))
if(!min(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(min(scalex),kmeanBreaks))}
if(!max(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(kmeanBreaks,max(scalex)))}
if(!is.null(legendFixedBreaks)){
if(min(scalex) < min(legendFixedBreaks)){
legendFixedBreaks <- sort(c(min(scalex),legendFixedBreaks))}
if(max(scalex) > max(legendFixedBreaks)){
legendFixedBreaks <- sort(c(legendFixedBreaks,max(scalex)))};legendFixedBreaks
}
if((max(range(scalex))-min(range(scalex)))<1E-10 &
(max(range(scalex))-min(range(scalex)))>-1E-10){scaleRangex=min(scalex)}else{
scaleRangex=range(scalex)
}
if(abs(min(scaleRangex,na.rm = T))==abs(max(scaleRangex,na.rm = T))){scaleRangex=abs(min(scaleRangex,na.rm = T))}
if(mean(scaleRangex,na.rm = T)<0.01 & mean(scaleRangex,na.rm = T)>(-0.01)){legendDigits<-5}else{
if(mean(scaleRangex,na.rm = T)<0.1 & mean(scaleRangex,na.rm = T)>(-0.1)){legendDigits<-4}else{
if(mean(scaleRangex,na.rm = T)<1 & mean(scaleRangex,na.rm = T)>(-1)){legendDigits<-3}else{
if(mean(scaleRangex,na.rm = T)<10 & mean(scaleRangex,na.rm = T)>(-10)){legendDigits<-2}else{legendDigits<-1}}}}
}
# Set Facets
if(length(unique(datax$x))>1){
multiFacetColsx <- "x"
colm <- length(unique(datax$x))
if((length(unique(datax$scenario))>1) & (length(unique(datax$class))>1)){
multiFacetRowsx <- "x"
rowm <- length(unique(datax$x))
multiFacetColsx <- c("scenario","class")
colm <- length(unique(datax$scenario))*length(unique(datax$class))
}
if((length(unique(datax$scenario))>1) & (!length(unique(datax$class))>1)){
multiFacetRowsx <- c("scenario")
rowm <- length(unique(datax$scenario))
}
if((!length(unique(datax$scenario))>1) & (length(unique(datax$class))>1)){
multiFacetRowsx <- "x"
rowm <- length(unique(datax$x))
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
}
if((!length(unique(datax$scenario))>1) & (!length(unique(datax$class))>1)){
multiFacetRowsx <- NULL
rowm <- 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}
}else{
if(length(unique(datax$scenario))>1){
multiFacetColsx <- "scenario"
colm <- length(unique(datax$scenario))
if((length(unique(datax$class))>1)){
multiFacetRowsx <- "scenario"
rowm <- length(unique(datax$scenario))
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
}else{
multiFacetRowsx <- NULL
rowm <- 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}
}else{
if((length(unique(datax$class))>1)){
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
multiFacetRowsx <- NULL
rowm <- 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}else{
if(forceFacets | length(scenDiff)==1){
multiFacetColsx <- "scenario"
} else {
multiFacetColsx <- NULL
}
multiFacetRowsx <- NULL
colm <- 1
rowm <- 1
}
}
}
# Add facet or Rows if selected
if(!is.null(col)){
if(!is.null(multiFacetColsx)){
multiFacetColsx <- c(multiFacetColsx,col)
colm <- colm + length(col)
} else { multiFacetColsx <- col; colm <- length(col)}
}
if(!is.null(row)){
if(!is.null(multiFacetRowsx)){
multiFacetRowsx <- c(multiFacetRowsx,row)
rowm <- rowm + length(row)
} else { multiFacetRowsx <- row; rowm <- length(row)}
}
# Check for Duplicates
if(duplicated(datax %>%
dplyr::select(subRegion,region,lat,lon,x,dplyr::all_of(multiFacetRowsx),dplyr::all_of(multiFacetColsx))) %>%
any()){stop("input data has multiple values. Please check your data.")}
# Set title
if(is.null(title)){
if(param_i != "param"){
if(length(scenDiff)==1){
titlex <- paste(param_i," ",scenDiff," diffPrcnt ", scenRef,sep="")
}else{
titlex <- paste(param_i,sep="")
}
} else {
if(length(scenDiff)==1){
titlex <- paste(scenDiff," diffPrcnt ", scenRef,sep="")
}else{
titlex <- NULL
}
}
} else if(title == F){
titlex <- NULL
} else {
titlex <- title
}
# Assign variables based on legend type choice
if(any(grepl("all|kmean",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))){
fileNameTag <- "KMEANS"
legendBreaksx <- kmeanBreaks
} else if(any(grepl("all|continuous",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "CONTINUOUS"
legendBreaksx <- prettyBreaks
} else if(any(grepl("all|pretty",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "PRETTY"
legendBreaksx <- prettyBreaks
} else if(!is.null(legendFixedBreaks)){
fileNameTag <- "FIXED"
legendBreaksx <- legendFixedBreaks
}
rmap::map_plot(crs=crs, underLayerLabelCol = underLayerLabelCol, overLayerLabelCol = overLayerLabelCol, labelCol=labelCol, region=region,color=color, lwd=lwd, legendType=legendType, save=save, show=show, shape = shapex, overLayer=overLayer, overLayerColor=overLayerColor,
overLayerFill = overLayerFill, overLayerLwd = overLayerLwd,
overLayerAlpha = overLayerAlpha, underLayerColor=underLayerColor,
underLayerFill = underLayerFill, underLayerLwd = underLayerLwd,
underLayerAlpha = underLayerAlpha, background=background, zoom=zoom,
zoomx = zoomx, zoomy=zoomy, asp=asp, legendShow=legendShow,
crop = crop, crop_to_underLayer = crop_to_underLayer, crop_to_overLayer = crop_to_overLayer, transparent=transparent,
alpha = alpha, size=max(1,(size+(colm+rowm)*3 - 12)), ncol=ncol,
showNA=showNA, colorNA=colorNA,
labelColor=labelColor,
labelSize=labelSize,
labelAlpha=labelAlpha,
labelFill=labelFill,
labelBorderSize=labelBorderSize,
theme = theme, legendTitle=legendTitle,
legendDigitsOverride=legendDigitsOverride,
numeric2Cat_list=numeric2Cat_list, catParam = param_i,
underLayer=underLayer,
data=datax,
legendBreaksn=legendBreaksn,
legendDigits = legendDigits,
palette = palette,
width=width*max(1,colm/1),
height=height*max(1,rowm/1),
pdfpng = pdfpng, legendSingleColor = legendSingleColor, legendSingleValue = legendSingleValue,
labels=labels, labelRepel=labelRepel, underLayerLabels=underLayerLabels, overLayerLabels=overLayerLabels,
legendBreaks = legendBreaksx,
fillColumn = "value",
col = multiFacetColsx,
row = multiFacetRowsx,
title= titlex,
fileName = paste("map_",param_i,"_",fileNameTag,"_DiffPrcnt",nameAppend,sep=""),
folder = sub("/$","",paste(folder,"/",param_if,sep = ""))) ->
mapsReturn[[return_i]];
names(mapsReturn)[return_i] <- paste("map_",param_i,"_",fileNameTag,"_DiffPrcnt",nameAppend,sep="");
return_i = return_i + 1
# save=save
# overLayer=overLayer
# overLayerColor=overLayerColor
# overLayerFill = overLayerFill
# overLayerLwd = overLayerLwd
# overLayerAlpha = overLayerAlpha
# underLayerColor = underLayerColor
# underLayerFill = underLayerFill
# underLayerLwd = underLayerLwd
# underLayerAlpha = underLayerAlpha
# background=background
# zoom=zoom
# zoomx = zoomx
# zoomy=zoomy
# alpha = alpha
# size=max(1,(size+(colm+rowm)*3 - 12))
# ncol=ncol
# showNA=showNA
# colorNA=colorNA
# theme = theme
# legendTitle=legendTitle
# legendDigitsOverride=legendDigitsOverride
# numeric2Cat_list=numeric2Cat_list
# underLayer=underLayer
# data=datax
# legendBreaksn=legendBreaksn
# legendDigits = legendDigits
# palette = palette
# width=width*max(1,colm/1)
# height=height*max(1,rowm/1)
# pdfpng = pdfpng
# legendSingleColor = legendSingleColor
# legendSingleValue = legendSingleValue
# labels=labels
# legendBreaks = kmeanBreaks
# fillColumn = "value"
# col = multiFacetColsx
# row = multiFacetRowsx
# title=paste(param_i,sep="")
# fileName = paste("map_",param_i,"_",fileNameTag,nameAppend,sep="")
# folder = sub("/$","",paste(folder,"/",param_if,sep = ""))
} # if(nrow(datax)>0){
# Mean for all years provided
datax<-dataTblx%>%dplyr::filter(param==param_i)
if(length(unique(datax$x))>1){
if(nrow(datax)>0){
if(is.null(legendTitleOrig)){legendTitle<-unique(datax$units)}
palette<-as.character(unique(datax$palette)); if(grepl(",",palette)){palette = unlist(stringr::str_split(palette,","))}
meanCol = paste("Mean_",min(datax$x),"_to_",max(datax$x),sep="")
colsPresentGroup = c("lon","lat","subRegion","region","scenario","class")
colsPresentGroup = colsPresentGroup[colsPresentGroup %in% names(datax)]
datax<-datax%>%
dplyr::select(lat,lon,subRegion,region,scenario,class,x,value)%>%
dplyr::group_by_at(dplyr::all_of(colsPresentGroup))%>%
dplyr::summarize(!!meanCol:=mean(value))%>%
dplyr::ungroup()
scalex<-datax[[meanCol]];scalex
scalex <- scalex[!is.infinite(scalex)]
scalex <- scalex[!is.nan(scalex)]
scalex <- scalex[!is.na(scalex)]
# Choose correct scaleRange
if(T){
scaleRange_i=scaleRangeDiffPrcnt
if(!is.null(scaleRange_i)){
if(any(param_i %in% unique(scaleRange_i$param))){
if(max(scalex) < (scaleRange_i %>% dplyr::filter(param==param_i))$maxScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$maxScale,
scalex[scalex<(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale])
}
if(min(scalex) > (scaleRange_i %>% dplyr::filter(param==param_i))$minScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$minScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$minScale,
scalex[scalex>(scaleRange_i %>% dplyr::filter(param==param_i))$minScale])
}
}
}
prettyBreaks<-scales::pretty_breaks(n=legendBreaksn)(scalex)
kmeanBreaks<-sort(as.vector((stats::kmeans(scalex,
centers=max(1,min(length(unique(scalex))-1,(legendBreaksn-1)))))$centers[,1]))
if(!min(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(min(scalex),kmeanBreaks))}
if(!max(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(kmeanBreaks,max(scalex)))}
if(!is.null(legendFixedBreaks)){
if(min(scalex) < min(legendFixedBreaks)){
legendFixedBreaks <- sort(c(min(scalex),legendFixedBreaks))}
if(max(scalex) > max(legendFixedBreaks)){
legendFixedBreaks <- sort(c(legendFixedBreaks,max(scalex)))};legendFixedBreaks
}
if((max(range(scalex))-min(range(scalex)))<1E-10 &
(max(range(scalex))-min(range(scalex)))>-1E-10){scaleRangex=min(scalex)}else{
scaleRangex=range(scalex)
}
if(abs(min(scaleRangex,na.rm = T))==abs(max(scaleRangex,na.rm = T))){scaleRangex=abs(min(scaleRangex,na.rm = T))}
if(mean(scaleRangex,na.rm = T)<0.01 & mean(scaleRangex,na.rm = T)>(-0.01)){legendDigits<-5}else{
if(mean(scaleRangex,na.rm = T)<0.1 & mean(scaleRangex,na.rm = T)>(-0.1)){legendDigits<-4}else{
if(mean(scaleRangex,na.rm = T)<1 & mean(scaleRangex,na.rm = T)>(-1)){legendDigits<-3}else{
if(mean(scaleRangex,na.rm = T)<10 & mean(scaleRangex,na.rm = T)>(-10)){legendDigits<-2}else{legendDigits<-1}}}}
}
# Set Facets
if(length(unique(datax$scenario))>1){
multiFacetColsx <- "scenario"
colm <- length(unique(datax$scenario))
if((length(unique(datax$class))>1)){
multiFacetRowsx <- "scenario"
rowm <- length(unique(datax$scenario))
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
}else{
multiFacetRowsx <- NULL
rowm <- 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}
}else{
if((length(unique(datax$class))>1)){
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
multiFacetRowsx <- NULL
rowm <- 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}else{
if(forceFacets){
multiFacetColsx <- "scenario"
} else {
multiFacetColsx <- NULL
}
multiFacetRowsx <- NULL
colm <- 1
rowm <- 1
}
}
# Add facet or Rows if selected
if(!is.null(col)){
if(!is.null(multiFacetColsx)){
multiFacetColsx <- c(multiFacetColsx,col)
colm <- colm + length(col)
} else { multiFacetColsx <- col; colm <- length(col)}
}
if(!is.null(row)){
if(!is.null(multiFacetRowsx)){
multiFacetRowsx <- c(multiFacetRowsx,row)
rowm <- rowm + length(row)
} else { multiFacetRowsx <- row; rowm <- length(row)}
}
# Check for Duplicates
if(duplicated(datax %>%
dplyr::select(lat,lon,subRegion,region,x,dplyr::all_of(multiFacetRowsx),dplyr::all_of(multiFacetColsx))) %>%
any()){stop("input data has multiple values. Please check your data.")}
# Set title
if(is.null(title)){
if(param_i == "param"){
if(length(scenDiff)==1){
titlex <- paste(meanCol," diffPrcnt"," ",scenDiff," diffPrcnt ", scenRef,sep="")
}else{
titlex <- paste(meanCol," diffPrcnt",sep="")
}
} else {
if(length(scenDiff)==1){
titlex <- paste(param_i," ",meanCol," diffPrcnt"," ",scenDiff," diffPrcnt ", scenRef,sep="")
}else{
titlex <- paste(param_i," ",meanCol," diffPrcnt",sep="")
}
}
} else if(title == F){
titlex <- NULL
} else {
titlex <- title
}
# Assign variables based on legend type choice
if(any(grepl("all|kmean",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))){
fileNameTag <- "KMEANS"
legendBreaksx <- kmeanBreaks
} else if(any(grepl("all|continuous",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "CONTINUOUS"
legendBreaksx <- prettyBreaks
} else if(any(grepl("all|pretty",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "PRETTY"
legendBreaksx <- prettyBreaks
} else if(!is.null(legendFixedBreaks)){
fileNameTag <- "FIXED"
legendBreaksx <- legendFixedBreaks
}
rmap::map_plot(crs=crs, underLayerLabelCol = underLayerLabelCol, overLayerLabelCol = overLayerLabelCol, labelCol=labelCol, region=region,color=color, lwd=lwd, legendType=legendType, save=save, show=show, shape = shapex, overLayer=overLayer, overLayerColor=overLayerColor,
overLayerFill = overLayerFill, overLayerLwd = overLayerLwd,
overLayerAlpha = overLayerAlpha, underLayerColor=underLayerColor,
underLayerFill = underLayerFill, underLayerLwd = underLayerLwd,
underLayerAlpha = underLayerAlpha, background=background,
zoom=zoom, zoomx = zoomx, zoomy=zoomy, asp=asp, legendShow=legendShow,
crop = crop, crop_to_underLayer = crop_to_underLayer, crop_to_overLayer = crop_to_overLayer, transparent=transparent,
alpha = alpha, size=max(1,(size+(colm+rowm)*3 - 12)),
ncol=ncol, showNA=showNA, colorNA=colorNA,
labelColor=labelColor,
labelSize=labelSize,
labelAlpha=labelAlpha,
labelFill=labelFill,
labelBorderSize=labelBorderSize,
theme = theme, legendTitle=legendTitle,
legendDigitsOverride=legendDigitsOverride,
numeric2Cat_list=numeric2Cat_list, catParam = param_i,
underLayer=underLayer,
data=datax,
legendBreaksn=legendBreaksn,
legendDigits = legendDigits,
palette = palette,
width=width*max(1,colm/1),
height=height*max(1,rowm/1),
pdfpng = pdfpng, legendSingleColor = legendSingleColor, legendSingleValue = legendSingleValue,
labels=labels, labelRepel=labelRepel, underLayerLabels=underLayerLabels, overLayerLabels=overLayerLabels,
legendBreaks = legendBreaksx,
fillColumn = meanCol,
col = multiFacetColsx,
row = multiFacetRowsx,
title = titlex,
fileName = paste("map_",param_i,"_MEAN_",fileNameTag,"_DiffPrcnt",nameAppend,sep=""),
folder = sub("/$","",paste(folder,"/",param_if,sep = ""))) ->
mapsReturn[[return_i]];
names(mapsReturn)[return_i] <- paste("map_",param_i,"_MEAN_",fileNameTag,"_DiffPrcnt",nameAppend,sep="");
return_i = return_i + 1
} # if(nrow(datax)>0){
}# If multiple years
} # if nrow of dataTblx dplyr::filtered for Diff scenarios
}# Close if nrow dataTbl < 0
} # Close Diff Prcnt Scenario
} # Close if scenRef
# if xRef chosen
if(!is.null(xRef)){
# xDiff Abs Scenarios
if(T){
if(length(unique(dataTblOrig$param))==1){param_if=NULL}else{param_if=param_i}
if(nrow(dataTblOrig%>%dplyr::filter(param==param_i))>0){
dataTblx <- dataTblOrig%>%dplyr::filter(param==param_i,
scenario %in% dataTbl_scenariosOrig[grepl("_xDiffAbs",dataTbl_scenariosOrig)])
if(nrow(dataTblx)>0){
#.................-
# Create data Table Folders If Needed
#.................-
if(save){
if(!dir.exists(paste(folder,"/",sep = ""))){
dir.create(paste(folder,"/",sep = ""))}
if(!dir.exists(paste(folder,"/",param_if,sep = ""))){
dir.create(paste(folder,"/",param_if,sep = ""))}
if(!dir.exists(paste(folder,"/",param_if,sep = ""))){
dir.create(paste(folder, "/",param_if,sep = ""))}
if(length(unique(dataTblx$x))>1){
if(!dir.exists(paste(folder,"/",param_if,"/byYear",sep = ""))){
dir.create(paste(folder, "/",param_if,"/byYear",sep = ""))}
}
} # Create data table folder if needed
#.................--
# Save Map related Data Table
#.................--
if(save){
if(nrow(dataTblx %>% dplyr::filter(param==param_i))>0){
data.table::fwrite(dataTblx %>% dplyr::filter(param==param_i)%>%
dplyr::select(scenario,region,lat,lon,subRegion,param,class,x,value,units),
paste(folder,"/",param_if,"/map_",param_i,nameAppend,".csv",sep = ""))
rlang::inform(paste("Map data table written to ",folder,"/",param_if,"/map_",param_i,nameAppend,".csv",sep = ""))
}
}
#.............................
# By Year
#.............................
# Set Legends
if(T){
scalex<-dataTblx$value
scalex <- scalex[!is.infinite(scalex)]
scalex <- scalex[!is.nan(scalex)]
scalex <- scalex[!is.na(scalex)]
# Choose correct scaleRange
scaleRange_i=scaleRangexDiffAbs
if(!is.null(scaleRange_i)){
if(any(param_i %in% unique(scaleRange_i$param))){
if(max(scalex) < (scaleRange_i %>% dplyr::filter(param==param_i))$maxScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$maxScale,
scalex[scalex<(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale])
}
if(min(scalex) > (scaleRange_i %>% dplyr::filter(param==param_i))$minScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$minScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$minScale,
scalex[scalex>(scaleRange_i %>% dplyr::filter(param==param_i))$minScale])
}
}
}
prettyBreaks<-scales::pretty_breaks(n=legendBreaksn)(scalex); prettyBreaks
kmeanBreaks<-sort(as.vector((stats::kmeans(scalex,
centers=max(1,min(length(unique(scalex))-1,(legendBreaksn-1)))))$centers[,1]));kmeanBreaks
if(!min(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(min(scalex),kmeanBreaks))}
if(!max(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(kmeanBreaks,max(scalex)))};kmeanBreaks
if(!is.null(legendFixedBreaks)){
if(min(scalex) < min(legendFixedBreaks)){
legendFixedBreaks <- sort(c(min(scalex),legendFixedBreaks))}
if(max(scalex) > max(legendFixedBreaks)){
legendFixedBreaks <- sort(c(legendFixedBreaks,max(scalex)))};legendFixedBreaks
}
if((max(range(scalex))-min(range(scalex)))<1E-10 &
(max(range(scalex))-min(range(scalex)))>-1E-10){scaleRangex=min(scalex)}else{
scaleRangex=range(scalex)
}
if(abs(min(scaleRangex,na.rm = T))==abs(max(scaleRangex,na.rm = T))){scaleRangex=abs(min(scaleRangex,na.rm = T))}
if(mean(scaleRangex,na.rm = T)<0.01 & mean(scaleRangex,na.rm = T)>(-0.01)){legendDigits<-5}else{
if(mean(scaleRangex,na.rm = T)<0.1 & mean(scaleRangex,na.rm = T)>(-0.1)){legendDigits<-4}else{
if(mean(scaleRangex,na.rm = T)<1 & mean(scaleRangex,na.rm = T)>(-1)){legendDigits<-3}else{
if(mean(scaleRangex,na.rm = T)<10 & mean(scaleRangex,na.rm = T)>(-10)){legendDigits<-2}else{legendDigits<-1}}}}
}
# By Year
if(length(unique(dataTblx$x))>1){
for (x_i in unique(dataTblx$x)){
datax<-dataTblx%>%dplyr::filter(x==x_i)
if(nrow(datax)>0){
if(is.null(legendTitleOrig)){legendTitle<-unique(datax$units)}
palette<-as.character(unique(datax$palette)); if(grepl(",",palette)){palette = unlist(stringr::str_split(palette,","))}
# Set Facets
if(length(unique(datax$scenario))>1){
multiFacetColsx <- "scenario"
colm <- length(unique(datax$scenario))
if((length(unique(datax$class))>1)){
multiFacetRowsx <- "scenario"
rowm <- length(unique(datax$scenario))
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
}else{
multiFacetRowsx <- NULL
rowm = 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}
}else{
if((length(unique(datax$class))>1)){
multiFacetColsx <- c("class")
multiFacetRowsx <- NULL
colm = length(unique(datax$class))
rowm = 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}else{
if(forceFacets){
multiFacetColsx <- "scenario"
} else {
multiFacetColsx <- NULL
}
multiFacetRowsx <- NULL
colm = 1
rowm = 1
}
}
# Add Multi facet Cols or Rows if selected
if(!is.null(col)){
if(!is.null(multiFacetColsx)){
multiFacetColsx <- c(multiFacetColsx,col)
colm <- colm + length(col)
} else { multiFacetColsx <- col; colm <- length(col)}
}
if(!is.null(row)){
if(!is.null(multiFacetRowsx)){
multiFacetRowsx <- c(multiFacetRowsx,row)
rowm <- rowm + length(row)
} else { multiFacetRowsx <- row; rowm <- length(row)}
}
# Check for Duplicates
if(duplicated(datax %>%
dplyr::select(lat,lon,subRegion,region,x,dplyr::all_of(multiFacetRowsx),dplyr::all_of(multiFacetColsx))) %>%
any()){stop("input data has multiple values. Please check your data.")}
# Set title
if(is.null(title)){
if(param_i == "param"){
titlex <- paste(x_i," xDiffAbs ",xRef,sep="")
} else {
titlex <- paste(param_i," - ",x_i," xDiffAbs ",xRef,sep="")
}
} else if(title == F){
titlex <- NULL
} else {
titlex <- title
}
# Assign variables based on legend type choice
if(any(grepl("all|kmean",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))){
fileNameTag <- "KMEANS"
legendBreaksx <- kmeanBreaks
} else if(any(grepl("all|continuous",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "CONTINUOUS"
legendBreaksx <- prettyBreaks
} else if(any(grepl("all|pretty",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "PRETTY"
legendBreaksx <- prettyBreaks
} else if(!is.null(legendFixedBreaks)){
fileNameTag <- "FIXED"
legendBreaksx <- legendFixedBreaks
}
# gsub scenario name for figures
datax <- datax %>%
dplyr::mutate(scenario= gsub("_xDiff.*","",scenario))
rmap::map_plot(crs=crs, underLayerLabelCol = underLayerLabelCol, overLayerLabelCol = overLayerLabelCol, labelCol=labelCol, region=region,color=color, lwd=lwd, legendType=legendType, save=save, show=show, shape = shapex, overLayer=overLayer, overLayerColor=overLayerColor,
overLayerFill = overLayerFill, overLayerLwd = overLayerLwd,
overLayerAlpha = overLayerAlpha, underLayerColor=underLayerColor,
underLayerFill = underLayerFill, underLayerLwd = underLayerLwd,
underLayerAlpha = underLayerAlpha, background=background,
zoom=zoom, zoomx = zoomx, zoomy=zoomy, asp=asp, legendShow=legendShow,
crop = crop, crop_to_underLayer = crop_to_underLayer, crop_to_overLayer = crop_to_overLayer, transparent=transparent,
alpha = alpha, size=max(1,(size+(colm+rowm)*3 - 12)),
ncol=ncol, showNA=showNA, colorNA=colorNA,
theme = theme, legendTitle=legendTitle,
legendDigitsOverride=legendDigitsOverride,
numeric2Cat_list=numeric2Cat_list, catParam = param_i,
underLayer=underLayer,
data=datax,
labelColor=labelColor,
labelSize=labelSize,
labelAlpha=labelAlpha,
labelFill=labelFill,
labelBorderSize=labelBorderSize,
legendBreaksn=legendBreaksn,
legendDigits = legendDigits,
palette = palette,
width=width*max(1,colm/1),
height=height*max(1,rowm/1),
pdfpng = pdfpng, legendSingleColor = legendSingleColor, legendSingleValue = legendSingleValue,
labels=labels, labelRepel=labelRepel, underLayerLabels=underLayerLabels, overLayerLabels=overLayerLabels,
legendBreaks = legendBreaksx,
fillColumn = "value",
col = multiFacetColsx,
row = multiFacetRowsx,
title=titlex ,
fileName = paste("map_",param_i,"_",x_i,"_",fileNameTag,"_xDiffAbs",nameAppend,sep=""),
folder = paste(folder,"/",param_if,"/byYear",sep = "")) ->
mapsReturn[[return_i]];
names(mapsReturn)[return_i] <- paste("map_",param_i,"_",x_i,"_",fileNameTag,"_xDiffAbs",nameAppend,sep="");
return_i = return_i + 1
}
} # Close years x_i loop
# Animations
if(animate==T){
animName<-paste("anim_",param_i,"_",fileNameTag,"_xDiffAbs",nameAppend,".gif",sep="")
animFiles <- list.files(path = paste(folder,"/",param_if,"/byYear",sep=""),
pattern = paste(".*",param_i,".*",fileNameTag,"_xDiffAbs",nameAppend, ".", pdfpng,sep=""), full.names=T,ignore.case = T, include.dirs = T);
animation <- magick::image_animate(magick::image_join(lapply(animFiles, magick::image_read)),fps=fps)
magick::image_write(animation,paste(folder,"/",param_if,"/",
animName,sep = ""))
rlang::inform(gsub("//","/",paste("animation saved in :",folder,"/",param_if,"/",
animName,sep = "")))
}
}
# Multi-Year-Single Chart
datax<-dataTblx%>%dplyr::filter(param==param_i)
if(nrow(datax)>0){
if(is.null(legendTitleOrig)){legendTitle<-unique(datax$units)}
palette<-as.character(unique(datax$palette)); if(grepl(",",palette)){palette = unlist(stringr::str_split(palette,","))}
scalex<-datax$value
scalex <- scalex[!is.infinite(scalex)]
scalex <- scalex[!is.nan(scalex)]
scalex <- scalex[!is.na(scalex)]
# Choose correct scaleRange
if(T){
scaleRange_i=scaleRangexDiffAbs
if(!is.null(scaleRange_i)){
if(any(param_i %in% unique(scaleRange_i$param))){
if(max(scalex) < (scaleRange_i %>% dplyr::filter(param==param_i))$maxScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$maxScale,
scalex[scalex<(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale])
}
if(min(scalex) > (scaleRange_i %>% dplyr::filter(param==param_i))$minScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$minScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$minScale,
scalex[scalex>(scaleRange_i %>% dplyr::filter(param==param_i))$minScale])
}
}
}
prettyBreaks<-scales::pretty_breaks(n=legendBreaksn)(scalex)
kmeanBreaks<-sort(as.vector((stats::kmeans(scalex,
centers=max(1,min(length(unique(scalex))-1,(legendBreaksn-1)))))$centers[,1]))
if(!min(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(min(scalex),kmeanBreaks))}
if(!max(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(kmeanBreaks,max(scalex)))}
if(!is.null(legendFixedBreaks)){
if(min(scalex) < min(legendFixedBreaks)){
legendFixedBreaks <- sort(c(min(scalex),legendFixedBreaks))}
if(max(scalex) > max(legendFixedBreaks)){
legendFixedBreaks <- sort(c(legendFixedBreaks,max(scalex)))};legendFixedBreaks
}
if((max(range(scalex))-min(range(scalex)))<1E-10 &
(max(range(scalex))-min(range(scalex)))>-1E-10){scaleRangex=min(scalex)}else{
scaleRangex=range(scalex)
}
if(abs(min(scaleRangex,na.rm = T))==abs(max(scaleRangex,na.rm = T))){scaleRangex=abs(min(scaleRangex,na.rm = T))}
if(mean(scaleRangex,na.rm = T)<0.01 & mean(scaleRangex,na.rm = T)>(-0.01)){legendDigits<-5}else{
if(mean(scaleRangex,na.rm = T)<0.1 & mean(scaleRangex,na.rm = T)>(-0.1)){legendDigits<-4}else{
if(mean(scaleRangex,na.rm = T)<1 & mean(scaleRangex,na.rm = T)>(-1)){legendDigits<-3}else{
if(mean(scaleRangex,na.rm = T)<10 & mean(scaleRangex,na.rm = T)>(-10)){legendDigits<-2}else{legendDigits<-1}}}}
}
# Set Facets
if(length(unique(datax$x))>1){
multiFacetColsx <- "x"
colm <- length(unique(datax$x))
if((length(unique(datax$scenario))>1) & (length(unique(datax$class))>1)){
multiFacetRowsx <- "x"
rowm <- length(unique(datax$x))
multiFacetColsx <- c("scenario","class")
colm <- length(unique(datax$scenario))*length(unique(datax$class))
}
if((length(unique(datax$scenario))>1) & (!length(unique(datax$class))>1)){
multiFacetRowsx <- c("scenario")
rowm <- length(unique(datax$scenario))
}
if((!length(unique(datax$scenario))>1) & (length(unique(datax$class))>1)){
multiFacetRowsx <- "x"
rowm <- length(unique(datax$x))
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
}
if((!length(unique(datax$scenario))>1) & (!length(unique(datax$class))>1)){
multiFacetRowsx <- NULL
rowm <- 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}
}else{
if(length(unique(datax$scenario))>1){
multiFacetColsx <- "scenario"
colm <- length(unique(datax$scenario))
if((length(unique(datax$class))>1)){
multiFacetRowsx <- "scenario"
rowm <- length(unique(datax$scenario))
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
}else{
multiFacetRowsx <- NULL
rowm <- 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}
}else{
if((length(unique(datax$class))>1)){
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
multiFacetRowsx <- NULL
rowm <- 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}else{
if(forceFacets){
multiFacetColsx <- "scenario"
} else {
multiFacetColsx <- NULL
}
multiFacetRowsx <- NULL
colm <- 1
rowm <- 1
}
}
}
# Add facet or Rows if selected
if(!is.null(col)){
if(!is.null(multiFacetColsx)){
multiFacetColsx <- c(multiFacetColsx,col)
colm <- colm + length(col)
} else { multiFacetColsx <- col; colm <- length(col)}
}
if(!is.null(row)){
if(!is.null(multiFacetRowsx)){
multiFacetRowsx <- c(multiFacetRowsx,row)
rowm <- rowm + length(row)
} else { multiFacetRowsx <- row; rowm <- length(row)}
}
# Check for Duplicates
if(duplicated(datax %>%
dplyr::select(subRegion,region,lat,lon,x,dplyr::all_of(multiFacetRowsx),dplyr::all_of(multiFacetColsx))) %>%
any()){stop("input data has multiple values. Please check your data.")}
# Set title
if(is.null(title)){
if(param_i == "param"){
if(length(xDiff)==1){
titlex <- paste(xDiff," xDiffAbs ",xRef,sep="")
}else{
titlex <- paste(xRef," xDiffAbs",sep="")
}
} else {
if(length(xDiff)==1){
titlex <- paste(param_i," - ",xDiff," xDiffAbs ",xRef,sep="")
}else{
titlex <- paste(param_i," - ",xRef," xDiffAbs",sep="")
}
}
} else if(title == F){
titlex <- NULL
} else {
titlex <- title
}
# Assign variables based on legend type choice
if(any(grepl("all|kmean",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))){
fileNameTag <- "KMEANS"
legendBreaksx <- kmeanBreaks
} else if(any(grepl("all|continuous",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "CONTINUOUS"
legendBreaksx <- prettyBreaks
} else if(any(grepl("all|pretty",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "PRETTY"
legendBreaksx <- prettyBreaks
} else if(!is.null(legendFixedBreaks)){
fileNameTag <- "FIXED"
legendBreaksx <- legendFixedBreaks
}
# gsub scenario name for figures
datax <- datax %>%
dplyr::mutate(scenario= gsub("_xDiff.*","",scenario))
rmap::map_plot(crs=crs, underLayerLabelCol = underLayerLabelCol, overLayerLabelCol = overLayerLabelCol, labelCol=labelCol, region=region,color=color, lwd=lwd, legendType=legendType, save=save, show=show, shape = shapex, overLayer=overLayer, overLayerColor=overLayerColor,
overLayerFill = overLayerFill, overLayerLwd = overLayerLwd,
overLayerAlpha = overLayerAlpha, underLayerColor=underLayerColor,
underLayerFill = underLayerFill, underLayerLwd = underLayerLwd,
underLayerAlpha = underLayerAlpha, background=background, zoom=zoom,
zoomx = zoomx, zoomy=zoomy, asp=asp, legendShow=legendShow,
crop = crop, crop_to_underLayer = crop_to_underLayer, crop_to_overLayer = crop_to_overLayer, transparent=transparent,
alpha = alpha, size=max(1,(size+(colm+rowm)*3 - 12)), ncol=ncol,
showNA=showNA, colorNA=colorNA,
labelColor=labelColor,
labelSize=labelSize,
labelAlpha=labelAlpha,
labelFill=labelFill,
labelBorderSize=labelBorderSize,
theme = theme, legendTitle=legendTitle,
legendDigitsOverride=legendDigitsOverride,
numeric2Cat_list=numeric2Cat_list, catParam = param_i,
underLayer=underLayer,
data=datax,
legendBreaksn=legendBreaksn,
legendDigits = legendDigits,
palette = palette,
width=width*max(1,colm/1),
height=height*max(1,rowm/1),
pdfpng = pdfpng, legendSingleColor = legendSingleColor, legendSingleValue = legendSingleValue,
labels=labels, labelRepel=labelRepel, underLayerLabels=underLayerLabels, overLayerLabels=overLayerLabels,
legendBreaks = legendBreaksx,
fillColumn = "value",
col = multiFacetColsx,
row = multiFacetRowsx,
title= titlex,
fileName = paste("map_",param_i,"_",fileNameTag,"_xDiffAbs",nameAppend,sep=""),
folder = sub("/$","",paste(folder,"/",param_if,sep = ""))) ->
mapsReturn[[return_i]];
names(mapsReturn)[return_i] <- paste("map_",param_i,"_",fileNameTag,"_xDiffAbs",nameAppend,sep="");
return_i = return_i + 1
# save=save
# overLayer=overLayer
# overLayerColor=overLayerColor
# overLayerFill = overLayerFill
# overLayerLwd = overLayerLwd
# overLayerAlpha = overLayerAlpha
# underLayerColor = underLayerColor
# underLayerFill = underLayerFill
# underLayerLwd = underLayerLwd
# underLayerAlpha = underLayerAlpha
# background=background
# zoom=zoom
# zoomx = zoomx
# zoomy=zoomy
# alpha = alpha
# size=max(1,(size+(colm+rowm)*3 - 12))
# ncol=ncol
# showNA=showNA
# colorNA=colorNA
# theme = theme
# legendTitle=legendTitle
# legendDigitsOverride=legendDigitsOverride
# numeric2Cat_list=numeric2Cat_list
# underLayer=underLayer
# data=datax
# legendBreaksn=legendBreaksn
# legendDigits = legendDigits
# palette = palette
# width=width*max(1,colm/1)
# height=height*max(1,rowm/1)
# pdfpng = pdfpng
# legendSingleColor = legendSingleColor
# legendSingleValue = legendSingleValue
# labels=labels
# legendBreaks = kmeanBreaks
# fillColumn = "value"
# col = multiFacetColsx
# row = multiFacetRowsx
# title=paste(param_i,sep="")
# fileName = paste("map_",param_i,"_",fileNameTag,nameAppend,sep="")
# folder = sub("/$","",paste(folder,"/",param_if,sep = ""))
} # if(nrow(datax)>0){
# Mean for all years provided
datax<-dataTblx%>%dplyr::filter(param==param_i)
if(length(unique(datax$x))>1){
if(nrow(datax)>0){
if(is.null(legendTitleOrig)){legendTitle<-unique(datax$units)}
palette<-as.character(unique(datax$palette)); if(grepl(",",palette)){palette = unlist(stringr::str_split(palette,","))}
meanCol = paste("Mean_",min(datax$x),"_to_",max(datax$x),sep="")
colsPresentGroup = c("lon","lat","subRegion","region","scenario","class")
colsPresentGroup = colsPresentGroup[colsPresentGroup %in% names(datax)]
datax<-datax%>%
dplyr::select(lat,lon,subRegion,region,scenario,class,x,value)%>%
dplyr::group_by_at(dplyr::all_of(colsPresentGroup))%>%
dplyr::summarize(!!meanCol:=mean(value))%>%
dplyr::ungroup()
scalex<-datax[[meanCol]];scalex
scalex <- scalex[!is.infinite(scalex)]
scalex <- scalex[!is.nan(scalex)]
scalex <- scalex[!is.na(scalex)]
# Choose correct scaleRange
if(T){
scaleRange_i=scaleRangexDiffAbs
if(!is.null(scaleRange_i)){
if(any(param_i %in% unique(scaleRange_i$param))){
if(max(scalex) < (scaleRange_i %>% dplyr::filter(param==param_i))$maxScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$maxScale,
scalex[scalex<(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale])
}
if(min(scalex) > (scaleRange_i %>% dplyr::filter(param==param_i))$minScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$minScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$minScale,
scalex[scalex>(scaleRange_i %>% dplyr::filter(param==param_i))$minScale])
}
}
}
prettyBreaks<-scales::pretty_breaks(n=legendBreaksn)(scalex)
kmeanBreaks<-sort(as.vector((stats::kmeans(scalex,
centers=max(1,min(length(unique(scalex))-1,(legendBreaksn-1)))))$centers[,1]))
if(!min(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(min(scalex),kmeanBreaks))}
if(!max(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(kmeanBreaks,max(scalex)))}
if(!is.null(legendFixedBreaks)){
if(min(scalex) < min(legendFixedBreaks)){
legendFixedBreaks <- sort(c(min(scalex),legendFixedBreaks))}
if(max(scalex) > max(legendFixedBreaks)){
legendFixedBreaks <- sort(c(legendFixedBreaks,max(scalex)))};legendFixedBreaks
}
if((max(range(scalex))-min(range(scalex)))<1E-10 &
(max(range(scalex))-min(range(scalex)))>-1E-10){scaleRangex=min(scalex)}else{
scaleRangex=range(scalex)
}
if(abs(min(scaleRangex,na.rm = T))==abs(max(scaleRangex,na.rm = T))){scaleRangex=abs(min(scaleRangex,na.rm = T))}
if(mean(scaleRangex,na.rm = T)<0.01 & mean(scaleRangex,na.rm = T)>(-0.01)){legendDigits<-5}else{
if(mean(scaleRangex,na.rm = T)<0.1 & mean(scaleRangex,na.rm = T)>(-0.1)){legendDigits<-4}else{
if(mean(scaleRangex,na.rm = T)<1 & mean(scaleRangex,na.rm = T)>(-1)){legendDigits<-3}else{
if(mean(scaleRangex,na.rm = T)<10 & mean(scaleRangex,na.rm = T)>(-10)){legendDigits<-2}else{legendDigits<-1}}}}
}
# Set Facets
if(length(unique(datax$scenario))>1){
multiFacetColsx <- "scenario"
colm <- length(unique(datax$scenario))
if((length(unique(datax$class))>1)){
multiFacetRowsx <- "scenario"
rowm <- length(unique(datax$scenario))
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
}else{
multiFacetRowsx <- NULL
rowm <- 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}
}else{
if((length(unique(datax$class))>1)){
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
multiFacetRowsx <- NULL
rowm <- 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}else{
if(forceFacets){
multiFacetColsx <- "scenario"
} else {
multiFacetColsx <- NULL
}
multiFacetRowsx <- NULL
colm <- 1
rowm <- 1
}
}
# Add facet or Rows if selected
if(!is.null(col)){
if(!is.null(multiFacetColsx)){
multiFacetColsx <- c(multiFacetColsx,col)
colm <- colm + length(col)
} else { multiFacetColsx <- col; colm <- length(col)}
}
if(!is.null(row)){
if(!is.null(multiFacetRowsx)){
multiFacetRowsx <- c(multiFacetRowsx,row)
rowm <- rowm + length(row)
} else { multiFacetRowsx <- row; rowm <- length(row)}
}
# Check for Duplicates
if(duplicated(datax %>%
dplyr::select(lat,lon,subRegion,region,x,dplyr::all_of(multiFacetRowsx),dplyr::all_of(multiFacetColsx))) %>%
any()){stop("input data has multiple values. Please check your data.")}
# Set title
if(is.null(title)){
if(param_i == "param"){
titlex <- paste(xRef," xDiffAbs ", meanCol,sep="")
} else {
titlex <- paste(param_i," - ",xRef," xDiffAbs ", meanCol,sep="")
}
} else if(title == F){
titlex <- NULL
} else {
titlex <- title
}
# Assign variables based on legend type choice
if(any(grepl("all|kmean",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))){
fileNameTag <- "KMEANS"
legendBreaksx <- kmeanBreaks
} else if(any(grepl("all|continuous",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "CONTINUOUS"
legendBreaksx <- prettyBreaks
} else if(any(grepl("all|pretty",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "PRETTY"
legendBreaksx <- prettyBreaks
} else if(!is.null(legendFixedBreaks)){
fileNameTag <- "FIXED"
legendBreaksx <- legendFixedBreaks
}
# gsub scenario name for figures
datax <- datax %>%
dplyr::mutate(scenario= gsub("_xDiff.*","",scenario))
rmap::map_plot(crs=crs, underLayerLabelCol = underLayerLabelCol, overLayerLabelCol = overLayerLabelCol, labelCol=labelCol, region=region,color=color, lwd=lwd, legendType=legendType, save=save, show=show, shape = shapex, overLayer=overLayer, overLayerColor=overLayerColor,
overLayerFill = overLayerFill, overLayerLwd = overLayerLwd,
overLayerAlpha = overLayerAlpha, underLayerColor=underLayerColor,
underLayerFill = underLayerFill, underLayerLwd = underLayerLwd,
underLayerAlpha = underLayerAlpha, background=background,
zoom=zoom, zoomx = zoomx, zoomy=zoomy, asp=asp, legendShow=legendShow,
crop = crop, crop_to_underLayer = crop_to_underLayer, crop_to_overLayer = crop_to_overLayer, transparent=transparent,
alpha = alpha, size=max(1,(size+(colm+rowm)*3 - 12)),
ncol=ncol, showNA=showNA, colorNA=colorNA,
labelColor=labelColor,
labelSize=labelSize,
labelAlpha=labelAlpha,
labelFill=labelFill,
labelBorderSize=labelBorderSize,
theme = theme, legendTitle=legendTitle,
legendDigitsOverride=legendDigitsOverride,
numeric2Cat_list=numeric2Cat_list, catParam = param_i,
underLayer=underLayer,
data=datax,
legendBreaksn=legendBreaksn,
legendDigits = legendDigits,
palette = palette,
width=width*max(1,colm/1),
height=height*max(1,rowm/1),
pdfpng = pdfpng, legendSingleColor = legendSingleColor, legendSingleValue = legendSingleValue,
labels=labels, labelRepel=labelRepel, underLayerLabels=underLayerLabels, overLayerLabels=overLayerLabels,
legendBreaks = legendBreaksx,
fillColumn = meanCol,
col = multiFacetColsx,
row = multiFacetRowsx,
title = titlex,
fileName = paste("map_",param_i,"_MEAN_",fileNameTag,"_xDiffAbs",nameAppend,sep=""),
folder = sub("/$","",paste(folder,"/",param_if,sep = ""))) ->
mapsReturn[[return_i]];
names(mapsReturn)[return_i] <- paste("map_",param_i,"_MEAN_",fileNameTag,"_xDiffAbs",nameAppend,sep="");
return_i = return_i + 1
} # if(nrow(datax)>0){
}# If multiple years
} # if nrow of dataTblx dplyr::filtered for Diff scenarios
}# Close if nrow dataTbl < 0
} # Close xDiff Abs Scenario
# xDiff Percent Scenarios
if(T){
if(length(unique(dataTblOrig$param))==1){param_if=NULL}else{param_if=param_i}
if(nrow(dataTblOrig%>%dplyr::filter(param==param_i))>0){
dataTblx <- dataTblOrig%>%dplyr::filter(param==param_i,
scenario %in% dataTbl_scenariosOrig[grepl("_xDiffPrcnt",dataTbl_scenariosOrig)])
if(nrow(dataTblx)>0){
#.................-
# Create data Table Folders If Needed
#.................-
if(save){
if(!dir.exists(paste(folder,"/",sep = ""))){
dir.create(paste(folder,"/",sep = ""))}
if(!dir.exists(paste(folder,"/",param_if,sep = ""))){
dir.create(paste(folder,"/",param_if,sep = ""))}
if(!dir.exists(paste(folder,"/",param_if,sep = ""))){
dir.create(paste(folder, "/",param_if,sep = ""))}
if(length(unique(dataTblx$x))>1){
if(!dir.exists(paste(folder,"/",param_if,"/byYear",sep = ""))){
dir.create(paste(folder, "/",param_if,"/byYear",sep = ""))}
}
} # Create data table folder if needed
#.................--
# Save Map related Data Table
#.................--
if(save){
if(nrow(dataTblx %>% dplyr::filter(param==param_i))>0){
data.table::fwrite(dataTblx %>% dplyr::filter(param==param_i)%>%
dplyr::select(scenario,lat,lon,subRegion,region,param,class,x,value,units),
paste(folder,"/",param_if,"/map_",param_i,nameAppend,".csv",sep = ""))
rlang::inform(paste("Map data table written to ",folder,"/",param_if,"/map_",param_i,nameAppend,".csv",sep = ""))
}
}
#.............................
# By Year
#.............................
# Set Legends
if(T){
scalex<-dataTblx$value
scalex <- scalex[!is.infinite(scalex)]
scalex <- scalex[!is.nan(scalex)]
scalex <- scalex[!is.na(scalex)]
# Choose correct scaleRange
scaleRange_i=scaleRangexDiffPrcnt
if(!is.null(scaleRange_i)){
if(any(param_i %in% unique(scaleRange_i$param))){
if(max(scalex) < (scaleRange_i %>% dplyr::filter(param==param_i))$maxScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$maxScale,
scalex[scalex<(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale])
}
if(min(scalex) > (scaleRange_i %>% dplyr::filter(param==param_i))$minScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$minScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$minScale,
scalex[scalex>(scaleRange_i %>% dplyr::filter(param==param_i))$minScale])
}
}
}
prettyBreaks<-scales::pretty_breaks(n=legendBreaksn)(scalex); prettyBreaks
kmeanBreaks<-sort(as.vector((stats::kmeans(scalex,
centers=max(1,min(length(unique(scalex))-1,(legendBreaksn-1)))))$centers[,1]));kmeanBreaks
if(!min(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(min(scalex),kmeanBreaks))}
if(!max(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(kmeanBreaks,max(scalex)))};kmeanBreaks
if(!is.null(legendFixedBreaks)){
if(min(scalex) < min(legendFixedBreaks)){
legendFixedBreaks <- sort(c(min(scalex),legendFixedBreaks))}
if(max(scalex) > max(legendFixedBreaks)){
legendFixedBreaks <- sort(c(legendFixedBreaks,max(scalex)))};legendFixedBreaks
}
if((max(range(scalex))-min(range(scalex)))<1E-10 &
(max(range(scalex))-min(range(scalex)))>-1E-10){scaleRangex=min(scalex)}else{
scaleRangex=range(scalex)
}
if(abs(min(scaleRangex,na.rm = T))==abs(max(scaleRangex,na.rm = T))){scaleRangex=abs(min(scaleRangex,na.rm = T))}
if(mean(scaleRangex,na.rm = T)<0.01 & mean(scaleRangex,na.rm = T)>(-0.01)){legendDigits<-5}else{
if(mean(scaleRangex,na.rm = T)<0.1 & mean(scaleRangex,na.rm = T)>(-0.1)){legendDigits<-4}else{
if(mean(scaleRangex,na.rm = T)<1 & mean(scaleRangex,na.rm = T)>(-1)){legendDigits<-3}else{
if(mean(scaleRangex,na.rm = T)<10 & mean(scaleRangex,na.rm = T)>(-10)){legendDigits<-2}else{legendDigits<-1}}}}
}
# By Year
if(length(unique(dataTblx$x))>1){
for (x_i in unique(dataTblx$x)){
datax<-dataTblx%>%dplyr::filter(x==x_i)
if(nrow(datax)>0){
if(is.null(legendTitleOrig)){legendTitle<-unique(datax$units)}
palette<-as.character(unique(datax$palette)); if(grepl(",",palette)){palette = unlist(stringr::str_split(palette,","))}
# Set Facets
if(length(unique(datax$scenario))>1){
multiFacetColsx <- "scenario"
colm <- length(unique(datax$scenario))
if((length(unique(datax$class))>1)){
multiFacetRowsx <- "scenario"
rowm <- length(unique(datax$scenario))
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
}else{
multiFacetRowsx <- NULL
rowm = 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}
}else{
if((length(unique(datax$class))>1)){
multiFacetColsx <- c("class")
multiFacetRowsx <- NULL
colm = length(unique(datax$class))
rowm = 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}else{
if(forceFacets){
multiFacetColsx <- "scenario"
} else {
multiFacetColsx <- NULL
}
multiFacetRowsx <- NULL
colm = 1
rowm = 1
}
}
# Add facet or Rows if selected
if(!is.null(col)){
if(!is.null(multiFacetColsx)){
multiFacetColsx <- c(multiFacetColsx,col)
colm <- colm + length(col)
} else { multiFacetColsx <- col; colm <- length(col)}
}
if(!is.null(row)){
if(!is.null(multiFacetRowsx)){
multiFacetRowsx <- c(multiFacetRowsx,row)
rowm <- rowm + length(row)
} else { multiFacetRowsx <- row; rowm <- length(row)}
}
# Check for Duplicates
if(duplicated(datax %>%
dplyr::select(lat,lon,subRegion,region,x,dplyr::all_of(multiFacetRowsx),dplyr::all_of(multiFacetColsx))) %>%
any()){stop("input data has multiple values. Please check your data.")}
# Set title
if(is.null(title)){
if(param_i == "param"){
titlex <- paste(x_i," xDiffPrcnt ",xRef,sep="")
} else {
titlex <- paste(param_i," - ",x_i," xDiffPrcnt ",xRef,sep="")
}
} else if(title == F){
titlex <- NULL
} else {
titlex <- title
}
# Assign variables based on legend type choice
if(any(grepl("all|kmean",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))){
fileNameTag <- "KMEANS"
legendBreaksx <- kmeanBreaks
} else if(any(grepl("all|continuous",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "CONTINUOUS"
legendBreaksx <- prettyBreaks
} else if(any(grepl("all|pretty",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "PRETTY"
legendBreaksx <- prettyBreaks
} else if(!is.null(legendFixedBreaks)){
fileNameTag <- "FIXED"
legendBreaksx <- legendFixedBreaks
}
# gsub scenario name for figures
datax <- datax %>%
dplyr::mutate(scenario= gsub("_xDiff.*","",scenario))
rmap::map_plot(crs=crs, underLayerLabelCol = underLayerLabelCol, overLayerLabelCol = overLayerLabelCol, labelCol=labelCol, region=region,color=color, lwd=lwd, legendType=legendType, save=save, show=show, shape = shapex, overLayer=overLayer, overLayerColor=overLayerColor,
overLayerFill = overLayerFill, overLayerLwd = overLayerLwd,
overLayerAlpha = overLayerAlpha, underLayerColor=underLayerColor,
underLayerFill = underLayerFill, underLayerLwd = underLayerLwd,
underLayerAlpha = underLayerAlpha, background=background,
zoom=zoom, zoomx = zoomx, zoomy=zoomy, asp=asp, legendShow=legendShow,
crop = crop, crop_to_underLayer = crop_to_underLayer, crop_to_overLayer = crop_to_overLayer, transparent=transparent,
alpha = alpha, size=max(1,(size+(colm+rowm)*3 - 12)),
ncol=ncol, showNA=showNA, colorNA=colorNA,
theme = theme, legendTitle=legendTitle,
legendDigitsOverride=legendDigitsOverride,
numeric2Cat_list=numeric2Cat_list, catParam = param_i,
underLayer=underLayer,
data=datax,
labelColor=labelColor,
labelSize=labelSize,
labelAlpha=labelAlpha,
labelFill=labelFill,
labelBorderSize=labelBorderSize,
legendBreaksn=legendBreaksn,
legendDigits = legendDigits,
palette = palette,
width=width*max(1,colm/1),
height=height*max(1,rowm/1),
pdfpng = pdfpng, legendSingleColor = legendSingleColor, legendSingleValue = legendSingleValue,
labels=labels, labelRepel=labelRepel, underLayerLabels=underLayerLabels, overLayerLabels=overLayerLabels,
legendBreaks = legendBreaksx,
fillColumn = "value",
col = multiFacetColsx,
row = multiFacetRowsx,
title=titlex ,
fileName = paste("map_",param_i,"_",x_i,"_",fileNameTag,"_xDiffPrcnt",nameAppend,sep=""),
folder = paste(folder,"/",param_if,"/byYear",sep = "")) ->
mapsReturn[[return_i]];
names(mapsReturn)[return_i] <- paste("map_",param_i,"_",x_i,"_",fileNameTag,"_xDiffPrcnt",nameAppend,sep="");
return_i = return_i + 1
# theme_ggplot = theme_ggplot
# theme_custom = theme_custom
# theme_rmap = theme_rmap
# legendDigitsOverride=legendDigitsOverride
# numeric2Cat_list=numeric2Cat_list
# underLayer=underLayer
# data=datax
# legendBreaksn=legendBreaksn
# legendDigits = legendDigits
# palette = palette
# width=width*max(1,colm/1),
# height=height*max(1,rowm/1),
# pdfpng = pdfpng
# legendSingleColor = legendSingleColor
# legendSingleValue = legendSingleValue
# labels=labels
# legendBreaks = kmeanBreaks
# fillColumn = "value"
# col = multiFacetColsx
# row = multiFacetRowsx
# title=paste(param_i," ",x_i,sep="")
# fileName = paste("map_",param_i,"_",x_i,"_",fileNameTag,nameAppend,sep="")
# folder = paste(folder,"/",param_if,"/byYear",sep = "")
}
} # Close years x_i loop
# Animations
if(animate==T){
animName<-paste("anim_",param_i,"_",fileNameTag,"_xDiffPrcnt",nameAppend,".gif",sep="")
animFiles <- list.files(path = paste(folder,"/",param_if,"/byYear",sep=""),
pattern = paste(".*",param_i,".*",fileNameTag,"_xDiffPrcnt",nameAppend, ".", pdfpng,sep=""), full.names=T,ignore.case = T, include.dirs = T);
animation <- magick::image_animate(magick::image_join(lapply(animFiles, magick::image_read)),fps=fps)
magick::image_write(animation,paste(folder,"/",param_if,"/",
animName,sep = ""))
rlang::inform(gsub("//","/",paste("animation saved in :",folder,"/",param_if,"/",
animName,sep = "")))
}
}
# Multi-Year-Single Chart
datax<-dataTblx%>%dplyr::filter(param==param_i)
if(nrow(datax)>0){
if(is.null(legendTitleOrig)){legendTitle<-unique(datax$units)}
palette<-as.character(unique(datax$palette)); if(grepl(",",palette)){palette = unlist(stringr::str_split(palette,","))}
scalex<-datax$value
scalex <- scalex[!is.infinite(scalex)]
scalex <- scalex[!is.nan(scalex)]
scalex <- scalex[!is.na(scalex)]
# Choose correct scaleRange
if(T){
scaleRange_i=scaleRangexDiffPrcnt
if(!is.null(scaleRange_i)){
if(any(param_i %in% unique(scaleRange_i$param))){
if(max(scalex) < (scaleRange_i %>% dplyr::filter(param==param_i))$maxScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$maxScale,
scalex[scalex<(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale])
}
if(min(scalex) > (scaleRange_i %>% dplyr::filter(param==param_i))$minScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$minScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$minScale,
scalex[scalex>(scaleRange_i %>% dplyr::filter(param==param_i))$minScale])
}
}
}
prettyBreaks<-scales::pretty_breaks(n=legendBreaksn)(scalex)
kmeanBreaks<-sort(as.vector((stats::kmeans(scalex,
centers=max(1,min(length(unique(scalex))-1,(legendBreaksn-1)))))$centers[,1]))
if(!min(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(min(scalex),kmeanBreaks))}
if(!max(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(kmeanBreaks,max(scalex)))}
if(!is.null(legendFixedBreaks)){
if(min(scalex) < min(legendFixedBreaks)){
legendFixedBreaks <- sort(c(min(scalex),legendFixedBreaks))}
if(max(scalex) > max(legendFixedBreaks)){
legendFixedBreaks <- sort(c(legendFixedBreaks,max(scalex)))};legendFixedBreaks
}
if((max(range(scalex))-min(range(scalex)))<1E-10 &
(max(range(scalex))-min(range(scalex)))>-1E-10){scaleRangex=min(scalex)}else{
scaleRangex=range(scalex)
}
if(abs(min(scaleRangex,na.rm = T))==abs(max(scaleRangex,na.rm = T))){scaleRangex=abs(min(scaleRangex,na.rm = T))}
if(mean(scaleRangex,na.rm = T)<0.01 & mean(scaleRangex,na.rm = T)>(-0.01)){legendDigits<-5}else{
if(mean(scaleRangex,na.rm = T)<0.1 & mean(scaleRangex,na.rm = T)>(-0.1)){legendDigits<-4}else{
if(mean(scaleRangex,na.rm = T)<1 & mean(scaleRangex,na.rm = T)>(-1)){legendDigits<-3}else{
if(mean(scaleRangex,na.rm = T)<10 & mean(scaleRangex,na.rm = T)>(-10)){legendDigits<-2}else{legendDigits<-1}}}}
}
# Set Facets
if(length(unique(datax$x))>1){
multiFacetColsx <- "x"
colm <- length(unique(datax$x))
if((length(unique(datax$scenario))>1) & (length(unique(datax$class))>1)){
multiFacetRowsx <- "x"
rowm <- length(unique(datax$x))
multiFacetColsx <- c("scenario","class")
colm <- length(unique(datax$scenario))*length(unique(datax$class))
}
if((length(unique(datax$scenario))>1) & (!length(unique(datax$class))>1)){
multiFacetRowsx <- c("scenario")
rowm <- length(unique(datax$scenario))
}
if((!length(unique(datax$scenario))>1) & (length(unique(datax$class))>1)){
multiFacetRowsx <- "x"
rowm <- length(unique(datax$x))
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
}
if((!length(unique(datax$scenario))>1) & (!length(unique(datax$class))>1)){
multiFacetRowsx <- NULL
rowm <- 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}
}else{
if(length(unique(datax$scenario))>1){
multiFacetColsx <- "scenario"
colm <- length(unique(datax$scenario))
if((length(unique(datax$class))>1)){
multiFacetRowsx <- "scenario"
rowm <- length(unique(datax$scenario))
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
}else{
multiFacetRowsx <- NULL
rowm <- 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}
}else{
if((length(unique(datax$class))>1)){
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
multiFacetRowsx <- NULL
rowm <- 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}else{
if(forceFacets){
multiFacetColsx <- "scenario"
} else {
multiFacetColsx <- NULL
}
multiFacetRowsx <- NULL
colm <- 1
rowm <- 1
}
}
}
# Add facet or Rows if selected
if(!is.null(col)){
if(!is.null(multiFacetColsx)){
multiFacetColsx <- c(multiFacetColsx,col)
colm <- colm + length(col)
} else { multiFacetColsx <- col; colm <- length(col)}
}
if(!is.null(row)){
if(!is.null(multiFacetRowsx)){
multiFacetRowsx <- c(multiFacetRowsx,row)
rowm <- rowm + length(row)
} else { multiFacetRowsx <- row; rowm <- length(row)}
}
# Check for Duplicates
if(duplicated(datax %>%
dplyr::select(subRegion,lat,lon,x,region,dplyr::all_of(multiFacetRowsx),dplyr::all_of(multiFacetColsx))) %>%
any()){stop("input data has multiple values. Please check your data.")}
# Set title
if(is.null(title)){
if(param_i == "param"){
if(length(xDiff)==1){
titlex <- paste(xDiff," xDiffPrcnt ",xRef,sep="")
}else{
titlex <- paste(xRef," xDiffPrcnt",sep="")
}
} else {
if(length(xDiff)==1){
titlex <- paste(param_i," - ",xDiff," xDiffPrcnt ",xRef,sep="")
}else{
titlex <- paste(param_i," - ",xRef," xDiffPrcnt",sep="")
}
}
} else if(title == F){
titlex <- NULL
} else {
titlex <- title
}
# Assign variables based on legend type choice
if(any(grepl("all|kmean",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))){
fileNameTag <- "KMEANS"
legendBreaksx <- kmeanBreaks
} else if(any(grepl("all|continuous",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "CONTINUOUS"
legendBreaksx <- prettyBreaks
} else if(any(grepl("all|pretty",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "PRETTY"
legendBreaksx <- prettyBreaks
} else if(!is.null(legendFixedBreaks)){
fileNameTag <- "FIXED"
legendBreaksx <- legendFixedBreaks
}
# gsub scenario name for figures
datax <- datax %>%
dplyr::mutate(scenario= gsub("_xDiff.*","",scenario))
rmap::map_plot(crs=crs, underLayerLabelCol = underLayerLabelCol, overLayerLabelCol = overLayerLabelCol, labelCol=labelCol, region=region,color=color, lwd=lwd, legendType=legendType, save=save, show=show, shape = shapex, overLayer=overLayer, overLayerColor=overLayerColor,
overLayerFill = overLayerFill, overLayerLwd = overLayerLwd,
overLayerAlpha = overLayerAlpha, underLayerColor=underLayerColor,
underLayerFill = underLayerFill, underLayerLwd = underLayerLwd,
underLayerAlpha = underLayerAlpha, background=background, zoom=zoom,
zoomx = zoomx, zoomy=zoomy, asp=asp, legendShow=legendShow,
crop = crop, crop_to_underLayer = crop_to_underLayer, crop_to_overLayer = crop_to_overLayer, transparent=transparent,
alpha = alpha, size=max(1,(size+(colm+rowm)*3 - 12)), ncol=ncol,
showNA=showNA, colorNA=colorNA,
labelColor=labelColor,
labelSize=labelSize,
labelAlpha=labelAlpha,
labelFill=labelFill,
labelBorderSize=labelBorderSize,
theme = theme, legendTitle=legendTitle,
legendDigitsOverride=legendDigitsOverride,
numeric2Cat_list=numeric2Cat_list, catParam = param_i,
underLayer=underLayer,
data=datax,
legendBreaksn=legendBreaksn,
legendDigits = legendDigits,
palette = palette,
width=width*max(1,colm/1),
height=height*max(1,rowm/1),
pdfpng = pdfpng, legendSingleColor = legendSingleColor, legendSingleValue = legendSingleValue,
labels=labels, labelRepel=labelRepel, underLayerLabels=underLayerLabels, overLayerLabels=overLayerLabels,
legendBreaks = legendBreaksx,
fillColumn = "value",
col = multiFacetColsx,
row = multiFacetRowsx,
title= titlex,
fileName = paste("map_",param_i,"_",fileNameTag,"_xDiffPrcnt",nameAppend,sep=""),
folder = sub("/$","",paste(folder,"/",param_if,sep = ""))) ->
mapsReturn[[return_i]];
names(mapsReturn)[return_i] <- paste("map_",param_i,"_",fileNameTag,"_xDiffPrcnt",nameAppend,sep="");
return_i = return_i + 1
# save=save
# overLayer=overLayer
# overLayerColor=overLayerColor
# overLayerFill = overLayerFill
# overLayerLwd = overLayerLwd
# overLayerAlpha = overLayerAlpha
# underLayerColor = underLayerColor
# underLayerFill = underLayerFill
# underLayerLwd = underLayerLwd
# underLayerAlpha = underLayerAlpha
# background=background
# zoom=zoom
# zoomx = zoomx
# zoomy=zoomy
# alpha = alpha
# size=max(1,(size+(colm+rowm)*3 - 12))
# ncol=ncol
# showNA=showNA
# colorNA=colorNA
# theme = theme
# legendTitle=legendTitle
# legendDigitsOverride=legendDigitsOverride
# numeric2Cat_list=numeric2Cat_list
# underLayer=underLayer
# data=datax
# legendBreaksn=legendBreaksn
# legendDigits = legendDigits
# palette = palette
# width=width*max(1,colm/1)
# height=height*max(1,rowm/1)
# pdfpng = pdfpng
# legendSingleColor = legendSingleColor
# legendSingleValue = legendSingleValue
# labels=labels
# legendBreaks = kmeanBreaks
# fillColumn = "value"
# col = multiFacetColsx
# row = multiFacetRowsx
# title=paste(param_i,sep="")
# fileName = paste("map_",param_i,"_",fileNameTag,nameAppend,sep="")
# folder = sub("/$","",paste(folder,"/",param_if,sep = ""))
} # if(nrow(datax)>0){
# Mean for all years provided
datax<-dataTblx%>%dplyr::filter(param==param_i)
if(length(unique(datax$x))>1){
if(nrow(datax)>0){
if(is.null(legendTitleOrig)){legendTitle<-unique(datax$units)}
palette<-as.character(unique(datax$palette)); if(grepl(",",palette)){palette = unlist(stringr::str_split(palette,","))}
meanCol = paste("Mean_",min(datax$x),"_to_",max(datax$x),sep="")
colsPresentGroup = c("lon","lat","subRegion","region","scenario","class")
colsPresentGroup = colsPresentGroup[colsPresentGroup %in% names(datax)]
datax<-datax%>%
dplyr::select(lat,lon,subRegion,scenario,region,class,x,value)%>%
dplyr::group_by_at(dplyr::all_of(colsPresentGroup))%>%
dplyr::summarize(!!meanCol:=mean(value))%>%
dplyr::ungroup()
scalex<-datax[[meanCol]];scalex
scalex <- scalex[!is.infinite(scalex)]
scalex <- scalex[!is.nan(scalex)]
scalex <- scalex[!is.na(scalex)]
# Choose correct scaleRange
if(T){
scaleRange_i=scaleRangexDiffPrcnt
if(!is.null(scaleRange_i)){
if(any(param_i %in% unique(scaleRange_i$param))){
if(max(scalex) < (scaleRange_i %>% dplyr::filter(param==param_i))$maxScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$maxScale,
scalex[scalex<(scaleRange_i %>% dplyr::filter(param==param_i))$maxScale])
}
if(min(scalex) > (scaleRange_i %>% dplyr::filter(param==param_i))$minScale){
scalex<-c(scalex,(scaleRange_i %>% dplyr::filter(param==param_i))$minScale)} else {
scalex <- c((scaleRange_i %>% dplyr::filter(param==param_i))$minScale,
scalex[scalex>(scaleRange_i %>% dplyr::filter(param==param_i))$minScale])
}
}
}
prettyBreaks<-scales::pretty_breaks(n=legendBreaksn)(scalex)
kmeanBreaks<-sort(as.vector((stats::kmeans(scalex,
centers=max(1,min(length(unique(scalex))-1,(legendBreaksn-1)))))$centers[,1]))
if(!min(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(min(scalex),kmeanBreaks))}
if(!max(scalex) %in% kmeanBreaks){
kmeanBreaks <- sort(c(kmeanBreaks,max(scalex)))}
if(!is.null(legendFixedBreaks)){
if(min(scalex) < min(legendFixedBreaks)){
legendFixedBreaks <- sort(c(min(scalex),legendFixedBreaks))}
if(max(scalex) > max(legendFixedBreaks)){
legendFixedBreaks <- sort(c(legendFixedBreaks,max(scalex)))};legendFixedBreaks
}
if((max(range(scalex))-min(range(scalex)))<1E-10 &
(max(range(scalex))-min(range(scalex)))>-1E-10){scaleRangex=min(scalex)}else{
scaleRangex=range(scalex)
}
if(abs(min(scaleRangex,na.rm = T))==abs(max(scaleRangex,na.rm = T))){scaleRangex=abs(min(scaleRangex,na.rm = T))}
if(mean(scaleRangex,na.rm = T)<0.01 & mean(scaleRangex,na.rm = T)>(-0.01)){legendDigits<-5}else{
if(mean(scaleRangex,na.rm = T)<0.1 & mean(scaleRangex,na.rm = T)>(-0.1)){legendDigits<-4}else{
if(mean(scaleRangex,na.rm = T)<1 & mean(scaleRangex,na.rm = T)>(-1)){legendDigits<-3}else{
if(mean(scaleRangex,na.rm = T)<10 & mean(scaleRangex,na.rm = T)>(-10)){legendDigits<-2}else{legendDigits<-1}}}}
}
# Set Facets
if(length(unique(datax$scenario))>1){
multiFacetColsx <- "scenario"
colm <- length(unique(datax$scenario))
if((length(unique(datax$class))>1)){
multiFacetRowsx <- "scenario"
rowm <- length(unique(datax$scenario))
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
}else{
multiFacetRowsx <- NULL
rowm <- 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}
}else{
if((length(unique(datax$class))>1)){
multiFacetColsx <- c("class")
colm <- length(unique(datax$class))
multiFacetRowsx <- NULL
rowm <- 1
colm = colm/((colm + ncol-1)%/%ncol);
rowm = (colm + ncol-1)%/%ncol
}else{
if(forceFacets){
multiFacetColsx <- "scenario"
} else {
multiFacetColsx <- NULL
}
multiFacetRowsx <- NULL
colm <- 1
rowm <- 1
}
}
# Add facet or Rows if selected
if(!is.null(col)){
if(!is.null(multiFacetColsx)){
multiFacetColsx <- c(multiFacetColsx,col)
colm <- colm + length(col)
} else { multiFacetColsx <- col; colm <- length(col)}
}
if(!is.null(row)){
if(!is.null(multiFacetRowsx)){
multiFacetRowsx <- c(multiFacetRowsx,row)
rowm <- rowm + length(row)
} else { multiFacetRowsx <- row; rowm <- length(row)}
}
# Check for Duplicates
if(duplicated(datax %>%
dplyr::select(lat,lon,subRegion,region,x,dplyr::all_of(multiFacetRowsx),dplyr::all_of(multiFacetColsx))) %>%
any()){stop("input data has multiple values. Please check your data.")}
# Set title
if(is.null(title)){
if(param_i == "param"){
titlex <- paste(xRef," xDiffPrcnt ", meanCol,sep="")
} else {
titlex <- paste(param_i," - ",xRef," xDiffPrcnt ",meanCol,sep="")
}
} else if(title == F){
titlex <- NULL
} else {
titlex <- title
}
# Assign variables based on legend type choice
if(any(grepl("all|kmean",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))){
fileNameTag <- "KMEANS"
legendBreaksx <- kmeanBreaks
} else if(any(grepl("all|continuous",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "CONTINUOUS"
legendBreaksx <- prettyBreaks
} else if(any(grepl("all|pretty",legendType,ignore.case = T)) & (is.null(legendFixedBreaks))) {
fileNameTag <- "PRETTY"
legendBreaksx <- prettyBreaks
} else if(!is.null(legendFixedBreaks)){
fileNameTag <- "FIXED"
legendBreaksx <- legendFixedBreaks
}
# gsub scenario name for figures
datax <- datax %>%
dplyr::mutate(scenario= gsub("_xDiff.*","",scenario))
rmap::map_plot(crs=crs, underLayerLabelCol = underLayerLabelCol, overLayerLabelCol = overLayerLabelCol, labelCol=labelCol, region=region,color=color, lwd=lwd, legendType=legendType, save=save, show=show, shape = shapex, overLayer=overLayer, overLayerColor=overLayerColor,
overLayerFill = overLayerFill, overLayerLwd = overLayerLwd,
overLayerAlpha = overLayerAlpha, underLayerColor=underLayerColor,
underLayerFill = underLayerFill, underLayerLwd = underLayerLwd,
underLayerAlpha = underLayerAlpha, background=background,
zoom=zoom, zoomx = zoomx, zoomy=zoomy, asp=asp, legendShow=legendShow,
crop = crop, crop_to_underLayer = crop_to_underLayer, crop_to_overLayer = crop_to_overLayer, transparent=transparent,
alpha = alpha, size=max(1,(size+(colm+rowm)*3 - 12)),
ncol=ncol, showNA=showNA, colorNA=colorNA,
labelColor=labelColor,
labelSize=labelSize,
labelAlpha=labelAlpha,
labelFill=labelFill,
labelBorderSize=labelBorderSize,
theme = theme, legendTitle=legendTitle,
legendDigitsOverride=legendDigitsOverride,
numeric2Cat_list=numeric2Cat_list, catParam = param_i,
underLayer=underLayer,
data=datax,
legendBreaksn=legendBreaksn,
legendDigits = legendDigits,
palette = palette,
width=width*max(1,colm/1),
height=height*max(1,rowm/1),
pdfpng = pdfpng, legendSingleColor = legendSingleColor, legendSingleValue = legendSingleValue,
labels=labels, labelRepel=labelRepel, underLayerLabels=underLayerLabels, overLayerLabels=overLayerLabels,
legendBreaks = legendBreaksx,
fillColumn = meanCol,
col = multiFacetColsx,
row = multiFacetRowsx,
title = titlex,
fileName = paste("map_",param_i,"_MEAN_",fileNameTag,"_xDiffPrcnt",nameAppend,sep=""),
folder = sub("/$","",paste(folder,"/",param_if,sep = ""))) ->
mapsReturn[[return_i]];
names(mapsReturn)[return_i] <- paste("map_",param_i,"_MEAN_",fileNameTag,"_xDiffPrcnt",nameAppend,sep="");
return_i = return_i + 1
} # if(nrow(datax)>0){
}# If multiple years
} # if nrow of dataTblx dplyr::filtered for Diff scenarios
}# Close if nrow dataTbl < 0
} # Close xDiff Percent Scenario
}
} # Close params loop
} # Close if nrow dataTbl < 0
}# Close if dataTbl is Null
} # Close Plots
# .................
# Return Data
# .................
rlang::inform("map run completed.")
invisible(mapsReturn)
} # Close direct plots
} # close function
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.