An error occurred while loading the file. Please try again.
-
Delaigue Olivier authored60219b28
#*****************************************************************************************************************
#' Function which creates a screen plot giving an overview of the model outputs
#'
#' Dashboard of results including various graphs (depending on the model):
#' (1) time series of total precipitation and simulated flows (and observed flows if provided)
#' (2) interannual median monthly simulated flow (and observed flows if provided)
#' (3) correlation plot between simulated and observed flows (if observed flows provided)
#' (4) cumulative frequency plot for simulated flows (and observed flows if provided)
#*****************************************************************************************************************
#' @title Default preview of model outputs
#' @author Laurent Coron (June 2014)
## @example tests/example_plot_OutputsModel.R
#' @encoding UTF-8
#' @export
#_FunctionInputs__________________________________________________________________________________________________
#' @param OutputsModel [object of class \emph{OutputsModel}] list of model outputs (which must at least include DatesR, Precip and Qsim) [POSIXlt, mm, mm]
#' @param Qobs (optional) [numeric] time series of observed flow (for the same time-steps than simulated) [mm]
#' @param IndPeriod_Plot (optional) [numeric] indices of the time-steps to be plotted (among the OutputsModel series)
#' @param BasinArea (optional) [numeric] basin area [km2], used to plot flow axes in m3/s
#' @param PlotChoice (optional) [character] choice of plots \cr (e.g. c("Precip","SnowPack","Flows","Regime","CumFreq","CorQQ")), default="all"
#' @param quiet (optional) [boolean] boolean indicating if the function is run in quiet mode or not, default=FALSE
#_FunctionOutputs_________________________________________________________________________________________________
#' @return screen plot window
#*****************************************************************************************************************
plot_OutputsModel <- function(OutputsModel,Qobs=NULL,IndPeriod_Plot=NULL,BasinArea=NULL,PlotChoice="all",quiet=FALSE){
if(!inherits(OutputsModel,"GR") & !inherits(OutputsModel,"CemaNeige")){ stop(paste("OutputsModel not in the correct format for default plotting \n",sep="")); return(NULL); }
BOOL_Dates <- FALSE;
if("DatesR" %in% names(OutputsModel)){ BOOL_Dates <- TRUE; }
BOOL_Pobs <- FALSE;
if("Precip" %in% names(OutputsModel)){ BOOL_Pobs <- TRUE; }
BOOL_Qsim <- FALSE;
if("Qsim" %in% names(OutputsModel)){ BOOL_Qsim <- TRUE; }
BOOL_Qobs <- FALSE;
if(BOOL_Qsim & length(Qobs)==length(OutputsModel$Qsim)){ if(sum(is.na(Qobs))!=length(Qobs)){ BOOL_Qobs <- TRUE; } }
BOOL_Snow <- FALSE;
if("CemaNeigeLayers" %in% names(OutputsModel)){ if("SnowPack" %in% names(OutputsModel$CemaNeigeLayers[[1]])){ BOOL_Snow <- TRUE; } }
BOOL_Psol <- FALSE;
if("CemaNeigeLayers" %in% names(OutputsModel)){ if("Psol" %in% names(OutputsModel$CemaNeigeLayers[[1]])){ BOOL_Psol <- TRUE; } }
if( is.null( PlotChoice)){ stop("PlotChoice must be a vector of character \n"); return(NULL); }
if(!is.vector( PlotChoice)){ stop("PlotChoice must be a vector of character \n"); return(NULL); }
if(!is.character(PlotChoice)){ stop("PlotChoice must be a vector of character \n"); return(NULL); }
if(sum(PlotChoice %in% c("all","Precip","SnowPack","Flows","Regime","CumFreq","CorQQ")==FALSE)!=0){
cat("Incorrect element found in PlotChoice \n");
stop("PlotChoice can only contain 'all', 'Precip', 'SnowPack', 'Flows', 'Regime', 'CumFreq' or 'CorQQ') \n");
return(NULL); }
if("all" %in% PlotChoice){ PlotChoice <- c("Precip","SnowPack","Flows","Regime","CumFreq","CorQQ"); }
if(!BOOL_Dates){
stop(paste("OutputsModel must contain at least DatesR to allow plotting \n",sep="")); return(NULL); }
if(inherits(OutputsModel,"GR") & !BOOL_Qsim){
stop(paste("OutputsModel must contain at least Qsim to allow plotting \n",sep="")); return(NULL); }
if(BOOL_Dates){
MyRollMean1 <- function(x,n){
return(filter(x,rep(1/n,n),sides=2)); }
MyRollMean2 <- function(x,n){
return(filter(c(tail(x,n%/%2),x,x[1:(n%/%2)]),rep(1/n,n),sides=2)[(n%/%2+1):(length(x)+n%/%2)]); }
BOOL_TS <- FALSE;
TimeStep <- difftime(tail(OutputsModel$DatesR,1),tail(OutputsModel$DatesR,2),units="secs")[[1]];
if(inherits(OutputsModel,"hourly" ) & TimeStep %in% ( 60*60)){ BOOL_TS <- TRUE; NameTS <- "hour" ; plotunit <- "[mm/h]"; formatAxis <- "%m/%Y"; }
if(inherits(OutputsModel,"daily" ) & TimeStep %in% ( 24*60*60)){ BOOL_TS <- TRUE; NameTS <- "day" ; plotunit <- "[mm/d]"; formatAxis <- "%m/%Y"; }
if(inherits(OutputsModel,"monthly") & TimeStep %in% (c(28,29,30,31)*24*60*60)){ BOOL_TS <- TRUE; NameTS <- "month"; plotunit <- "[mm/month]"; formatAxis <- "%m/%Y"; }
if(inherits(OutputsModel,"yearly" ) & TimeStep %in% ( c(365,366)*24*60*60)){ BOOL_TS <- TRUE; NameTS <- "year" ; plotunit <- "[mm/y]"; formatAxis <- "%Y" ; }
if(!BOOL_TS){ stop(paste("the time step of the model inputs could not be found \n",sep="")); return(NULL); }
}
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
if(length(IndPeriod_Plot)==0){ IndPeriod_Plot <- 1:length(OutputsModel$DatesR); }
if(inherits(OutputsModel,"CemaNeige")){ NLayers <- length(OutputsModel$CemaNeigeLayers); }
PsolLayerMean <- NULL; if(BOOL_Psol){
for(iLayer in 1:NLayers){
if(iLayer==1){ PsolLayerMean <- OutputsModel$CemaNeigeLayers[[iLayer]]$Psol/NLayers;
} else { PsolLayerMean <- PsolLayerMean + OutputsModel$CemaNeigeLayers[[iLayer]]$Psol/NLayers; } } }
BOOL_QobsZero <- FALSE; if(BOOL_Qobs){ SelectQobsNotZero <- (round(Qobs[IndPeriod_Plot] ,4)!=0); BOOL_QobsZero <- sum(!SelectQobsNotZero,na.rm=TRUE)>0; }
BOOL_QsimZero <- FALSE; if(BOOL_Qsim){ SelectQsimNotZero <- (round(OutputsModel$Qsim[IndPeriod_Plot],4)!=0); BOOL_QsimZero <- sum(!SelectQsimNotZero,na.rm=TRUE)>0; }
if(BOOL_QobsZero & !quiet){ warning("\t zeroes detected in Qobs -> some plots in the log space will not be created using all time-steps \n"); }
if(BOOL_QsimZero & !quiet){ warning("\t zeroes detected in Qsim -> some plots in the log space will not be created using all time-steps \n"); }
BOOL_FilterZero <- TRUE;
##Plots_choices
BOOLPLOT_Precip <- ( "Precip" %in% PlotChoice & BOOL_Pobs )
BOOLPLOT_SnowPack <- ( "SnowPack" %in% PlotChoice & BOOL_Snow )
BOOLPLOT_Flows <- ( "Flows" %in% PlotChoice & (BOOL_Qsim | BOOL_Qobs) )
BOOLPLOT_Regime <- ( "Regime" %in% PlotChoice & BOOL_TS & BOOL_Qsim & (NameTS %in% c("hour","day","month")) )
BOOLPLOT_CumFreq <- ( "CumFreq" %in% PlotChoice & (BOOL_Qsim | BOOL_Qobs) & BOOL_FilterZero )
BOOLPLOT_CorQQ <- ( "CorQQ" %in% PlotChoice & (BOOL_Qsim & BOOL_Qobs) & BOOL_FilterZero )
##Options
BLOC <- TRUE; if(BLOC){
cexaxis <- 1.0; cexlab <- 0.9; cexleg=1.0; lwdLine=1.8; lineX=2.6; lineY=2.6; bgleg <- rgb(1,1,1,alpha=0.7); bgleg <- NA;
matlayout <- NULL; iPlot <- 0;
Sum1 <- sum(c(BOOLPLOT_Precip,BOOLPLOT_SnowPack,BOOLPLOT_Flows))
Sum2 <- sum(c(BOOLPLOT_Regime,BOOLPLOT_CumFreq,BOOLPLOT_CorQQ))
if(BOOLPLOT_Precip){
matlayout <- rbind(matlayout,c(iPlot+1,iPlot+1,iPlot+1)); iPlot <- iPlot+1; }
if(BOOLPLOT_SnowPack){
matlayout <- rbind(matlayout,c(iPlot+1,iPlot+1,iPlot+1),c(iPlot+1,iPlot+1,iPlot+1)); iPlot <- iPlot+1; }
if(BOOLPLOT_Flows){
matlayout <- rbind(matlayout,c(iPlot+1,iPlot+1,iPlot+1),c(iPlot+1,iPlot+1,iPlot+1)); iPlot <- iPlot+1; }
if((Sum1>=1 & Sum2!=0) | (Sum1==0 & Sum2==3)){
matlayout <- rbind(matlayout,c(iPlot+1,iPlot+2,iPlot+3),c(iPlot+1,iPlot+2,iPlot+3)); iPlot <- iPlot+3; }
if(Sum1==0 & Sum2==2){
matlayout <- rbind(matlayout,c(iPlot+1,iPlot+2)); iPlot <- iPlot+2; }
if(Sum1==0 & Sum2==1){
matlayout <- rbind(matlayout,iPlot+1); iPlot <- iPlot+1; }
iPlotMax <- iPlot;
isRStudio <- Sys.getenv("RSTUDIO") == "1";
if(!isRStudio){
if(Sum1==1 & Sum2==0){ width=10; height=05; }
if(Sum1==1 & Sum2!=0){ width=10; height=07; }
if(Sum1==2 & Sum2==0){ width=10; height=05; }
if(Sum1==2 & Sum2!=0){ width=10; height=07; }
if(Sum1==3 & Sum2==0){ width=10; height=07; }
if(Sum1==3 & Sum2!=0){ width=10; height=10; }
if(Sum1==0 & Sum2==1){ width=05; height=05; }
if(Sum1==0 & Sum2==2){ width=10; height=04; }
if(Sum1==0 & Sum2==3){ width=10; height=03; }
dev.new(width=width,height=height)
}
layout(matlayout);
Xaxis <- 1:length(IndPeriod_Plot);
if(BOOL_Dates){
if(NameTS %in% c("hour","day","month")){
Seq1 <- which(OutputsModel$DatesR[IndPeriod_Plot]$mday==1 & OutputsModel$DatesR[IndPeriod_Plot]$mon %in% c(0,3,6,9));
Seq2 <- which(OutputsModel$DatesR[IndPeriod_Plot]$mday==1 & OutputsModel$DatesR[IndPeriod_Plot]$mon==0);
Labels2 <- format(OutputsModel$DatesR[IndPeriod_Plot],format=formatAxis)[Seq2];
}
if(NameTS %in% c("year")){
Seq1 <- 1:length(OutputsModel$DatesR[IndPeriod_Plot]);
Seq2 <- 1:length(OutputsModel$DatesR[IndPeriod_Plot]);
Labels2 <- format(OutputsModel$DatesR[IndPeriod_Plot],format=formatAxis)[Seq2];
}
}
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
if(!is.null(BasinArea)){
Factor_MMH_M3S <- BasinArea/( 60*60/1000);
Factor_MMD_M3S <- BasinArea/( 24*60*60/1000);
Factor_MMM_M3S <- BasinArea/(365.25/12*24*60*60/1000);
Factor_MMY_M3S <- BasinArea/( 365.25*24*60*60/1000);
if(NameTS=="hour" ){ Factor_UNIT_M3S <- Factor_MMH_M3S; }
if(NameTS=="day" ){ Factor_UNIT_M3S <- Factor_MMD_M3S; }
if(NameTS=="month"){ Factor_UNIT_M3S <- Factor_MMM_M3S; }
if(NameTS=="year" ){ Factor_UNIT_M3S <- Factor_MMY_M3S; }
}
}
kPlot <- 0;
##Precip
if(BOOLPLOT_Precip){
kPlot <- kPlot+1; mar <- c(3,5,1,5);
par(new=FALSE,mar=mar,las=0)
ylim1 <- range(OutputsModel$Precip[IndPeriod_Plot],na.rm=TRUE); ylim2 <- ylim1; ylim2 <- rev(ylim2);
lwdP <- 0.7; if(NameTS %in% c("month","year")){ lwdP <- 2; }
plot(Xaxis,OutputsModel$Precip[IndPeriod_Plot],type="h",ylim=ylim2,col="royalblue",lwd=lwdP,xaxt="n",yaxt="n",xlab="",ylab="",yaxs="i");
axis(side=2,at=pretty(ylim1),labels=pretty(ylim1),cex.axis=cexaxis)
par(las=0); mtext(side=2,paste("precip. ",plotunit,sep=""),line=lineY,cex=cexlab,adj=1); par(las=0);
if(BOOL_Psol){
par(new=TRUE);
plot(Xaxis,PsolLayerMean[IndPeriod_Plot],type="h",ylim=ylim2,col="lightblue",lwd=lwdP,xaxt="n",yaxt="n",xlab="",ylab="",yaxs="i");
}
if(BOOL_Dates){
axis(side=1,at=Seq1,labels=FALSE,cex.axis=cexaxis);
axis(side=1,at=Seq2,labels=Labels2,lwd.ticks=1.5,cex.axis=cexaxis);
} else { axis(side=1,at=pretty(Xaxis),labels=pretty(Xaxis),cex.axis=cexaxis); }
}
##SnowPack
if(BOOLPLOT_SnowPack){
kPlot <- kPlot+1; mar <- c(3,5,1,5);
par(new=FALSE,mar=mar,las=0)
ylim1 <- c(+99999,-99999)
for(iLayer in 1:NLayers){
ylim1[1] <- min(ylim1[1],OutputsModel$CemaNeigeLayers[[iLayer]]$SnowPack);
ylim1[2] <- max(ylim1[2],OutputsModel$CemaNeigeLayers[[iLayer]]$SnowPack);
if(iLayer==1){ SnowPackLayerMean <- OutputsModel$CemaNeigeLayers[[iLayer]]$SnowPack/NLayers;
} else { SnowPackLayerMean <- SnowPackLayerMean + OutputsModel$CemaNeigeLayers[[iLayer]]$SnowPack/NLayers; }
}
plot(SnowPackLayerMean[IndPeriod_Plot],type="l",ylim=ylim1,lwd=lwdLine*1.2,col="royalblue",xlab="",ylab="",xaxt="n",yaxt="n")
for(iLayer in 1:NLayers){ lines(OutputsModel$CemaNeigeLayers[[iLayer]]$SnowPack[IndPeriod_Plot],lty=3,col="royalblue",lwd=lwdLine*0.8); }
axis(side=2,at=pretty(ylim1),labels=pretty(ylim1),cex.axis=cexaxis)
par(las=0); mtext(side=2,paste("snow pack ","[mm]",sep=""),line=lineY,cex=cexlab); par(las=0);
legend("topright",c(paste("mean snow pack",sep=""),paste("snow pack for each layer",sep="")),col=c("royalblue","royalblue"),lty=c(1,3),lwd=c(lwdLine*1.2,lwdLine*0.8),bty="o",bg=bgleg,box.col=bgleg,cex=cexleg)
box()
if(BOOL_Dates){
axis(side=1,at=Seq1,labels=FALSE,cex.axis=cexaxis);
axis(side=1,at=Seq2,labels=Labels2,lwd.ticks=1.5,cex.axis=cexaxis);
} else { axis(side=1,at=pretty(Xaxis),labels=pretty(Xaxis),cex.axis=cexaxis); }
}
##Flows
if(BOOLPLOT_Flows){
kPlot <- kPlot+1; mar <- c(3,5,1,5);
par(new=FALSE,mar=mar,las=0)
ylim1 <- range(OutputsModel$Qsim[IndPeriod_Plot],na.rm=TRUE);
if(BOOL_Qobs){ ylim1 <- range(c(ylim1,Qobs[IndPeriod_Plot]),na.rm=TRUE); }
ylim2 <- c(ylim1[1],1.2*ylim1[2]);
plot(Xaxis,rep(NA,length(Xaxis)),type="n",ylim=ylim2,xlab="",ylab="",xaxt="n",yaxt="n");
txtleg <- NULL; colleg <- NULL;
if(BOOL_Qobs){ lines(Xaxis,Qobs[IndPeriod_Plot],lwd=lwdLine,lty=1,col="black"); txtleg <- c(txtleg,"observed"); colleg <- c(colleg,"black"); }
if(BOOL_Qsim){ lines(Xaxis,OutputsModel$Qsim[IndPeriod_Plot],lwd=lwdLine,lty=1,col="orangered"); txtleg <- c(txtleg,"simulated"); colleg <- c(colleg,"orangered"); }
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
axis(side=2,at=pretty(ylim1),labels=pretty(ylim1),cex.axis=cexaxis)
par(las=0); mtext(side=2,paste("flow ",plotunit,sep=""),line=lineY,cex=cexlab); par(las=0);
if(!is.null(BasinArea)){
Factor <- Factor_UNIT_M3S;
axis(side=4,at=pretty(ylim1*Factor)/Factor,labels=pretty(ylim1*Factor),cex.axis=cexaxis);
par(las=0); mtext(side=4,paste("flow ","m3/s",sep=""),line=lineY,cex=cexlab); par(las=0); }
if(BOOL_Dates){
axis(side=1,at=Seq1,labels=FALSE,cex.axis=cexaxis);
axis(side=1,at=Seq2,labels=Labels2,lwd.ticks=1.5,cex.axis=cexaxis);
} else { axis(side=1,at=pretty(Xaxis),labels=pretty(Xaxis),cex.axis=cexaxis); }
legend("topright",txtleg,col=colleg,lty=1,lwd=lwdLine,bty="o",bg=bgleg,box.col=bgleg,cex=cexleg)
box()
}
##Regime
if(BOOLPLOT_Regime){
kPlot <- kPlot+1; mar <- c(6,5,1,5); plotunitregime <- "[mm/month]";
par(new=FALSE,mar=mar,las=0)
##Data_formating_as_table
DataModel <- as.data.frame(matrix(as.numeric(NA),nrow=length(IndPeriod_Plot),ncol=5));
DataModel[,1] <- as.numeric(format(OutputsModel$DatesR[IndPeriod_Plot],format="%Y%m%d%H"));
if(BOOL_Pobs){ DataModel[,2] <- OutputsModel$Precip[IndPeriod_Plot]; }
if(BOOL_Psol){ DataModel[,3] <- PsolLayerMean[IndPeriod_Plot]; }
if(BOOL_Qobs){ DataModel[,4] <- Qobs[IndPeriod_Plot]; }
if(BOOL_Qsim){ DataModel[,5] <- OutputsModel$Qsim[IndPeriod_Plot]; }
colnames(DataModel) <- c("Dates","Precip","Psol","Qobs","Qsim");
TxtDatesDataModel <- formatC(DataModel$Dates,format="d",width=8,flag="0");
##Building_of_daily_time_series_if_needed
if(NameTS=="month"){ DataDaily <- NULL; }
if(NameTS=="day" ){ DataDaily <- DataModel; }
if(NameTS=="hour" ){ DataDaily <- as.data.frame(aggregate(DataModel[,2:5],by=list(as.numeric(substr(TxtDatesDataModel,1,8))),FUN=sum,na.rm=T)); }
if(NameTS %in% c("hour","day")){
colnames(DataDaily) <- c("Dates","Precip","Psol","Qobs","Qsim");
TxtDatesDataDaily <- formatC(DataDaily$Dates,format="d",width=8,flag="0"); }
##Building_of_monthly_time_series_if_needed
if(NameTS=="month"){ DataMonthly <- DataModel; }
if(NameTS=="day" ){ DataMonthly <- as.data.frame(aggregate(DataDaily[,2:5],by=list(as.numeric(substr(TxtDatesDataDaily,1,6))),FUN=sum,na.rm=T)); }
if(NameTS=="hour" ){ DataMonthly <- as.data.frame(aggregate(DataDaily[,2:5],by=list(as.numeric(substr(TxtDatesDataDaily,1,6))),FUN=sum,na.rm=T)); }
colnames(DataMonthly) <- c("Dates","Precip","Psol","Qobs","Qsim");
TxtDatesDataMonthly <- formatC(DataMonthly$Dates,format="d",width=6,flag="0");
##Computation_of_interannual_mean_series
if(!is.null(DataDaily)){
DataDailyInterAn <- as.data.frame(aggregate(DataDaily[,2:5],by=list(as.numeric(substr(TxtDatesDataDaily ,5,8))),FUN=mean,na.rm=T));
colnames(DataDailyInterAn) <- c("Dates","Precip","Psol","Qobs","Qsim"); }
if(!is.null(DataMonthly)){
DataMonthlyInterAn <- as.data.frame(aggregate(DataMonthly[,2:5],by=list(as.numeric(substr(TxtDatesDataMonthly,5,6))),FUN=mean,na.rm=T));
colnames(DataMonthlyInterAn) <- c("Dates","Precip","Psol","Qobs","Qsim"); }
##Smoothing_of_daily_series_and_scale_conversion_to_make_them_become_a_monthly_regime
if(!is.null(DataDaily)){
##Smoothing
NDaysWindow <- 30;
DataDailyInterAn <- as.data.frame(cbind(DataDailyInterAn$Dates,
MyRollMean2(DataDailyInterAn$Precip,NDaysWindow), MyRollMean2(DataDailyInterAn$Psol,NDaysWindow),
MyRollMean2(DataDailyInterAn$Qobs ,NDaysWindow), MyRollMean2(DataDailyInterAn$Qsim,NDaysWindow)));
colnames(DataDailyInterAn) <- c("Dates","Precip","Psol","Qobs","Qsim");
##Scale_conversion_to_make_them_become_a_monthly_regime
if(plotunitregime!="[mm/month]"){ stop(paste("incorrect unit for regime plot \n",sep="")); return(NULL); }
DataDailyInterAn <- as.data.frame(cbind(DataDailyInterAn[1],DataDailyInterAn[2:5]*30));
}
##Plot_preparation
DataPlotP <- DataMonthlyInterAn;
if(!is.null(DataDaily)){
DataPlotQ <- DataDailyInterAn;
SeqX1 <- c( 1, 32, 61, 92,122,153,183,214,245,275,306,336,366);
SeqX2 <- c( 15, 46, 75,106,136,167,197,228,259,289,320,350);
labX <- "30-days rolling mean";
} else {
DataPlotQ <- DataMonthlyInterAn;
SeqX1 <- seq(from=0.5,to=12.5,by=1);
281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
SeqX2 <- seq(from=1 ,to=12 ,by=1);
labX <- "";
}
xLabels1 <- rep("",13);
xLabels2 <- c("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec");
ylimQ <- range(c(DataPlotQ$Qobs,DataPlotQ$Qsim),na.rm=TRUE);
if(BOOL_Pobs){ ylimP <- c(max(DataPlotP$Precip,na.rm=TRUE),0); }
txtleg <- NULL; colleg <- NULL; lwdleg <- NULL; lwdP=10;
##Plot_forcings
if(BOOL_Pobs){
plot(SeqX2,DataPlotP$Precip,type="h",xlim=range(SeqX1),ylim=c(3*ylimP[1],ylimP[2]),lwd=lwdP,lend=1,lty=1,col="royalblue",xlab="",ylab="",xaxt="n",yaxt="n",yaxs="i",bty="n")
txtleg <- c(txtleg,"Ptot" ); colleg <- c(colleg,"royalblue"); lwdleg <- c(lwdleg,lwdP/3);
axis(side=2,at=pretty(0.8*ylimP,n=3),labels=pretty(0.8*ylimP,n=3),cex.axis=cexaxis,col.axis="royalblue",col.ticks="royalblue");
par(new=TRUE); }
if(BOOL_Psol){
plot(SeqX2,DataPlotP$Psol,type="h",xlim=range(SeqX1),ylim=c(3*ylimP[1],ylimP[2]),lwd=lwdP,lend=1,lty=1,col="lightblue",xlab="",ylab="",xaxt="n",yaxt="n",yaxs="i",bty="n");
txtleg <- c(txtleg,"Psol" ); colleg <- c(colleg,"lightblue"); lwdleg <- c(lwdleg,lwdP/3);
par(new=TRUE); }
##Plot_flows
plot(NULL,type="n",xlim=range(SeqX1),ylim=c(ylimQ[1],2*ylimQ[2]),xlab="",ylab="",xaxt="n",yaxt="n")
if(BOOL_Qobs){ lines(1:nrow(DataPlotQ),DataPlotQ$Qobs,lwd=lwdLine,lty=1,col="black" ); txtleg <- c(txtleg,"Qobs" ); colleg <- c(colleg,"black" ); lwdleg <- c(lwdleg,lwdLine); }
if(BOOL_Qsim){ lines(1:nrow(DataPlotQ),DataPlotQ$Qsim,lwd=lwdLine,lty=1,col="orangered"); txtleg <- c(txtleg,"Qsim"); colleg <- c(colleg,"orangered"); lwdleg <- c(lwdleg,lwdLine); }
##Axis_and_legend
axis(side=1,at=SeqX1,tick=TRUE ,labels=xLabels1,cex.axis=cexaxis)
axis(side=1,at=SeqX2,tick=FALSE,labels=xLabels2,cex.axis=cexaxis)
axis(side=2,at=pretty(ylimQ),labels=pretty(ylimQ),cex.axis=cexaxis)
par(las=0); mtext(side=1,labX,line=lineX,cex=cexlab); par(las=0);
posleg <- "topright"; txtlab <- "flow regime";
if(BOOL_Pobs){ posleg <- "right"; txtlab <- "precip. & flow regime"; }
par(las=0); mtext(side=2,paste(txtlab," ",plotunitregime,sep=""),line=lineY,cex=cexlab); par(las=0);
if(!is.null(BasinArea)){
Factor <- Factor_MMM_M3S;
axis(side=4,at=pretty(ylimQ*Factor)/Factor,labels=pretty(ylimQ*Factor),cex.axis=cexaxis);
par(las=0); mtext(side=4,paste("flow ","m3/s",sep=""),line=lineY,cex=cexlab); par(las=0); }
### posleg <- "topright"; if(BOOL_Pobs){ posleg <- "right"; }
### legend(posleg,txtleg,col=colleg,lty=1,lwd=lwdleg,bty="o",bg=bgleg,box.col=bgleg,cex=cexleg)
box()
}
##Cumulative_frequency
if(BOOLPLOT_CumFreq){
kPlot <- kPlot+1; mar <- c(6,5,1,5);
par(new=FALSE,mar=mar,las=0)
xlim <- c(0,1);
if(BOOL_Qobs & !BOOL_Qsim){ SelectNotZero <- SelectQobsNotZero;
ylim <- range(log(Qobs[IndPeriod_Plot][SelectNotZero]),na.rm=TRUE); }
if(BOOL_Qsim & !BOOL_Qobs){ SelectNotZero <- SelectQsimNotZero;
ylim <- range(log(OutputsModel$Qsim[IndPeriod_Plot][SelectNotZero]),na.rm=TRUE); }
if(BOOL_Qobs & BOOL_Qsim){ SelectNotZero <- SelectQobsNotZero & SelectQsimNotZero;
ylim <- range(log(c(Qobs[IndPeriod_Plot][SelectNotZero],OutputsModel$Qsim[IndPeriod_Plot][SelectNotZero])),na.rm=TRUE); }
seqDATA1 <- log(c(0.01,0.02,0.05,0.1,0.2,0.5,1,2,5,10,20,50,100,200,500,1000,2000,5000,10000)); seqDATA2 <- exp(seqDATA1);
plot(0,0,type="n",xlim=xlim,ylim=ylim,xaxt="n",yaxt="n",xlab="",ylab="",main="");
### abline(h=0,lty=2,col=grey(0.5));
### abline(h=1,lty=2,col=grey(0.5));
axis(side=1,at=pretty(xlim),labels=pretty(xlim),cex.axis=cexaxis);
par(las=0); mtext(side=1,text="non-exceedance prob. [-]",line=lineY,cex=cexlab); par(las=0);
axis(side=2,at=seqDATA1,labels=seqDATA2,cex.axis=cexaxis);
par(las=0); mtext(side=2,text=paste("flow ",plotunit,"",sep=""),line=lineY,cex=cexlab); par(las=0);
txtleg <- NULL; colleg <- NULL;
if(BOOL_Qobs){
DATA2 <- log(Qobs[IndPeriod_Plot][SelectNotZero]);
SeqQuant <- seq(0,1,by=1/(length(DATA2))); Quant <- as.numeric(quantile(DATA2,SeqQuant,na.rm=TRUE));
Fn <- ecdf(DATA2); YY <- DATA2; YY <- YY[order( Fn(DATA2) )]; XX <- Fn(DATA2); XX <- XX[order( Fn(DATA2) )];
lines(XX,YY,lwd=1,col="black");
txtleg <- c(txtleg,"observed"); colleg <- c(colleg,"black"); }
if(BOOL_Qsim){
DATA2 <- log(OutputsModel$Qsim[IndPeriod_Plot][SelectNotZero]);
SeqQuant <- seq(0,1,by=1/(length(DATA2))); Quant <- as.numeric(quantile(DATA2,SeqQuant,na.rm=TRUE));
351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
Fn <- ecdf(DATA2); YY <- DATA2; YY <- YY[order( Fn(DATA2) )]; XX <- Fn(DATA2); XX <- XX[order( Fn(DATA2) )];
lines(XX,YY,lwd=1,col="orangered");
txtleg <- c(txtleg,"simulated"); colleg <- c(colleg,"orangered"); }
if(!is.null(BasinArea)){
Factor <- Factor_UNIT_M3S;
axis(side=4,at=seqDATA1,labels=round(seqDATA2*Factor),cex.axis=cexaxis);
par(las=0); mtext(side=4,paste("flow ","m3/s",sep=""),line=lineY,cex=cexlab); par(las=0); }
legend("topleft",txtleg,col=colleg,lty=1,lwd=lwdLine,bty="o",bg=bgleg,box.col=bgleg,cex=cexleg)
legend("bottomright","log scale",lty=1,col=NA,bty="o",bg=bgleg,box.col=bgleg,cex=cexleg)
box()
}
##Correlation_QQ
if(BOOLPLOT_CorQQ){
kPlot <- kPlot+1; mar <- c(6,5,1,5);
par(new=FALSE,mar=mar,las=0)
ylim <- log(range(c(Qobs[IndPeriod_Plot][SelectQobsNotZero & SelectQsimNotZero],OutputsModel$Qsim[IndPeriod_Plot][SelectQobsNotZero & SelectQsimNotZero]),na.rm=TRUE));
plot(log(Qobs[IndPeriod_Plot][SelectQobsNotZero & SelectQsimNotZero]),log(OutputsModel$Qsim[IndPeriod_Plot][SelectQobsNotZero & SelectQsimNotZero]),type="p",pch=1,cex=0.9,col="black",xlim=ylim,ylim=ylim,xaxt="n",yaxt="n",xlab="",ylab="")
abline(a=0,b=1,col="royalblue");
seqDATA1 <- log(c(0.01,0.02,0.05,0.1,0.2,0.5,1,2,5,10,20,50,100,200,500,1000,2000,5000,10000)); seqDATA2 <- exp(seqDATA1);
axis(side=1,at=seqDATA1,labels=seqDATA2,cex=cexaxis);
axis(side=2,at=seqDATA1,labels=seqDATA2,cex=cexaxis);
par(las=0); mtext(side=1,paste("observed flow ",plotunit,"",sep=""),line=lineX,cex=cexlab); par(las=0);
par(las=0); mtext(side=2,paste("simulated flow ",plotunit,"",sep=""),line=lineY,cex=cexlab); par(las=0);
if(!is.null(BasinArea)){
Factor <- Factor_UNIT_M3S;
axis(side=4,at=seqDATA1,labels=round(seqDATA2*Factor),cex.axis=cexaxis);
par(las=0); mtext(side=4,paste("flow ","m3/s",sep=""),line=lineY,cex=cexlab); par(las=0); }
legend("bottomright","log scale",lty=1,col=NA,bty="o",bg=bgleg,box.col=bgleg,cex=cexleg)
box()
}
##Empty_plots
while(kPlot < iPlotMax){
kPlot <- kPlot+1;
par(new=FALSE)
plot(0,0,type="n",xlab="",ylab="",axes=FALSE)
}
##Restoring_layout_options
layout(1);
}