Nothing
## ----setup, include=FALSE-----------------------------------------------------
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>",
echo = TRUE,
message = FALSE,
warning = FALSE
)
## ----`AquaBEHER` setup--------------------------------------------------------
## Install required packages:
# if (!require("pacman")) install.packages("pacman")
# pacman::p_load(knitr, rmarkdown, prettydoc, dplyr, ggplot2, lubridate,
# terra, devtools, ggrepel, zoo)
## Install AquaBEHER from CRAN:
# install.packages("AquaBEHER")
## Install AquaBEHER from GitHub:
# devtools::install_github("RobelTakele/AquaBEHER")
library(AquaBEHER)
library(ggplot2)
library(ggrepel)
library(dplyr)
## ----climateData--------------------------------------------------------------
data(AgroClimateData)
str(AgroClimateData)
head(AgroClimateData)
## -----------------------------------------------------------------------------
PET <- calcEto(AgroClimateData, method = "PM", crop = "short")
str(PET)
## ----PETplot, fig.height = 4, fig.width = 6, fig.dpi = 300, fig.align = 'center'----
## Compute PET using Hargreaves-Samani formulation using the sample data f
## rom 'AgroClimateData':
Eto.HS <- calcEto(AgroClimateData, method = "HS")
## Now compute PET using Penman-Monteith formulation:
Eto.PM <- calcEto(AgroClimateData, method = "PM", Zh = 10)
plot(Eto.PM$ET.Daily[1:1000],
type = "l", xlab = "Days since 1996",
ylab = "Eto (mm/day)", col = "black", lwd = 1, lty = 2
)
lines(Eto.HS$ET.Daily[1:1000], col = "blue", lwd = 2, lty = 1)
legend("bottom", c("Eto: Penman–Monteith", "Eto: Hargreaves-Samani"),
horiz = TRUE, bty = "n", cex = 1, lty = c(2, 1),
lwd = c(2, 2), inset = c(1, 1),
xpd = TRUE, col = c("black", "blue")
)
## ----WATBALplot, fig.height = 6, fig.width = 10, fig.dpi = 300, fig.align = 'center'----
PET <- calcEto(AgroClimateData, method = "PM", Zh = 10)
## Add the estimated PET 'ET.Daily' to a new column in AgroClimateData:
AgroClimateData$Eto <- PET$ET.Daily
## Estimate daily water balance for the soil having 100mm of soilWHC:
soilWHC <- 100
watBal.list <- calcWatBal(data = AgroClimateData, soilWHC)
watBal <- watBal.list$data
str(watBal)
## Filter the data for the years 2019 and 2020:
watBal.19T20 <- watBal[watBal$Year %in% c(2019, 2020), ]
## Create a date vector:
date.vec <- as.Date(paste0(
watBal.19T20$Year, "-",
watBal.19T20$Month, "-",
watBal.19T20$Day
), format = "%Y-%m-%d")
## Add the date vector to the data frame:
watBal.19T20$date <- date.vec
## Plotting the water balance output for the climatological year
## from 2019 to 2020 using ggplot2:
library(ggplot2)
library(scales)
ggplot(data = watBal.19T20, aes(x = date)) +
geom_bar(aes(y = Rain),
stat = "identity", fill = "#1f78b4",
alpha = 0.6, width = 0.8
) +
geom_line(aes(y = AVAIL), color = "#33a02c", size = 1.5) +
geom_line(aes(y = Eto),
color = "#ff7f00", size = 1.2,
linetype = "dashed"
) +
scale_x_date(
date_labels = "%b %Y", date_breaks = "1 month",
expand = c(0.01, 0)
) +
scale_y_continuous(
name = "Available Soil Water (mm)",
sec.axis = sec_axis(~., name = "Rainfall (mm)")
) +
labs(
title = "Rainfall, Available Soil Water and
Potential Evapotranspiration",
subtitle = "Data from 2019 to 2020",
x = " ",
y = " "
) +
theme_minimal(base_size = 15) +
theme(
plot.title = element_text(face = "bold", size = 18, hjust = 0.5),
plot.subtitle = element_text(size = 14, hjust = 0.5, color = "grey40"),
axis.title.y = element_text(color = "#33a02c"),
axis.title.y.right = element_text(color = "#1f78b4"),
axis.text.x = element_text(angle = 45, hjust = 1),
panel.grid.minor = element_blank(),
panel.grid.major = element_line(linetype = "dotted", color = "grey80")
)
## ----WSC, fig.height = 6, fig.width = 10, fig.dpi = 300, fig.align = 'center'----
## The wet season calendar is estimated for the onset window ranges from
## 01-September to 31-January having a soil with 80mm of soilWHC:
data(AgroClimateData)
PET <- calcEto(AgroClimateData, method = "HS")
AgroClimateData$Eto <- PET$ET.Daily
soilWHC <- 80
watBal.list <- calcWatBal(data = AgroClimateData, soilWHC)
watBal <- watBal.list$data
onsetWind.start <- "10-01" ## earliest possible start date of the onset window
onsetWind.end <- "01-31" ## the latest possible date for end of the onset window
cessaWind.end <- "06-30" ## the latest possible date for end of the cessation window
seasCal.dF <- calcSeasCal(
data = watBal, onsetWind.start,
onsetWind.end, cessaWind.end, soilWHC
)
str(seasCal.dF)
seasCal.dF$OnsetDate <- as.Date(seasCal.dF$OnsetDate)
seasCal.dF$CessationDate <- as.Date(seasCal.dF$CessationDate)
max_onset <- max(seasCal.dF$OnsetValue, na.rm = TRUE)
max_cessation <- max(seasCal.dF$CessationValue, na.rm = TRUE)
max_value <- max(max_onset, max_cessation)
ggplot(seasCal.dF, aes(x = Year)) +
geom_line(aes(y = OnsetValue, color = "Onset"),
size = 1.5, linetype = "solid"
) +
geom_line(aes(y = CessationValue, color = "Cessation"),
size = 1.5, linetype = "dashed"
) +
geom_point(aes(y = OnsetValue, color = "Onset"),
size = 3,
shape = 21, fill = "white"
) +
geom_point(aes(y = CessationValue, color = "Cessation"),
size = 3, shape = 21, fill = "white"
) +
geom_text_repel(
aes(
y = OnsetValue,
label = ifelse(!is.na(OnsetDate),
format(OnsetDate, "%Y-%m-%d"), ""
),
color = "Onset"
),
size = 3,
box.padding = 0.5, point.padding = 0.5
) +
geom_text_repel(
aes(
y = CessationValue,
label = ifelse(!is.na(CessationDate),
format(CessationDate, "%Y-%m-%d"), ""
),
color = "Cessation"
),
size = 3,
box.padding = 0.5, point.padding = 0.5
) +
scale_y_continuous(
name = paste0(
"Days Since: ",
format(
as.Date(paste0(
"2023-",
onsetWind.start
)),
"%d %b"
)
),
breaks = seq(0, max_value, by = 10)
) +
labs(
title = "Onset and Cessation Dates of the Wet Season",
x = " ", color = "Legend"
) +
theme_minimal(base_size = 14) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 16),
legend.position = "top",
axis.title.x = element_text(face = "bold"),
axis.title.y = element_text(face = "bold"),
legend.title = element_text(face = "bold"),
legend.text = element_text(size = 12),
panel.grid.major = element_line(color = "#e0e0e0"),
panel.grid.minor = element_line(color = "#f0f0f0"),
panel.background = element_rect(fill = "#f7f7f7"),
plot.background = element_rect(fill = "#f7f7f7")
) +
scale_color_manual(
name = "Legend",
values = c(
"Onset" = "#1f77b4",
"Cessation" = "red"
)
)
## ----fcstWSC, fig.width = 8, fig.height = 5, fig.dpi = 300, fig.align = 'center'----
## Load example data:
data(AgroClimateData)
## Estimate daily PET:
PET <- calcEto(AgroClimateData, method = "PM", Zh = 10)
## Add the estimated PET 'ET.Daily' to a new column in AgroClimateData:
AgroClimateData$Eto <- PET$ET.Daily
## Estimate daily water balance for the soil having 100mm of WHC:
watBal.list <- calcWatBal(data = AgroClimateData, soilWHC = 100)
watBal <- watBal.list$data
## seasonal calendar is estimated for the onset window ranges from
## 01 September to 31 January having a soil with 100mm of WHC:
soilWHC <- 100
onsetWind.start <- "09-01"
onsetWind.end <- "01-31"
cessaWind.end <- "06-30"
seasCal.dF <- calcSeasCal(
data = watBal, onsetWind.start, onsetWind.end,
cessaWind.end, soilWHC
)
## Tercile Rainfall Probabilities of seasonal Forecast for OND, 2023:
rainTerc <- data.frame(T1 = 0.15, T2 = 0.10, T3 = 0.75)
## Summarize rainfall data for October to December:
seasRain <- AgroClimateData %>%
filter(Month %in% c(10, 11, 12)) %>%
group_by(Year) %>%
summarize(sRain = sum(Rain))
## Start of the historical resampling year
hisYearStart <- 1991
## End of the historical resampling year
hisYearEnd <- 2022
## Historical WSC Simulations:
hisWSCvar <- seasCal.dF
## WSC variable to forecast:
fcstVarName <- "Onset"
tercileMethod <- "quantiles"
SeasFcst.dF <- seasFcstQBR(
hisYearStart, hisYearEnd, rainTerc,
seasRain, hisWSCvar, fcstVarName,
tercileMethod
)
## Resafel the dataframe for ggplot:
SeasFcst.dFgg <- data.frame(
Category = factor(
c(
"BelowNormal", "Normal",
"AboveNormal"
),
levels = c(
"BelowNormal",
"Normal",
"AboveNormal"
)
),
Probability = c(
(SeasFcst.dF$BelowNormal * 100),
(SeasFcst.dF$Normal * 100),
(SeasFcst.dF$AboveNormal * 100)
)
)
## Create the bar plot:
ggplot(SeasFcst.dFgg, aes(x = Category, y = Probability, fill = Category)) +
geom_bar(stat = "identity", width = 0.7) +
scale_fill_manual(values = c(
"BelowNormal" = "#1f77b4",
"Normal" = "#ff7f0e",
"AboveNormal" = "#2ca02c"
)) +
geom_text(aes(label = paste0(Probability, "%")),
vjust = -0.5,
size = 4, fontface = "bold"
) +
labs(
title = "Seasonal Forecast of the Onset of the Wet Season",
x = " ",
y = "Probability (%)"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
axis.title.x = element_text(size = 14),
axis.title.y = element_text(size = 14),
legend.position = "none"
)
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.