plot_OutputsModel.R 23.81 KiB
#*****************************************************************************************************************
#' 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); }