From f89d857415a76ca2d09010414ca1d5279819439c Mon Sep 17 00:00:00 2001 From: "louis.heraut" <louis.heraut@inrae.fr> Date: Sun, 19 Dec 2021 04:43:26 +0100 Subject: [PATCH] End layout --- plotting/panel.R | 1053 ++++++++++++++++++++++++++++------------------ script.R | 12 +- 2 files changed, 648 insertions(+), 417 deletions(-) diff --git a/plotting/panel.R b/plotting/panel.R index f508e29..0993455 100644 --- a/plotting/panel.R +++ b/plotting/panel.R @@ -686,7 +686,7 @@ time_panel = function (df_data_code, df_trend_code, type, p_threshold=0.1, missR } -matrice_panel = function (list_df2plot, df_meta, trend_period, mean_period, slice=NULL, outdirTmp='', outnameTmp='matrix', A3=FALSE) { +matrice_panel = function (list_df2plot, df_meta, trend_period, mean_period, slice=NULL, outdirTmp='', outnameTmp='matrix', title=NULL, A3=FALSE) { nbp = length(list_df2plot) @@ -694,518 +694,745 @@ matrice_panel = function (list_df2plot, df_meta, trend_period, mean_period, slic Code = levels(factor(df_meta$code)) nCode = length(Code) - if (!is.null(slice)) { + # nbp = length(list_df2plot) - # By - nMat = as.integer(nCode/slice) + 1 - sublist_df2plot = list_df2plot + # # Get all different stations code + # Code = levels(factor(df_meta$code)) + # nCode = length(Code) - for (i in 1:nMat) { + df_trend = list_df2plot[[1]]$trend - subdf_meta = df_meta[(slice*(i-1)+1):(slice*i),] - subdf_meta = subdf_meta[!is.na(subdf_meta$code),] - subCode = subdf_meta$code - - for (j in 1:nbp) { - df_datatmp = list_df2plot[[j]]$data - df_trendtmp = list_df2plot[[j]]$trend + # Convert 'trend_period' to list + trend_period = as.list(trend_period) + # Number of trend period + nPeriod_trend = length(trend_period) + + nPeriod_max = 0 + for (code in Code) { + + df_trend_code = df_trend[df_trend$code == code,] - subdf_data = df_datatmp[(df_datatmp$code %in% subCode),] - subdf_trend = df_trendtmp[(df_trendtmp$code %in% subCode),] - - sublist_df2plot[[j]]$data = subdf_data - sublist_df2plot[[j]]$trend = subdf_trend - } - - mat = matrice_panel(sublist_df2plot, - subdf_meta, - trend_period=trend_period, - mean_period=mean_period, - outdirTmp=outdirTmp, - outnameTmp=paste(outnameTmp, - '_', i, - sep=''), - A3=A3) - } + Start = df_trend_code$period_start + UStart = levels(factor(Start)) + + End = df_trend_code$period_end + UEnd = levels(factor(End)) - } else { + nPeriod = max(length(UStart), length(UEnd)) - print(paste('matrix :', outnameTmp)) - # nbp = length(list_df2plot) + if (nPeriod > nPeriod_max) { + nPeriod_max = nPeriod + } + } + + Start_code = vector(mode='list', length=nCode) + End_code = vector(mode='list', length=nCode) + Code_code = vector(mode='list', length=nCode) + Periods_code = vector(mode='list', length=nCode) - # # Get all different stations code - # Code = levels(factor(df_meta$code)) - # nCode = length(Code) + for (j in 1:nCode) { + + code = Code[j] - df_trend = list_df2plot[[1]]$trend + df_trend_code = df_trend[df_trend$code == code,] - nPeriod_max = 0 - for (code in Code) { - - df_trend_code = df_trend[df_trend$code == code,] + Start = df_trend_code$period_start + UStart = levels(factor(Start)) + + End = df_trend_code$period_end + UEnd = levels(factor(End)) + + nPeriod = max(length(UStart), length(UEnd)) - Start = df_trend_code$period_start - UStart = levels(factor(Start)) - - End = df_trend_code$period_end - UEnd = levels(factor(End)) - - nPeriod = max(length(UStart), length(UEnd)) + Periods = c() - if (nPeriod > nPeriod_max) { - nPeriod_max = nPeriod - } + for (i in 1:nPeriod_trend) { + Periods = append(Periods, + paste(Start[i], + End[i], + sep=' / ')) } + + Start_code[[j]] = Start + End_code[[j]] = End + Code_code[[j]] = code + Periods_code[[j]] = Periods - Start_code = vector(mode='list', length=nCode) - End_code = vector(mode='list', length=nCode) - Code_code = vector(mode='list', length=nCode) - Periods_code = vector(mode='list', length=nCode) + } - for (j in 1:nCode) { - - code = Code[j] + TrendMean_code = array(rep(1, nPeriod_trend*nbp*nCode), + dim=c(nPeriod_trend, nbp, nCode)) - df_trend_code = df_trend[df_trend$code == code,] + for (j in 1:nPeriod_trend) { - Start = df_trend_code$period_start - UStart = levels(factor(Start)) + for (k in 1:nCode) { - End = df_trend_code$period_end - UEnd = levels(factor(End)) + code = Code[k] - nPeriod = max(length(UStart), length(UEnd)) + for (i in 1:nbp) { + + df_data = list_df2plot[[i]]$data + df_trend = list_df2plot[[i]]$trend + p_threshold = list_df2plot[[i]]$p_threshold - Periods = c() + df_data_code = df_data[df_data$code == code,] + df_trend_code = df_trend[df_trend$code == code,] - for (i in 1:nPeriod_max) { - Periods = append(Periods, - paste(substr(Start[i], 1, 4), - substr(End[i], 1, 4), - sep=' / ')) - } + Start = Start_code[Code_code == code][[1]][j] + End = End_code[Code_code == code][[1]][j] + Periods = Periods_code[Code_code == code][[1]][j] - Start_code[[j]] = Start - End_code[[j]] = End - Code_code[[j]] = code - Periods_code[[j]] = Periods - + df_data_code_per = + df_data_code[df_data_code$Date >= Start + & df_data_code$Date <= End,] + + df_trend_code_per = + df_trend_code[df_trend_code$period_start == Start + & df_trend_code$period_end == End,] + + Ntrend = nrow(df_trend_code_per) + if (Ntrend > 1) { + df_trend_code_per = df_trend_code_per[1,] + } + + dataMean = mean(df_data_code_per$Qm3s, na.rm=TRUE) + trendMean = df_trend_code_per$trend / dataMean + + TrendMean_code[j, i, k] = trendMean + } } + } - TrendMean_code = array(rep(1, nPeriod_max*nbp*nCode), - dim=c(nPeriod_max, nbp, nCode)) + minTrendMean = apply(TrendMean_code, c(1, 2), min, na.rm=TRUE) + maxTrendMean = apply(TrendMean_code, c(1, 2), max, na.rm=TRUE) - for (j in 1:nPeriod_max) { + + Periods_trend = c() + NPeriod_trend = c() + Type_trend = list() + Code_trend = c() + Pthresold_trend = c() + TrendMean_trend = c() + DataMean_trend = c() + Fill_trend = c() + Color_trend = c() + + for (j in 1:nPeriod_trend) { - for (k in 1:nCode) { - - code = Code[k] + for (code in Code) { + + for (i in 1:nbp) { + df_data = list_df2plot[[i]]$data + df_trend = list_df2plot[[i]]$trend + p_threshold = list_df2plot[[i]]$p_threshold + type = list_df2plot[[i]]$type - for (i in 1:nbp) { - - df_data = list_df2plot[[i]]$data - df_trend = list_df2plot[[i]]$trend - p_threshold = list_df2plot[[i]]$p_threshold - - df_data_code = df_data[df_data$code == code,] - df_trend_code = df_trend[df_trend$code == code,] + df_data_code = df_data[df_data$code == code,] + df_trend_code = df_trend[df_trend$code == code,] - Start = Start_code[Code_code == code][[1]][j] - End = End_code[Code_code == code][[1]][j] - Periods = Periods_code[Code_code == code][[1]][j] + Start = Start_code[Code_code == code][[1]][j] + End = End_code[Code_code == code][[1]][j] + Periods = Periods_code[Code_code == code][[1]][j] - df_data_code_per = - df_data_code[df_data_code$Date >= Start - & df_data_code$Date <= End,] + df_data_code_per = + df_data_code[df_data_code$Date >= Start + & df_data_code$Date <= End,] - df_trend_code_per = - df_trend_code[df_trend_code$period_start == Start - & df_trend_code$period_end == End,] + df_trend_code_per = + df_trend_code[df_trend_code$period_start == Start + & df_trend_code$period_end == End,] - Ntrend = nrow(df_trend_code_per) - if (Ntrend > 1) { - df_trend_code_per = df_trend_code_per[1,] - } - - dataMean = mean(df_data_code_per$Qm3s, na.rm=TRUE) - trendMean = df_trend_code_per$trend / dataMean + Ntrend = nrow(df_trend_code_per) + if (Ntrend > 1) { + df_trend_code_per = df_trend_code_per[1,] + } + + dataMean = mean(df_data_code_per$Qm3s, na.rm=TRUE) + trendMean = df_trend_code_per$trend / dataMean - TrendMean_code[j, i, k] = trendMean + if (df_trend_code_per$p <= p_threshold){ + color_res = get_color(trendMean, + minTrendMean[j, i], + maxTrendMean[j, i], + palette_name='perso', + reverse=TRUE) + + fill = color_res + color = 'white' + Pthresold = p_thresold + } else { + fill = 'white' + color = 'grey85' + Pthresold = NA } + + Periods_trend = append(Periods_trend, Periods) + NPeriod_trend = append(NPeriod_trend, j) + Type_trend = append(Type_trend, type) + Code_trend = append(Code_trend, code) + Pthresold_trend = append(Pthresold_trend, Pthresold) + TrendMean_trend = append(TrendMean_trend, trendMean) + DataMean_trend = append(DataMean_trend, dataMean) + Fill_trend = append(Fill_trend, fill) + Color_trend = append(Color_trend, color) } } + } - minTrendMean = apply(TrendMean_code, c(1, 2), min, na.rm=TRUE) - maxTrendMean = apply(TrendMean_code, c(1, 2), max, na.rm=TRUE) - - Periods_trend = c() - NPeriod_trend = c() - Type_trend = list() - Code_trend = c() - Pthresold_trend = c() - TrendMean_trend = c() - DataMean_trend = c() - Fill_trend = c() - Color_trend = c() + + # If there is a 'mean_period' + if (!is.null(mean_period)) { + + Periods_mean = c() + NPeriod_mean = c() + Type_mean = list() + Code_mean = c() + DataMean_mean = c() + BreakMean_mean = c() + + # Convert 'mean_period' to list + mean_period = as.list(mean_period) + # Number of mean period + nPeriod_mean = length(mean_period) - for (j in 1:nPeriod_max) { + BreakMean_code = array(rep(1, nPeriod_mean*nbp*nCode), + dim=c(nPeriod_mean, nbp, nCode)) + + dataMeantmp = array(rep(NA, nbp*nCode), + dim=c(nbp, nCode)) + + # For all mean period + for (j in 1:nPeriod_mean) { - for (code in Code) { + for (k in 1:nCode) { + + code = Code[k] for (i in 1:nbp) { + df_data = list_df2plot[[i]]$data - df_trend = list_df2plot[[i]]$trend - p_threshold = list_df2plot[[i]]$p_threshold type = list_df2plot[[i]]$type df_data_code = df_data[df_data$code == code,] - df_trend_code = df_trend[df_trend$code == code,] - - Start = Start_code[Code_code == code][[1]][j] - End = End_code[Code_code == code][[1]][j] - Periods = Periods_code[Code_code == code][[1]][j] - + + # Get the current start and end of the sub period + Start_mean = mean_period[[j]][1] + End_mean = mean_period[[j]][2] + + # Extract the data corresponding to this sub period df_data_code_per = - df_data_code[df_data_code$Date >= Start - & df_data_code$Date <= End,] + df_data_code[df_data_code$Date >= Start_mean + & df_data_code$Date <= End_mean,] + + # Min for the sub period + Datemin = min(df_data_code_per$Date) + + # Max for the sub period + Datemax = max(df_data_code_per$Date) - df_trend_code_per = - df_trend_code[df_trend_code$period_start == Start - & df_trend_code$period_end == End,] + Periods = paste(Datemin, Datemax, + sep=' / ') - Ntrend = nrow(df_trend_code_per) - if (Ntrend > 1) { - df_trend_code_per = df_trend_code_per[1,] + # Mean of the flow over the sub period + dataMean = mean(df_data_code_per$Qm3s, + na.rm=TRUE) + + if (j > 1) { + Break = dataMean - dataMeantmp[i, k] + } else { + Break = NA } - dataMean = mean(df_data_code_per$Qm3s, na.rm=TRUE) - trendMean = df_trend_code_per$trend / dataMean - - if (df_trend_code_per$p <= p_threshold){ - color_res = get_color(trendMean, - minTrendMean[j, i], - maxTrendMean[j, i], - palette_name='perso', - reverse=TRUE) - - fill = color_res - color = 'white' - Pthresold = p_thresold - } else { - fill = 'white' - color = 'grey85' - Pthresold = NA - } - - Periods_trend = append(Periods_trend, Periods) - NPeriod_trend = append(NPeriod_trend, j) - Type_trend = append(Type_trend, type) - Code_trend = append(Code_trend, code) - Pthresold_trend = append(Pthresold_trend, Pthresold) - TrendMean_trend = append(TrendMean_trend, trendMean) - DataMean_trend = append(DataMean_trend, dataMean) - Fill_trend = append(Fill_trend, fill) - Color_trend = append(Color_trend, color) + BreakMean = Break / dataMeantmp[i, k] + BreakMean_code[j, i, k] = BreakMean + + dataMeantmp[i, k] = dataMean + + + Periods_mean = append(Periods_mean, Periods) + NPeriod_mean = append(NPeriod_mean, j) + Type_mean = append(Type_mean, type) + Code_mean = append(Code_mean, code) + DataMean_mean = append(DataMean_mean, dataMean) + BreakMean_mean = append(BreakMean_mean, + BreakMean) } } } + + minBreakMean = apply(BreakMean_code, c(1, 2), + min, na.rm=TRUE) + maxBreakMean = apply(BreakMean_code, c(1, 2), + max, na.rm=TRUE) - - Periods_mean = c() - NPeriod_mean = c() - Type_mean = list() - Code_mean = c() - DataMean_mean = c() - Break_mean = c() Fill_mean = c() Color_mean = c() - # If there is a 'mean_period' - if (!is.null(mean_period)) { - # Convert 'mean_period' to list - mean_period = as.list(mean_period) - # Number of mean period - nPeriod_mean = length(mean_period) - - dataMeantmp = array(rep(0, nbp*nCode), - dim=c(nbp, nCode)) + ii = 1 + for (j in 1:nPeriod_mean) { - # For all mean period - for (j in 1:nPeriod_mean) { - - for (k in 1:nCode) { + for (k in 1:nCode) { + + code = Code[k] - code = Code[k] + for (i in 1:nbp) { - for (i in 1:nbp) { - - df_data = list_df2plot[[i]]$data - type = list_df2plot[[i]]$type - - df_data_code = df_data[df_data$code == code,] - - # Get the current start and end of the sub period - Start_mean = mean_period[[j]][1] - End_mean = mean_period[[j]][2] - - # Extract the data corresponding to this sub period - df_data_code_per = - df_data_code[df_data_code$Date >= Start_mean - & df_data_code$Date <= End_mean,] - - # Min for the sub period - Datemin = min(df_data_code_per$Date) - - # Max for the sub period - Datemax = max(df_data_code_per$Date) - - Periods = paste(Datemin, Datemax, - sep=' / ') + BreakMean = BreakMean_mean[ii] + + color_res = get_color(BreakMean, + minBreakMean[j, i], + maxBreakMean[j, i], + palette_name='perso', + reverse=TRUE) + + fill = color_res + color = 'white' - fill = 'white' - color = 'grey85' - - # Mean of the flow over the sub period - dataMean = mean(df_data_code_per$Qm3s, - na.rm=TRUE) - - Break = dataMeantmp[i, k] - dataMean - dataMeantmp[i, k] = dataMean - - Periods_mean = append(Periods_mean, Periods) - NPeriod_mean = append(NPeriod_mean, j) - Type_mean = append(Type_mean, type) - Code_mean = append(Code_mean, code) - DataMean_mean = append(DataMean_mean, dataMean) - Break_mean = append(Break_mean, Break) - Fill_mean = append(Fill_mean, fill) - Color_mean = append(Color_mean, color) - - } + Fill_mean = append(Fill_mean, fill) + Color_mean = append(Color_mean, color) + + ii = ii + 1 } } } + } - height = length(Code) - width = nbp * 2 * nPeriod_max + nPeriod_max + nPeriod_mean * nbp + nPeriod_mean + nbp - - print(nPeriod_mean) - print(width) - - - options(repr.plot.width=width, repr.plot.height=height) - - mat = ggplot() + theme_ash + - - theme( - panel.border=element_blank(), - axis.text.x=element_blank(), - axis.text.y=element_blank(), - axis.ticks.y=element_blank(), - axis.ticks.x=element_blank(), - axis.title.y=element_blank(), - ) - - # xt = -1 - # yt = height + 1.75 - # Title = bquote(bold(Territoire)) - - # mat = mat + - # annotate("text", x=xt, y=yt, - # label=Title, - # hjust=0, vjust=0.5, - # size=6, color="#00A3A8") - - - ### Trend ### - for (j in 1:nPeriod_max) { - - Type_trend_per = Type_trend[NPeriod_trend == j] - Code_trend_per = Code_trend[NPeriod_trend == j] - Pthresold_trend_per = Pthresold_trend[NPeriod_trend == j] - TrendMean_trend_per = TrendMean_trend[NPeriod_trend == j] - DataMean_trend_per = DataMean_trend[NPeriod_trend == j] - Fill_trend_per = Fill_trend[NPeriod_trend == j] - Color_trend_per = Color_trend[NPeriod_trend == j] - Xtmp = as.integer(factor(as.character(Type_trend_per))) + if (is.null(slice)) { + slice = nCode + } - Xc = j + (j - 1)*nbp*2 - Xm = Xtmp + (j - 1)*nbp*2 + j - X = Xtmp + (j - 1)*nbp*2 + nbp + j + firstLetter = levels(factor(substr(Code, 1, 1))) + + for (fL in firstLetter) { - Y = as.integer(factor(Code_trend_per)) + print(paste('matrix for region :', fL)) - x = Xc - 0.4 - xend = X[length(X)] + 0.25 - y = height + 1 - yend = height + 1 + subCodefL = Code[substr(Code, 1, 1) == fL] + nsubCodefL = length(subCodefL) + + nMat = as.integer(nsubCodefL/slice) + 1 + + for (imat in 1:nMat) { + subCode = subCodefL[(slice*(imat-1)+1):(slice*imat)] - mat = mat + - annotate("segment", - x=x, xend=xend, - y=y, yend=yend, - color="grey40", size=0.35) + subCode = subCode[!is.na(subCode)] - yt = y + 0.15 - Start = trend_period[[j]][1] - End = trend_period[[j]][2] - periodName = bquote(bold('Période')~bold(.(as.character(j)))) - # bquote(bold(.(Start))~'/'~bold(.(End))) - - mat = mat + - annotate("text", x=x, y=yt, - label=periodName, - hjust=0, vjust=0.5, - size=3, color='grey40') + nsubCode = length(subCode) - for (i in 1:length(X)) { - mat = mat + - - gg_circle(r=0.45, xc=X[i], yc=Y[i], - fill=Fill_trend_per[i], color=Color_trend_per[i]) + - - gg_circle(r=0.45, xc=Xm[i], yc=Y[i], - fill='white', color='grey40') + - - gg_circle(r=0.45, xc=Xc, yc=Y[i], - fill='white', color='grey40') - } - - for (i in 1:length(TrendMean_trend_per)) { - trendMean = TrendMean_trend_per[i] - trendC = round(trendMean*100, 2) - - if (!is.na(Pthresold_trend_per[i])) { - Tcolor = 'white' - } else { - Tcolor = 'grey85' - } + subPeriods_trend = Periods_trend[substr(Code_trend, 1, 1) + == fL] + subNPeriod_trend = NPeriod_trend[substr(Code_trend, 1, 1) + == fL] + subType_trend = Type_trend[substr(Code_trend, 1, 1) + == fL] + subCode_trend = Code_trend[substr(Code_trend, 1, 1) + == fL] + subPthresold_trend = Pthresold_trend[substr(Code_trend, 1, 1) + == fL] + subTrendMean_trend = TrendMean_trend[substr(Code_trend, 1, 1) + == fL] + subDataMean_trend = DataMean_trend[substr(Code_trend, 1, 1) + == fL] + subFill_trend = Fill_trend[substr(Code_trend, 1, 1) + == fL] + subColor_trend = Color_trend[substr(Code_trend, 1, 1) + == fL] + + subPeriods_mean = Periods_mean[substr(Code_mean, 1, 1) + == fL] + subNPeriod_mean = NPeriod_mean[substr(Code_mean, 1, 1) + == fL] + subType_mean = Type_mean[substr(Code_mean, 1, 1) + == fL] + subCode_mean = Code_mean[substr(Code_mean, 1, 1) + == fL] + subDataMean_mean = DataMean_mean[substr(Code_mean, 1, 1) + == fL] + subBreakMean_mean = BreakMean_mean[substr(Code_mean, 1, 1) + == fL] + subFill_mean = Fill_mean[substr(Code_mean, 1, 1) + == fL] + subColor_mean = Color_mean[substr(Code_mean, 1, 1) + == fL] + + title = df_meta[df_meta$code == subCode[1],]$region_hydro + + + ### Plot ### + height = length(subCode) + width = nbp * 2 * nPeriod_trend + nPeriod_trend + nPeriod_mean * nbp + nPeriod_mean + nbp + + options(repr.plot.width=width, repr.plot.height=height) + + mat = ggplot() + theme_ash + - dataMean = round(DataMean_trend_per[i], 2) + theme( + panel.border=element_blank(), + axis.text.x=element_blank(), + axis.text.y=element_blank(), + axis.ticks.y=element_blank(), + axis.ticks.x=element_blank(), + axis.title.y=element_blank(), + plot.margin=margin(t=5, r=5, b=5, l=5, unit="mm") + ) + + xt = 1 - 6 + yt = height + 2 + Title = bquote(bold(.(title))) + + mat = mat + + annotate("text", x=xt, y=yt, + label=Title, + hjust=0, vjust=1, + size=6, color="#00A3A8") + + + ### Trend ### + for (j in 1:nPeriod_trend) { + + Type_trend_per = + subType_trend[subNPeriod_trend == j] + Code_trend_per = + subCode_trend[subNPeriod_trend == j] + Pthresold_trend_per = + subPthresold_trend[NPeriod_trend == j] + TrendMean_trend_per = + subTrendMean_trend[subNPeriod_trend == j] + DataMean_trend_per = + subDataMean_trend[subNPeriod_trend == j] + Fill_trend_per = + subFill_trend[subNPeriod_trend == j] + Color_trend_per = + subColor_trend[subNPeriod_trend == j] + + Xtmp = as.integer(factor(as.character(Type_trend_per))) + + Xc = j + (j - 1)*nbp*2 + Xm = Xtmp + (j - 1)*nbp*2 + j + X = Xtmp + (j - 1)*nbp*2 + nbp + j + + Y = as.integer(factor(Code_trend_per)) + + x = Xc - 0.4 + xend = X[length(X)] + 0.25 + y = height + 1 + yend = height + 1 mat = mat + - annotate('text', x=X[i], y=Y[i], - label=trendC, - hjust=0.5, vjust=0.5, - size=3, color=Tcolor) + + annotate("segment", + x=x, xend=xend, + y=y, yend=yend, + color="grey40", size=0.35) + + yt = y + 0.15 + Start = trend_period[[j]][1] + End = trend_period[[j]][2] + periodName = bquote(bold('Période')~bold(.(as.character(j)))) + # bquote(bold(.(Start))~'/'~bold(.(End))) - annotate('text', x=Xm[i], y=Y[i], - label=dataMean, - hjust=0.5, vjust=0.5, - size=3, color='grey40') - } + mat = mat + + annotate("text", x=x, y=yt, + label=periodName, + hjust=0, vjust=0.5, + size=3, color='grey40') + + for (i in 1:length(X)) { + mat = mat + + + gg_circle(r=0.45, xc=X[i], yc=Y[i], + fill=Fill_trend_per[i], + color=Color_trend_per[i]) + + + gg_circle(r=0.45, xc=Xm[i], yc=Y[i], + fill='white', color='grey40') + + + gg_circle(r=0.45, xc=Xc, yc=Y[i], + fill='white', color='grey40') + } - mat = mat + - annotate('text', x=Xc, y=max(Y) + 0.85, - label=bquote(bold('Début')), - hjust=0.5, vjust=0.5, - size=3, color='grey20') + + for (i in 1:length(TrendMean_trend_per)) { + trendMean = TrendMean_trend_per[i] + trendC = signif(trendMean*100, 2) - annotate('text', x=Xc, y=max(Y) + 0.6, - label=bquote(bold('Fin')), - hjust=0.5, vjust=0.5, - size=3, color='grey20') + if (!is.na(Pthresold_trend_per[i])) { + Tcolor = 'white' + } else { + Tcolor = 'grey85' + } + + dataMean = signif(DataMean_trend_per[i], 2) - for (i in 1:nbp) { - type = list_df2plot[[i]]$type + mat = mat + + annotate('text', x=X[i], y=Y[i], + label=trendC, + hjust=0.5, vjust=0.5, + size=3, color=Tcolor) + + + annotate('text', x=Xm[i], y=Y[i], + label=dataMean, + hjust=0.5, vjust=0.5, + size=3, color='grey40') + } + mat = mat + - annotate('text', x=X[i], y=max(Y) + 0.7, - label=bquote(.(type)), + annotate('text', x=Xc, y=max(Y) + 0.85, + label=bquote(bold('Début')), hjust=0.5, vjust=0.5, - size=3.5, color='grey20') + + size=3, color='grey20') + - annotate('text', x=Xm[i], y=max(Y) + 0.7, - label=bquote('µ'*.(type)), + annotate('text', x=Xc, y=max(Y) + 0.6, + label=bquote(bold('Fin')), hjust=0.5, vjust=0.5, - size=3.5, color='grey20') - } - } - - - ### Mean ### - - + size=3, color='grey20') + + for (i in 1:nbp) { + type = list_df2plot[[i]]$type + mat = mat + + annotate('text', x=X[i], y=max(Y) + 0.7, + label=bquote(.(type)), + hjust=0.5, vjust=0.5, + size=3.5, color='grey20') + + + annotate('text', x=Xm[i], y=max(Y) + 0.7, + label=bquote('µ'*.(type)), + hjust=0.5, vjust=0.5, + size=3.5, color='grey20') + } + for (k in 1:nsubCode) { + code = subCode[k] + label = Periods_trend[NPeriod_trend == j + & subCode_trend == code][1] + periodStart = substr(label, 1, 4) + periodEnd = substr(label, 14, 17) + + mat = mat + + annotate('text', x=Xc, y=k + 0.13, + label=bquote(bold(.(periodStart))), + hjust=0.5, vjust=0.5, + size=3, color='grey40') + + + annotate('text', x=Xc, y=k - 0.13, + label=bquote(bold(.(periodEnd))), + hjust=0.5, vjust=0.5, + size=3, color='grey40') + } + } + ### Mean ### + for (j in 1:nPeriod_mean) { + Type_mean_per = + subType_mean[subNPeriod_mean == j] + Code_mean_per = + subCode_mean[subNPeriod_mean == j] + DataMean_mean_per = + subDataMean_mean[subNPeriod_mean == j] + BreakMean_mean_per = + subBreakMean_mean[subNPeriod_mean == j] + Fill_mean_per = + subFill_mean[subNPeriod_mean == j] + Color_mean_per = + subColor_mean[subNPeriod_mean == j] + + Xtmp_mean = as.integer(factor(as.character(Type_mean_per))) + + Xc_mean = j + (j - 1)*nbp + X[length(X)] + Xm_mean = Xtmp_mean + (j - 1)*nbp + j + X[length(X)] + Xr_mean = Xtmp_mean + (j - 1)*nbp*2 + j + X[length(X)] + + Y_mean = as.integer(factor(Code_mean_per)) - - ### Code ### - for (i in 1:length(Code)) { - - code = Code[i] - name = df_meta[df_meta$code == code,]$nom - ncharMax = 30 - if (nchar(name) > ncharMax) { - name = paste(substr(name, 1, ncharMax), '...', sep='') - } + x = Xc_mean - 0.4 + xend = Xm_mean[length(Xm_mean)] + 0.25 + y = height + 1 + yend = height + 1 - mat = mat + - annotate('text', x=0.3, y=i + 0.14, - label=bquote(bold(.(code))), - hjust=1, vjust=0.5, - size=3.5, color="#00A3A8") + + mat = mat + + annotate("segment", + x=x, xend=xend, + y=y, yend=yend, + color="grey40", size=0.35) + + yt = y + 0.15 + Start = mean_period[[j]][1] + End = mean_period[[j]][2] - annotate('text', x=0.3, y=i - 0.14, - label=name, - hjust=1, vjust=0.5, - size=3.5, color="#00A3A8") + periodName = bquote(bold('Période')~bold(.(as.character(j+nPeriod_trend)))) + mat = mat + + annotate("text", x=x, y=yt, + label=periodName, + hjust=0, vjust=0.5, + size=3, color='grey40') + + if (j > 1) { + x = Xr_mean[1] - 0.4 + xend = Xr_mean[length(Xr_mean)] + 0.25 + + mat = mat + + annotate("segment", + x=x, xend=xend, + y=y, yend=yend, + color="grey40", size=0.35) + + breakName = bquote(bold('Rupture')~bold(.(as.character(j-1+nPeriod_trend)))*bold('-')*bold(.(as.character(j+nPeriod_trend)))) + + mat = mat + + annotate("text", x=x, y=yt, + label=breakName, + hjust=0, vjust=0.5, + size=3, color='grey40') + } + + for (i in 1:length(Xm_mean)) { + mat = mat + + + gg_circle(r=0.45, xc=Xm_mean[i], yc=Y[i], + fill='white', color='grey40') + + + gg_circle(r=0.45, xc=Xc_mean, yc=Y[i], + fill='white', color='grey40') + + if (j > 1) { + mat = mat + + gg_circle(r=0.45, xc=Xr_mean[i], yc=Y[i], + fill=Fill_mean_per[i], + color=Color_mean_per[i]) + } + } - for (j in 1:nPeriod_max) { - Xc = j + (j - 1)*nbp*2 - label = Periods_code[Code_code == code][[1]][j] - periodStart = substr(label, 1, 4) - periodEnd = substr(label, 8, 11) + for (i in 1:length(DataMean_mean_per)) { + dataMean = signif(DataMean_mean_per[i], 2) + + mat = mat + + annotate('text', x=Xm_mean[i], y=Y[i], + label=dataMean, + hjust=0.5, vjust=0.5, + size=3, color='grey40') + + if (j > 1) { + BreakMean = BreakMean_mean_per[i] + BreakC = signif(BreakMean*100, 2) + + mat = mat + + annotate('text', x=Xr_mean[i], y=Y[i], + label=BreakC, + hjust=0.5, vjust=0.5, + size=3, color='white') + } + } mat = mat + - annotate('text', x=Xc, y=i + 0.13, - label=bquote(bold(.(periodStart))), + annotate('text', x=Xc_mean, y=max(Y) + 0.85, + label=bquote(bold('Début')), hjust=0.5, vjust=0.5, - size=3, color='grey40') + + size=3, color='grey20') + - annotate('text', x=Xc, y=i - 0.13, - label=bquote(bold(.(periodEnd))), + annotate('text', x=Xc_mean, y=max(Y) + 0.6, + label=bquote(bold('Fin')), hjust=0.5, vjust=0.5, - size=3, color='grey40') + size=3, color='grey20') + + + for (i in 1:nbp) { + type = list_df2plot[[i]]$type + mat = mat + + annotate('text', x=Xm_mean[i], y=max(Y) + 0.7, + label=bquote('µ'*.(type)), + hjust=0.5, vjust=0.5, + size=3.5, color='grey20') + + if (j > 1) { + mat = mat + + annotate('text', x=Xr_mean[i], y=max(Y) + 0.7, + label=bquote('d'*.(type)), + hjust=0.5, vjust=0.5, + size=3.5, color='grey20') + } + } + + for (k in 1:nsubCode) { + code = subCode[k] + label = Periods_mean[NPeriod_mean == j + & subCode_mean == code][1] + periodStart = substr(label, 1, 4) + periodEnd = substr(label, 14, 17) + + mat = mat + + annotate('text', x=Xc_mean, y=k + 0.13, + label=bquote(bold(.(periodStart))), + hjust=0.5, vjust=0.5, + size=3, color='grey40') + + + annotate('text', x=Xc_mean, y=k - 0.13, + label=bquote(bold(.(periodEnd))), + hjust=0.5, vjust=0.5, + size=3, color='grey40') + } } - } - ### Environment ### + + ### Code ### + for (k in 1:nsubCode) { + + code = subCode[k] + name = df_meta[df_meta$code == code,]$nom + ncharMax = 40 + if (nchar(name) > ncharMax) { + name = paste(substr(name, 1, ncharMax), '...', sep='') + } - mat = mat + + mat = mat + + annotate('text', x=0.3, y=k + 0.14, + label=bquote(bold(.(code))), + hjust=1, vjust=0.5, + size=3.5, color="#00A3A8") + + + annotate('text', x=0.3, y=k - 0.14, + label=name, + hjust=1, vjust=0.5, + size=3.5, color="#00A3A8") + } + - coord_fixed() + - - scale_x_continuous(limits=c(1 - rel(6), - width + rel(0.5)), - expand=c(0, 0)) + - - scale_y_continuous(limits=c(1 - rel(0.5), - height + rel(1.5)), - expand=c(0, 0)) - - # Saving matrix plot - if (A3) { - width = 42 - height = 29.7 - dpi = 300 - print('aaaa') - } else { - width = 29.7 - height = 21 - dpi = 100 + ### Environment ### + + mat = mat + + + coord_fixed() + + + scale_x_continuous(limits=c(1 - rel(6), + width + rel(0.5)), + expand=c(0, 0)) + + + scale_y_continuous(limits=c(1 - rel(0.5), + height + rel(2)), + expand=c(0, 0)) + + # Saving matrix plot + if (A3) { + width = 42 + height = 29.7 + dpi = 300 + } else { + width = 29.7 + height = 21 + dpi = 100 + } + + ggsave(plot=mat, + path=outdirTmp, + filename=paste(outnameTmp, '_', fL, imat, '.pdf', + sep=''), + width=width, height=height, units='cm', dpi=dpi) + } - - ggsave(plot=mat, - path=outdirTmp, - filename=paste(outnameTmp, '.pdf', sep=''), - width=width, height=height, units='cm', dpi=dpi) - } + } } @@ -2096,6 +2323,10 @@ get_color = function (value, min, max, ncolor=256, palette_name='perso', reverse palette_cold = rev(palette_cold) } + if (is.na(value)) { + return (NA) + } + if (value < 0) { idNorm = (value - min) / (0 - min) id = round(idNorm*(ncolor - 1) + 1, 0) diff --git a/script.R b/script.R index 9d4acc3..323c222 100644 --- a/script.R +++ b/script.R @@ -22,7 +22,7 @@ filedir = ### MANUAL SELECTION ### # Name of the file that will be analysed from the AG directory filename = - # "" + "" # c( # "S2235610_HYDRO_QJM.txt", @@ -32,9 +32,9 @@ filename = # "Q7002910_HYDRO_QJM.txt" # ) - c("S4214010_HYDRO_QJM.txt", - "O0384010_HYDRO_QJM.txt", - "Q7002910_HYDRO_QJM.txt") + # c("S4214010_HYDRO_QJM.txt", + # "O0384010_HYDRO_QJM.txt", + # "Q7002910_HYDRO_QJM.txt") @@ -44,8 +44,8 @@ AGlistdir = "" AGlistname = - "" - # "Liste-station_RRSE.docx" + # "" + "Liste-station_RRSE.docx" ### NIVALE SELECTION ### -- GitLab