map.R 26.4 KB
Newer Older
Heraut Louis's avatar
Heraut Louis committed
# \\\
Heraut Louis's avatar
Heraut Louis committed
# Copyright 2021-2022 Louis Héraut*1
Heraut Louis's avatar
Heraut Louis committed
#
# *1   INRAE, France
#      louis.heraut@inrae.fr
#
# This file is part of ash R toolbox.
#
# ash R toolbox is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or (at
# your option) any later version.
#
# ash R toolbox is distributed in the hope that it will be useful, but 
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with ash R toolbox.  If not, see <https://www.gnu.org/licenses/>.
# ///
#
#
# plotting/map.R
#
Heraut Louis's avatar
Heraut Louis committed
# Deals with the creation of a map for presenting the trend analysis of hydrological variables
Heraut Louis's avatar
Heraut Louis committed


Heraut Louis's avatar
Heraut Louis committed
## 1. MAP PANEL
Heraut Louis's avatar
Heraut Louis committed
# Generates a map plot of the tendancy of a hydrological variable
Heraut Louis's avatar
Heraut Louis committed
map_panel = function (list_df2plot, df_meta, df_shapefile, idPer=1, outdirTmp='', codeLight=NULL, margin=NULL, showSea=TRUE, verbose=TRUE) {

Heraut Louis's avatar
Heraut Louis committed
    # Extract shapefiles
Heraut Louis's avatar
Heraut Louis committed
    df_france = df_shapefile$france
    df_bassin = df_shapefile$bassin
Heraut Louis's avatar
Heraut Louis committed
    df_subbassin = df_shapefile$subbassin
Heraut Louis's avatar
Heraut Louis committed
    df_river = df_shapefile$river

Heraut Louis's avatar
Heraut Louis committed
    # Number of variable/plot
Heraut Louis's avatar
Heraut Louis committed
    nbp = length(list_df2plot)
  
    # Get all different stations code
    Code = levels(factor(df_meta$code))
    nCode = length(Code)
Heraut Louis's avatar
Heraut Louis committed

    # Gets a trend example
Heraut Louis's avatar
Heraut Louis committed
    df_trend = list_df2plot[[1]]$trend
    
    nPeriod_max = 0
    for (code in Code) {
Heraut Louis's avatar
Heraut Louis committed
        # Extracts the trend corresponding to the code
Heraut Louis's avatar
Heraut Louis committed
        df_trend_code = df_trend[df_trend$code == code,]
        
Heraut Louis's avatar
Heraut Louis committed
        # Extract start and end of trend periods
Heraut Louis's avatar
Heraut Louis committed
        Start = df_trend_code$period_start
        End = df_trend_code$period_end
Heraut Louis's avatar
Heraut Louis committed
        # Get the name of the different period
        UStart = levels(factor(Start))        
Heraut Louis's avatar
Heraut Louis committed
        UEnd = levels(factor(End))
Heraut Louis's avatar
Heraut Louis committed

        # Compute the max of different start and end
        # so the number of different period
Heraut Louis's avatar
Heraut Louis committed
        nPeriod = max(length(UStart), length(UEnd))
Heraut Louis's avatar
Heraut Louis committed

        # If the number of period for the trend is greater
        # than the current max period, stocks it
Heraut Louis's avatar
Heraut Louis committed
        if (nPeriod > nPeriod_max) {
            nPeriod_max = nPeriod
        }
    }
Heraut Louis's avatar
Heraut Louis committed
    tab_Start =  array(rep('', nCode*nbp*nPeriod_max),
                       dim=c(nCode, nbp, nPeriod_max))
    tab_End = array(rep('', nCode*nbp*nPeriod_max),
                    dim=c(nCode, nbp, nPeriod_max))
    tab_Code = array(rep('', nCode*nbp*nPeriod_max),
                     dim=c(nCode, nbp, nPeriod_max))
    tab_Periods = array(rep('', nCode*nbp*nPeriod_max),
                        dim=c(nCode, nbp, nPeriod_max))
    
    # For all code
    for (k in 1:nCode) {
Heraut Louis's avatar
Heraut Louis committed
        # Gets the code
Heraut Louis's avatar
Heraut Louis committed
        code = Code[k]
Heraut Louis's avatar
Heraut Louis committed

Heraut Louis's avatar
Heraut Louis committed
        for (i in 1:nbp) {
            df_trend = list_df2plot[[i]]$trend
            # Extracts the trend corresponding to the code
            df_trend_code = df_trend[df_trend$code == code,]
            
            # Extract start and end of trend periods
            Start = df_trend_code$period_start
            End = df_trend_code$period_end
            # Get the name of the different period
            UStart = levels(factor(Start))        
            UEnd = levels(factor(End))
            
            # Compute the max of different start and end
            # so the number of different period
            nPeriod = max(length(UStart), length(UEnd))
Heraut Louis's avatar
Heraut Louis committed

Heraut Louis's avatar
Heraut Louis committed
            # For all the period
            for (j in 1:nPeriod_max) {
                # Stocks period
                Periods = paste(Start[j],
                                End[j],
                                sep=' / ')
                
                tab_Start[k, i, j] = as.character(Start[j])
                tab_End[k, i, j] = as.character(End[j])
                tab_Code[k, i, j] = code
                tab_Periods[k, i, j] = Periods
                
            }
Heraut Louis's avatar
Heraut Louis committed
        }
    }
Heraut Louis's avatar
Heraut Louis committed
    
Heraut Louis's avatar
Heraut Louis committed
    # Blank array to store mean of the trend for each
    # station, perdiod and variable
Heraut Louis's avatar
Heraut Louis committed
    TrendMean_code = array(rep(1, nPeriod_max*nbp*nCode),
                           dim=c(nPeriod_max, nbp, nCode))
Heraut Louis's avatar
Heraut Louis committed
    # For all the period
Heraut Louis's avatar
Heraut Louis committed
    for (j in 1:nPeriod_max) {
Heraut Louis's avatar
Heraut Louis committed
        # For all the code
Heraut Louis's avatar
Heraut Louis committed
        for (k in 1:nCode) {
Heraut Louis's avatar
Heraut Louis committed
            # Gets the code
Heraut Louis's avatar
Heraut Louis committed
            code = Code[k]
Heraut Louis's avatar
Heraut Louis committed
            # For all variable
Heraut Louis's avatar
Heraut Louis committed
            for (i in 1:nbp) {
Heraut Louis's avatar
Heraut Louis committed
                # Extracts the data corresponding to the
                # current variable
Heraut Louis's avatar
Heraut Louis committed
                df_data = list_df2plot[[i]]$data
Heraut Louis's avatar
Heraut Louis committed
                # Extracts the trend corresponding to the
                # current variable
Heraut Louis's avatar
Heraut Louis committed
                df_trend = list_df2plot[[i]]$trend
                p_threshold = list_df2plot[[i]]$p_threshold
Heraut Louis's avatar
Heraut Louis committed
                # Extracts the data corresponding to the code
                df_data_code = df_data[df_data$code == code,]
                # Extracts the trend corresponding to the code
Heraut Louis's avatar
Heraut Louis committed
                df_trend_code = df_trend[df_trend$code == code,]

Heraut Louis's avatar
Heraut Louis committed
                # Gets the associated time info
Heraut Louis's avatar
Heraut Louis committed
                Start = tab_Start[k, i, j]
                End = tab_End[k, i, j]
                Periods = tab_Periods[k, i, j]
Heraut Louis's avatar
Heraut Louis committed

Heraut Louis's avatar
Heraut Louis committed
                # Extracts the corresponding data for the period
Heraut Louis's avatar
Heraut Louis committed
                df_data_code_per =
                    df_data_code[df_data_code$Date >= Start 
                                 & df_data_code$Date <= End,]
Heraut Louis's avatar
Heraut Louis committed
                # Same for trend
Heraut Louis's avatar
Heraut Louis committed
                df_trend_code_per = 
                    df_trend_code[df_trend_code$period_start == Start 
                                  & df_trend_code$period_end == End,]

Heraut Louis's avatar
Heraut Louis committed
                # Computes the number of trend analysis selected
Heraut Louis's avatar
Heraut Louis committed
                Ntrend = nrow(df_trend_code_per)
Heraut Louis's avatar
Heraut Louis committed
                # If there is more than one trend on the same period
Heraut Louis's avatar
Heraut Louis committed
                if (Ntrend > 1) {
Heraut Louis's avatar
Heraut Louis committed
                    # Takes only the first because they are similar
Heraut Louis's avatar
Heraut Louis committed
                    df_trend_code_per = df_trend_code_per[1,]
                }
Heraut Louis's avatar
Heraut Louis committed

                # Computes the mean of the data on the period
Heraut Louis's avatar
Heraut Louis committed
                dataMean = mean(df_data_code_per$Value, na.rm=TRUE)
Heraut Louis's avatar
Heraut Louis committed
                # Normalises the trend value by the mean of the data
Heraut Louis's avatar
Heraut Louis committed
                trendMean = df_trend_code_per$trend / dataMean

Heraut Louis's avatar
Heraut Louis committed
                # If the p value is under the threshold
Heraut Louis's avatar
Heraut Louis committed
                if (df_trend_code_per$p <= p_threshold){
Heraut Louis's avatar
Heraut Louis committed
                    # Stores the mean trend
Heraut Louis's avatar
Heraut Louis committed
                    TrendMean_code[j, i, k] = trendMean
Heraut Louis's avatar
Heraut Louis committed
                # Otherwise
Heraut Louis's avatar
Heraut Louis committed
                } else {
Heraut Louis's avatar
Heraut Louis committed
                    # Do not stocks it
Heraut Louis's avatar
Heraut Louis committed
                    TrendMean_code[j, i, k] = NA
                }
            }
        }
    }
Heraut Louis's avatar
Heraut Louis committed
    # Compute the min and the max of the mean trend for all the station
Heraut Louis's avatar
Heraut Louis committed
    minTrendMean = apply(TrendMean_code, c(1, 2), min, na.rm=TRUE)
    maxTrendMean = apply(TrendMean_code, c(1, 2), max, na.rm=TRUE)    

Heraut Louis's avatar
Heraut Louis committed
    # Number of ticks for the colorbar
Heraut Louis's avatar
Heraut Louis committed
    nbTick = 10
Heraut Louis's avatar
Heraut Louis committed
    # For all variable
Heraut Louis's avatar
Heraut Louis committed
    for (i in 1:nbp) {
Heraut Louis's avatar
Heraut Louis committed
        # If there is a specified station code to highlight (mini map)
        # and there has already been one loop
Heraut Louis's avatar
Heraut Louis committed
        if (i > 1 & !is.null(codeLight)) {
Heraut Louis's avatar
Heraut Louis committed
            # Stop the for loop over the variable
Heraut Louis's avatar
Heraut Louis committed
            break
        }
Heraut Louis's avatar
Heraut Louis committed
        # Extracts the variable of the plot
Heraut Louis's avatar
Heraut Louis committed
        var = list_df2plot[[i]]$var
Heraut Louis's avatar
Heraut Louis committed
        # Createsa name for the map
Heraut Louis's avatar
Heraut Louis committed
        outname = paste('map_', var, sep='')
Heraut Louis's avatar
Heraut Louis committed
        # If there is the verbose option
Heraut Louis's avatar
Heraut Louis committed
        if (verbose) {
Heraut Louis's avatar
Heraut Louis committed
            # Prints the name of the map
Heraut Louis's avatar
Heraut Louis committed
            print(paste('Map for variable : ', var,
Heraut Louis's avatar
Heraut Louis committed
                        "   (", round(i/nbp*100, 1), " %)", 
                        sep=''))
Heraut Louis's avatar
Heraut Louis committed
        } 

Heraut Louis's avatar
Heraut Louis committed
        # If there is no specified station code to highlight (mini map)
Heraut Louis's avatar
Heraut Louis committed
        if (is.null(codeLight)) {
Heraut Louis's avatar
Heraut Louis committed
            # Sets the size of the countour
Heraut Louis's avatar
Heraut Louis committed
            sizefr = 0.45
            sizebs = 0.4
            sizerv = 0.3
        } else {
            sizefr = 0.35
            sizebs = 0.3
            sizerv = 0.2
        }
Heraut Louis's avatar
Heraut Louis committed
        # Stores the coordonate system 
        cf = coord_fixed()
        # Makes it the default one to remove useless warning
        cf$default = TRUE

Heraut Louis's avatar
Heraut Louis committed
        # Open a new plot with the personalise theme
Heraut Louis's avatar
Heraut Louis committed
        map = ggplot() + theme_void() +
            # theme(plot.background=element_rect(fill=NA,
                                               # color="#EC4899")) +
Heraut Louis's avatar
Heraut Louis committed
            # Fixed coordinate system (remove useless warning)
            cf +
Heraut Louis's avatar
Heraut Louis committed
            # Plot the background of France
Heraut Louis's avatar
Heraut Louis committed
            geom_polygon(data=df_france,
                         aes(x=long, y=lat, group=group),
                         color=NA, fill="grey97")
Heraut Louis's avatar
Heraut Louis committed
        # If the river shapefile exists
Heraut Louis's avatar
Heraut Louis committed
        if (!is.null(df_river)) {
Heraut Louis's avatar
Heraut Louis committed
            # Plot the river
Heraut Louis's avatar
Heraut Louis committed
            map = map +
                geom_path(data=df_river,
                          aes(x=long, y=lat, group=group),
                          color="grey85", size=sizerv)   
        }
        
        map = map +
Heraut Louis's avatar
Heraut Louis committed
            # Plot the hydrological basin
Heraut Louis's avatar
Heraut Louis committed
            geom_polygon(data=df_bassin,
                         aes(x=long, y=lat, group=group),
                         color="grey70", fill=NA, size=sizebs) +
Heraut Louis's avatar
Heraut Louis committed
            # Plot the hydrological sub-basin
            geom_polygon(data=df_subbassin,
                         aes(x=long, y=lat, group=group),
                         color="grey70", fill=NA, size=sizebs) +
Heraut Louis's avatar
Heraut Louis committed
            # Plot the countour of France
Heraut Louis's avatar
Heraut Louis committed
            geom_polygon(data=df_france,
                         aes(x=long, y=lat, group=group),
                         color="grey40", fill=NA, size=sizefr)
Heraut Louis's avatar
Heraut Louis committed

        # If the sea needs to be shown
Heraut Louis's avatar
Heraut Louis committed
        if (showSea) {
Heraut Louis's avatar
Heraut Louis committed
            # Leaves space around the France
Heraut Louis's avatar
Heraut Louis committed
            xlim = c(280000, 790000)
            ylim = c(6110000, 6600000)
Heraut Louis's avatar
Heraut Louis committed
        # Otherwise
Heraut Louis's avatar
Heraut Louis committed
        } else {
Heraut Louis's avatar
Heraut Louis committed
            # Leaves minimal space around France
Heraut Louis's avatar
Heraut Louis committed
            xlim = c(305000, 790000)
            ylim = c(6135000, 6600000)
        }

Heraut Louis's avatar
Heraut Louis committed
        # If there is no specified station code to highlight (mini map)
Heraut Louis's avatar
Heraut Louis committed
        if (is.null(codeLight)) {
Heraut Louis's avatar
Heraut Louis committed
            # Sets a legend scale start
Heraut Louis's avatar
Heraut Louis committed
            xmin = gpct(7, xlim, shift=TRUE)
Heraut Louis's avatar
Heraut Louis committed
            # Sets graduations
Heraut Louis's avatar
Heraut Louis committed
            xint = c(0, 10*1E3, 50*1E3, 100*1E3)
Heraut Louis's avatar
Heraut Louis committed
            # Sets the y postion
Heraut Louis's avatar
Heraut Louis committed
            ymin = gpct(5, ylim, shift=TRUE)
Heraut Louis's avatar
Heraut Louis committed
            # Sets the height of graduations
Heraut Louis's avatar
Heraut Louis committed
            ymax = ymin + gpct(1, ylim)
Heraut Louis's avatar
Heraut Louis committed
            # Size of the value
Heraut Louis's avatar
Heraut Louis committed
            size = 3
Heraut Louis's avatar
Heraut Louis committed
            # Size of the 'km' unit
Heraut Louis's avatar
Heraut Louis committed
            sizekm = 2.5
Heraut Louis's avatar
Heraut Louis committed
        # If there is a specified station code
Heraut Louis's avatar
Heraut Louis committed
        } else {
Heraut Louis's avatar
Heraut Louis committed
            # Same but with less graduation and smaller size
Heraut Louis's avatar
Heraut Louis committed
            xmin = gpct(2, xlim, shift=TRUE)
Heraut Louis's avatar
Heraut Louis committed
            xint = c(0, 100*1E3)
            ymin = gpct(1, ylim, shift=TRUE)
            ymax = ymin + gpct(3, ylim)
            size = 2
            sizekm = 1.5
        }
        
        map = map +
Heraut Louis's avatar
Heraut Louis committed
            # Adds the base line of the scale
Heraut Louis's avatar
Heraut Louis committed
            geom_line(aes(x=c(xmin, max(xint)+xmin),
                          y=c(ymin, ymin)),
                      color="grey40", size=0.2) +
Heraut Louis's avatar
Heraut Louis committed
            # Adds the 'km' unit
Heraut Louis's avatar
Heraut Louis committed
            annotate("text",
                     x=max(xint)+xmin+gpct(1, xlim), y=ymin,
                     vjust=0, hjust=0, label="km",
                     color="grey40", size=sizekm)
Heraut Louis's avatar
Heraut Louis committed
        # For all graduations
Heraut Louis's avatar
Heraut Louis committed
        for (x in xint) {
            map = map +
Heraut Louis's avatar
Heraut Louis committed
                # Draws the tick
Heraut Louis's avatar
Heraut Louis committed
                annotate("segment",
                         x=x+xmin, xend=x+xmin, y=ymin, yend=ymax,
                         color="grey40", size=0.2) +
Heraut Louis's avatar
Heraut Louis committed
                # Adds the value
Heraut Louis's avatar
Heraut Louis committed
                annotate("text",
                         x=x+xmin, y=ymax+gpct(0.5, ylim),
                         vjust=0, hjust=0.5, label=x/1E3,
                         color="grey40", size=size)
        }
        
Heraut Louis's avatar
Heraut Louis committed
        map = map +
            # Allows to crop shapefile without graphical problem
Heraut Louis's avatar
Heraut Louis committed
            coord_sf(xlim=xlim, ylim=ylim,
                     expand=FALSE)
Heraut Louis's avatar
Heraut Louis committed
        
        # If there is no margins specified
Heraut Louis's avatar
Heraut Louis committed
        if (is.null(margin)) {
Heraut Louis's avatar
Heraut Louis committed
            # Sets all margins to 0
            map = map + 
Heraut Louis's avatar
Heraut Louis committed
                theme(plot.margin=margin(t=0, r=0, b=0, l=0, unit="mm"))
Heraut Louis's avatar
Heraut Louis committed
            # Otherwise
Heraut Louis's avatar
Heraut Louis committed
        } else {
Heraut Louis's avatar
Heraut Louis committed
            # Sets margins to the given ones
            map = map + 
Heraut Louis's avatar
Heraut Louis committed
                theme(plot.margin=margin)
        }
Heraut Louis's avatar
Heraut Louis committed

        # Blank vector to store data about station
Heraut Louis's avatar
Heraut Louis committed
        lon = c()
        lat = c()
        fill = c()
        shape = c()
        trend = c()
        p_threshold_Ok = c()
Heraut Louis's avatar
Heraut Louis committed
        # For all code
Heraut Louis's avatar
Heraut Louis committed
        for (k in 1:nCode) {
            # Gets the code
            code = Code[k]
Heraut Louis's avatar
Heraut Louis committed
            # Extracts the data corresponding to the current variable
Heraut Louis's avatar
Heraut Louis committed
            df_data = list_df2plot[[i]]$data
Heraut Louis's avatar
Heraut Louis committed
            # Extracts the trend corresponding to the
            # current variable
Heraut Louis's avatar
Heraut Louis committed
            df_trend = list_df2plot[[i]]$trend
            p_threshold = list_df2plot[[i]]$p_threshold
Heraut Louis's avatar
Heraut Louis committed
            # Extracts the data corresponding to the code
            df_data_code = df_data[df_data$code == code,]
            # Extracts the trend corresponding to the code
Heraut Louis's avatar
Heraut Louis committed
            df_trend_code = df_trend[df_trend$code == code,]
Heraut Louis's avatar
Heraut Louis committed

            # Gets the associated time info
Heraut Louis's avatar
Heraut Louis committed
            # Start = Start_code[Code_code == code][[1]][idPer]
            # End = End_code[Code_code == code][[1]][idPer]

            # Gets the associated time info
            Start = tab_Start[k, i, idPer]
            End = tab_End[k, i, idPer]
            Periods = tab_Periods[k, i, idPer]
Heraut Louis's avatar
Heraut Louis committed

            # Extracts the corresponding data for the period
Heraut Louis's avatar
Heraut Louis committed
            df_data_code_per =
                df_data_code[df_data_code$Date >= Start 
                             & df_data_code$Date <= End,]
Heraut Louis's avatar
Heraut Louis committed
            # Same for trend
Heraut Louis's avatar
Heraut Louis committed
            df_trend_code_per = 
                df_trend_code[df_trend_code$period_start == Start 
                              & df_trend_code$period_end == End,]
Heraut Louis's avatar
Heraut Louis committed

            # Computes the number of trend analysis selected
Heraut Louis's avatar
Heraut Louis committed
            Ntrend = nrow(df_trend_code_per)
Heraut Louis's avatar
Heraut Louis committed
            # If there is more than one trend on the same period
Heraut Louis's avatar
Heraut Louis committed
            if (Ntrend > 1) {
Heraut Louis's avatar
Heraut Louis committed
                # Takes only the first because they are similar
Heraut Louis's avatar
Heraut Louis committed
                df_trend_code_per = df_trend_code_per[1,]
            }
Heraut Louis's avatar
Heraut Louis committed

            # Computes the mean of the data on the period
Heraut Louis's avatar
Heraut Louis committed
            dataMean = mean(df_data_code_per$Value, na.rm=TRUE)
Heraut Louis's avatar
Heraut Louis committed
            # Normalises the trend value by the mean of the data
Heraut Louis's avatar
Heraut Louis committed
            trendMean = df_trend_code_per$trend / dataMean

Heraut Louis's avatar
Heraut Louis committed
            # Computes the color associated to the mean trend
Heraut Louis's avatar
Heraut Louis committed
            color_res = get_color(trendMean, 
                                  minTrendMean[idPer, i],
                                  maxTrendMean[idPer, i],
                                  palette_name='perso',
                                  reverse=TRUE,
Heraut Louis's avatar
Heraut Louis committed
                                  ncolor=256)
Heraut Louis's avatar
Heraut Louis committed
            # Computes the colorbar info 
Heraut Louis's avatar
Heraut Louis committed
            palette_res = get_palette(minTrendMean[idPer, i],
                                      maxTrendMean[idPer, i],
                                      palette_name='perso',
                                      reverse=TRUE,
Heraut Louis's avatar
Heraut Louis committed
                                      ncolor=256,
Heraut Louis's avatar
Heraut Louis committed
                                      nbTick=nbTick)
Heraut Louis's avatar
Heraut Louis committed

            # If it is significative
Heraut Louis's avatar
Heraut Louis committed
            if (df_trend_code_per$p <= p_threshold){
Heraut Louis's avatar
Heraut Louis committed
                # The computed color is stored
Heraut Louis's avatar
Heraut Louis committed
                filltmp = color_res
Heraut Louis's avatar
Heraut Louis committed
                # If the mean tend is positive
Heraut Louis's avatar
Heraut Louis committed
                if (trendMean >= 0) {
Heraut Louis's avatar
Heraut Louis committed
                    # Uses a triangle up for the shape of the marker
Heraut Louis's avatar
Heraut Louis committed
                    shapetmp = 24
Heraut Louis's avatar
Heraut Louis committed
                # If negative
Heraut Louis's avatar
Heraut Louis committed
                } else {
Heraut Louis's avatar
Heraut Louis committed
                    # Uses a triangle down for the shape of the marker
Heraut Louis's avatar
Heraut Louis committed
                    shapetmp = 25
                }
Heraut Louis's avatar
Heraut Louis committed
            # If it is not significative
            } else {
                # The fill color is grey
Heraut Louis's avatar
Heraut Louis committed
                filltmp = 'grey97'
Heraut Louis's avatar
Heraut Louis committed
                # The marker is a circle
Heraut Louis's avatar
Heraut Louis committed
                shapetmp = 21
            }

Heraut Louis's avatar
Heraut Louis committed
            # Extracts the localisation of the current station
Heraut Louis's avatar
Heraut Louis committed
            lontmp =
                df_meta[df_meta$code == code,]$L93X_m_BH            
            lattmp =
                df_meta[df_meta$code == code,]$L93Y_m_BH 

Heraut Louis's avatar
Heraut Louis committed
            # Stores all the parameters
Heraut Louis's avatar
Heraut Louis committed
            lon = c(lon, lontmp)
            lat = c(lat, lattmp)
            fill = c(fill, filltmp)
            shape = c(shape, shapetmp)
            trend = c(trend, trendMean)
Heraut Louis's avatar
Heraut Louis committed
            # If the trend analysis is significative a TRUE is stored
Heraut Louis's avatar
Heraut Louis committed
            p_threshold_Ok = c(p_threshold_Ok,
                               df_trend_code_per$p <= p_threshold)
        }
Heraut Louis's avatar
Heraut Louis committed
        # Creates a tibble to stores all the data to plot
Heraut Louis's avatar
Heraut Louis committed
        plot_map = tibble(lon=lon, lat=lat, fill=fill,
                          shape=shape, code=Code)

Heraut Louis's avatar
Heraut Louis committed
        # If there is no specified station code to highlight (mini map)
Heraut Louis's avatar
Heraut Louis committed
        if (is.null(codeLight)) {
            map = map +
Heraut Louis's avatar
Heraut Louis committed
                # Plots the trend point
Heraut Louis's avatar
Heraut Louis committed
                geom_point(data=plot_map,
                           aes(x=lon, y=lat),
                           shape=shape, size=5, stroke=1,
                           color='grey50', fill=fill)
Heraut Louis's avatar
Heraut Louis committed
        # If there is a specified station code
Heraut Louis's avatar
Heraut Louis committed
        } else {
Heraut Louis's avatar
Heraut Louis committed
            # Extract data of all stations not to highlight
Heraut Louis's avatar
Heraut Louis committed
            plot_map_codeNo = plot_map[plot_map$code != codeLight,]
Heraut Louis's avatar
Heraut Louis committed
            # Extract data of the station to highlight
Heraut Louis's avatar
Heraut Louis committed
            plot_map_code = plot_map[plot_map$code == codeLight,]
Heraut Louis's avatar
Heraut Louis committed

            # Plots only the localisation
Heraut Louis's avatar
Heraut Louis committed
            map = map +
Heraut Louis's avatar
Heraut Louis committed
                # For all stations not to highlight
Heraut Louis's avatar
Heraut Louis committed
                geom_point(data=plot_map_codeNo,
                           aes(x=lon, y=lat),
                           shape=21, size=0.5, stroke=0.5,
Heraut Louis's avatar
Heraut Louis committed
                           color='grey50', fill='grey50') +
Heraut Louis's avatar
Heraut Louis committed
                # For the station to highlight
Heraut Louis's avatar
Heraut Louis committed
                geom_point(data=plot_map_code,
                           aes(x=lon, y=lat),
                           shape=21, size=1.5, stroke=0.5,
                           color='grey40', fill='grey40')
        }
Heraut Louis's avatar
Heraut Louis committed
        
        # Extracts the position of the tick of the colorbar
Heraut Louis's avatar
Heraut Louis committed
        posTick = palette_res$posTick
Heraut Louis's avatar
Heraut Louis committed
        # Extracts the label of the tick of the colorbar
Heraut Louis's avatar
Heraut Louis committed
        labTick = palette_res$labTick
Heraut Louis's avatar
Heraut Louis committed
        # Extracts the color corresponding to the tick of the colorbar
Heraut Louis's avatar
Heraut Louis committed
        colTick = palette_res$colTick

Heraut Louis's avatar
Heraut Louis committed
        # Spreading of the colorbar
        valNorm = nbTick * 10
        # Normalisation of the position of ticks
Heraut Louis's avatar
Heraut Louis committed
        ytick = posTick / max(posTick) * valNorm
Heraut Louis's avatar
Heraut Louis committed
        # Formatting of label in pourcent
Heraut Louis's avatar
Heraut Louis committed
        labTick = as.character(round(labTick*100, 2))

Heraut Louis's avatar
Heraut Louis committed
        # X position of ticks all similar
        xtick = rep(0, times=nbTick)

        # Creates a tibble to store all parameters of colorbar
Heraut Louis's avatar
Heraut Louis committed
        plot_palette = tibble(xtick=xtick, ytick=ytick,
                              colTick=colTick, labTick=labTick)
Heraut Louis's avatar
Heraut Louis committed

        # New plot with void theme
Heraut Louis's avatar
Heraut Louis committed
        title = ggplot() + theme_void() +
Heraut Louis's avatar
Heraut Louis committed
            # Plots separation line
Heraut Louis's avatar
Heraut Louis committed
            geom_line(aes(x=c(-0.3, 3.3), y=c(0.05, 0.05)),
                      size=0.6, color="#00A3A8") +
Heraut Louis's avatar
Heraut Louis committed
            # Writes title
Heraut Louis's avatar
Heraut Louis committed
            geom_shadowtext(data=tibble(x=-0.3, y=0.2,
Heraut Louis's avatar
Heraut Louis committed
                                        label=var),
Heraut Louis's avatar
Heraut Louis committed
                            aes(x=x, y=y, label=label),
                            fontface="bold",
                            color="#00A3A8",
                            bg.colour="white",
                            hjust=0, vjust=0, size=10) +
Heraut Louis's avatar
Heraut Louis committed
            # X axis
Heraut Louis's avatar
Heraut Louis committed
            scale_x_continuous(limits=c(-1, 1 + 3),
                               expand=c(0, 0)) +
Heraut Louis's avatar
Heraut Louis committed
            # Y axis
Heraut Louis's avatar
Heraut Louis committed
            scale_y_continuous(limits=c(0, 10),
                               expand=c(0, 0)) +
Heraut Louis's avatar
Heraut Louis committed
            # Margin
Heraut Louis's avatar
Heraut Louis committed
            theme(plot.margin=margin(t=5, r=5, b=0, l=0, unit="mm"))
        
Heraut Louis's avatar
Heraut Louis committed
        # New plot with void theme
Heraut Louis's avatar
Heraut Louis committed
        pal = ggplot() + theme_void() +
Heraut Louis's avatar
Heraut Louis committed
            # Plots the point of the colorbar
Heraut Louis's avatar
Heraut Louis committed
            geom_point(data=plot_palette,
                       aes(x=xtick, y=ytick),
                       shape=21, size=5, stroke=1,
                       color='white', fill=colTick)

        pal = pal +
Heraut Louis's avatar
Heraut Louis committed
            # Name of the colorbar
Heraut Louis's avatar
Heraut Louis committed
            annotate('text',
                     x=-0.3, y= valNorm + 23,
                     label="Tendance",
                     hjust=0, vjust=0.5,
                     size=6, color='grey40') +
Heraut Louis's avatar
Heraut Louis committed
            # Unit legend of the colorbar
Heraut Louis's avatar
Heraut Louis committed
            annotate('text',
                     x=-0.2, y= valNorm + 13,
                     label=bquote(bold("% par an")),
                     hjust=0, vjust=0.5,
                     size=4, color='grey40')
Heraut Louis's avatar
Heraut Louis committed
        # For all the ticks
        for (j in 1:nbTick) {
Heraut Louis's avatar
Heraut Louis committed
            pal = pal +
Heraut Louis's avatar
Heraut Louis committed
                # Adds the value
Heraut Louis's avatar
Heraut Louis committed
                annotate('text', x=xtick[j]+0.3,
                         y=ytick[j],
                         label=bquote(bold(.(labTick[j]))),
                         hjust=0, vjust=0.7, 
                         size=3, color='grey40')
        }

        pal = pal +
Heraut Louis's avatar
Heraut Louis committed
            # Up triangle in the marker legend
Heraut Louis's avatar
Heraut Louis committed
            geom_point(aes(x=0, y=-20),
                       shape=24, size=4, stroke=1,
                       color='grey50', fill='grey97') +
Heraut Louis's avatar
Heraut Louis committed
            # Up triangle text legend
Heraut Louis's avatar
Heraut Louis committed
            annotate('text',
                     x=0.3, y=-20,
Heraut Louis's avatar
Heraut Louis committed
                     label=bquote(bold("Hausse significative à 10%")),
Heraut Louis's avatar
Heraut Louis committed
                     hjust=0, vjust=0.5,
                     size=3, color='grey40')

        pal = pal +
Heraut Louis's avatar
Heraut Louis committed
            # Circle in the marker legend
Heraut Louis's avatar
Heraut Louis committed
            geom_point(aes(x=0, y=-29),
                       shape=21, size=4, stroke=1,
                       color='grey50', fill='grey97') +
Heraut Louis's avatar
Heraut Louis committed
            # Circle text legend
Heraut Louis's avatar
Heraut Louis committed
            annotate('text',
                     x=0.3, y=-29,
Heraut Louis's avatar
Heraut Louis committed
                     label=bquote(bold("Non significatif à 10%")),
Heraut Louis's avatar
Heraut Louis committed
                     hjust=0, vjust=0.7,
                     size=3, color='grey40')

        pal = pal +
Heraut Louis's avatar
Heraut Louis committed
            # Down triangle in the marker legend
Heraut Louis's avatar
Heraut Louis committed
            geom_point(aes(x=0, y=-40),
                       shape=25, size=4, stroke=1,
                       color='grey50', fill='grey97') +
Heraut Louis's avatar
Heraut Louis committed
            # Down triangle text legend
Heraut Louis's avatar
Heraut Louis committed
            annotate('text',
                     x=0.3, y=-40,
Heraut Louis's avatar
Heraut Louis committed
                     label=bquote(bold("Baisse significative à 10%")),
Heraut Louis's avatar
Heraut Louis committed
                     hjust=0, vjust=0.5,
                     size=3, color='grey40')
Heraut Louis's avatar
Heraut Louis committed

        # Normalises all the trend values for each station
        # according to the colorbar
Heraut Louis's avatar
Heraut Louis committed
        yTrend = (trend - minTrendMean[idPer, i]) /
            (maxTrendMean[idPer, i] - minTrendMean[idPer, i]) * valNorm
Heraut Louis's avatar
Heraut Louis committed
        # Takes only the significative ones
Heraut Louis's avatar
Heraut Louis committed
        yTrend = yTrend[p_threshold_Ok]

        ## Random distribution ##
        # xTrend = rnorm(length(yTrend), mean=1.75, sd=0.1)

Heraut Louis's avatar
Heraut Louis committed
        ## Histogram distribution ##
        # Computes the histogram of the trend
Heraut Louis's avatar
Heraut Louis committed
        res_hist = hist(yTrend, breaks=ytick, plot=FALSE)
Heraut Louis's avatar
Heraut Louis committed
        # Extracts the number of counts per cells
Heraut Louis's avatar
Heraut Louis committed
        counts = res_hist$counts
Heraut Louis's avatar
Heraut Louis committed
        # Extracts limits of cells 
Heraut Louis's avatar
Heraut Louis committed
        breaks = res_hist$breaks
Heraut Louis's avatar
Heraut Louis committed
        # Extracts middle of cells 
Heraut Louis's avatar
Heraut Louis committed
        mids = res_hist$mids

Heraut Louis's avatar
Heraut Louis committed
        # Blank vectors to store position of points of
        # the distribution to plot
Heraut Louis's avatar
Heraut Louis committed
        xTrend = c()
        yTrend = c()
Heraut Louis's avatar
Heraut Louis committed
        # Start X position of the distribution
Heraut Louis's avatar
Heraut Louis committed
        start_hist = 1.25
Heraut Louis's avatar
Heraut Louis committed
        # X separation bewteen point
Heraut Louis's avatar
Heraut Louis committed
        hist_sep = 0.15
Heraut Louis's avatar
Heraut Louis committed
        # For all cells of the histogram
Heraut Louis's avatar
Heraut Louis committed
        for (ii in 1:length(mids)) {
Heraut Louis's avatar
Heraut Louis committed
            # If the count in the current cell is not zero
Heraut Louis's avatar
Heraut Louis committed
            if (counts[ii] != 0) {
Heraut Louis's avatar
Heraut Louis committed
                # Stores the X positions of points of the distribution
                # for the current cell
Heraut Louis's avatar
Heraut Louis committed
                xTrend = c(xTrend,
                           seq(start_hist,
                               start_hist+(counts[ii]-1)*hist_sep,
                               by=hist_sep))
            }
Heraut Louis's avatar
Heraut Louis committed
            # Stores the Y position which is the middle of the
            # current cell the number of times it has been counted
Heraut Louis's avatar
Heraut Louis committed
            yTrend = c(yTrend, rep(mids[ii], times=counts[ii]))
        }

        ## No touch distribution ##
        # start_hist = 1.25
        # min_xsep = 0.15
        # min_ysep = 4

        # xTrend = rep(start_hist, times=length(yTrend))
        
        # for (ii in 1:length(yTrend)) {

        #     yTrendtmp = yTrend
        #     yTrendtmp[ii] = 1E99
                
        #     isinf_ysep = abs(yTrendtmp - yTrend[ii]) < min_ysep

        #     if (any(isinf_ysep) & !all(xTrend[which(isinf_ysep)] > start_hist)) {
        #         xTrend[ii] = max(xTrend[which(isinf_ysep)]) + min_xsep
        #     }
        # }
        
Heraut Louis's avatar
Heraut Louis committed
        # Makes a tibble to plot the trend distribution
Heraut Louis's avatar
Heraut Louis committed
        plot_trend = tibble(xTrend=xTrend, yTrend=yTrend)
        
        pal = pal +
Heraut Louis's avatar
Heraut Louis committed
            # Plots the point of the trend distribution
Heraut Louis's avatar
Heraut Louis committed
            geom_point(data=plot_trend,
                       aes(x=xTrend, y=yTrend),
                       # shape=21, size=1,
                       # color="grey20", fill="grey20")
                       alpha=0.4)


        pal = pal +
Heraut Louis's avatar
Heraut Louis committed
            # Arrow to show a worsening of the situation
Heraut Louis's avatar
Heraut Louis committed
            geom_segment(aes(x=2.7, y=valNorm*0.75,
                             xend=2.7, yend=valNorm*0.25),
                         color='grey50', size=0.3,
                         arrow=arrow(length=unit(2, "mm"))) +
Heraut Louis's avatar
Heraut Louis committed
            # Text associated to the arrow
Heraut Louis's avatar
Heraut Louis committed
            annotate('text',
                     x=2.8, y=valNorm*0.5,
Heraut Louis's avatar
Heraut Louis committed
                     label= "Plus sévère",
Heraut Louis's avatar
Heraut Louis committed
                     angle=90,
                     hjust=0.5, vjust=1,
                     size=3, color='grey50')
        
        
        pal = pal +
Heraut Louis's avatar
Heraut Louis committed
            # X axis of the colorbar
Heraut Louis's avatar
Heraut Louis committed
            scale_x_continuous(limits=c(-1, 1 + 3),
                               expand=c(0, 0)) +
Heraut Louis's avatar
Heraut Louis committed
            # Y axis of the colorbar
Heraut Louis's avatar
Heraut Louis committed
            scale_y_continuous(limits=c(-60, valNorm + 35),
                               expand=c(0, 0)) +
Heraut Louis's avatar
Heraut Louis committed
            # Margin of the colorbar
Heraut Louis's avatar
Heraut Louis committed
            theme(plot.margin=margin(t=0, r=5, b=5, l=0, unit="mm"))

Heraut Louis's avatar
Heraut Louis committed
        # Stores the map, the title and the colorbarin a list
Heraut Louis's avatar
Heraut Louis committed
        Map = list(map, title, pal)
Heraut Louis's avatar
Heraut Louis committed
        # Arranges the graphical object
Heraut Louis's avatar
Heraut Louis committed
        plot = grid.arrange(grobs=Map, layout_matrix=
                                           matrix(c(1, 1, 1, 2,
                                                    1, 1, 1, 3),
                                                  nrow=2, byrow=TRUE))

Heraut Louis's avatar
Heraut Louis committed
        # If there is no specified station code to highlight (mini map)
Heraut Louis's avatar
Heraut Louis committed
        if (is.null(codeLight)) {
            # Saving matrix plot
            ggsave(plot=plot,
                   path=outdirTmp,
                   filename=paste(outname, '.pdf', sep=''),
                   width=29.7, height=21, units='cm', dpi=100)
        }
    }
Heraut Louis's avatar
Heraut Louis committed
    # Returns the map object
Heraut Louis's avatar
Heraut Louis committed
    return (map)
}