Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Side-by-side plot of user selected variables across scenarios #84

Merged
merged 25 commits into from
Feb 28, 2024
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .buildlibrary
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
ValidationKey: '28951650'
ValidationKey: '29195960'
AcceptedWarnings:
- 'Warning: package ''.*'' was built under R version'
- 'Warning: namespace ''.*'' is not available and has been replaced'
Expand Down
7 changes: 5 additions & 2 deletions CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ cff-version: 1.2.0
message: If you use this software, please cite it using the metadata from this file.
type: software
title: 'mip: Comparison of multi-model runs'
version: 0.147.0
date-released: '2023-12-04'
version: 0.148.0
date-released: '2024-01-05'
abstract: Package contains generic functions to produce comparison plots of multi-model
runs.
authors:
Expand All @@ -30,6 +30,9 @@ authors:
email: [email protected]
- family-names: Richters
given-names: Oliver
- family-names: Rüter
given-names: Tonn
email: [email protected]
license: BSD-2-Clause
repository-code: https://github.com/pik-piam/mip
doi: 10.5281/zenodo.1158586
Expand Down
15 changes: 8 additions & 7 deletions DESCRIPTION
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
Type: Package
Package: mip
Title: Comparison of multi-model runs
Version: 0.147.0
Date: 2023-12-04
Version: 0.148.0
Date: 2024-01-05
Authors@R: c(
person("David", "Klein", , "[email protected]", role = c("aut", "cre")),
person("Jan Philipp", "Dietrich", , "[email protected]", role = "aut"),
Expand All @@ -11,7 +11,8 @@ Authors@R: c(
person("Miodrag", "Stevanovic", , "[email protected]", role = "aut"),
person("Stephen", "Wirth", , "[email protected]", role = "aut"),
person("Pascal", "Führlich", , "[email protected]", role = "aut"),
person("Oliver", "Richters", role = "aut")
person("Oliver", "Richters", role = "aut"),
person("Tonn", "Rüter", , "[email protected]", role = "aut")
)
Description: Package contains generic functions to produce comparison
plots of multi-model runs.
Expand All @@ -36,14 +37,14 @@ Imports:
rlang,
shiny,
tidyr,
trafficlight
Suggests:
covr,
trafficlight,
stringr
Suggests:
gdxrrw,
knitr,
rmarkdown,
testthat
VignetteBuilder:
VignetteBuilder:
knitr
Encoding: UTF-8
LazyData: yes
Expand Down
5 changes: 5 additions & 0 deletions NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ export(mipArea)
export(mipBarYearData)
export(mipIterations)
export(mipLineHistorical)
export(plotPercentiles)
export(plotstyle)
export(plotstyle.add)
export(scenTool)
Expand Down Expand Up @@ -52,6 +53,7 @@ importFrom(dplyr,summarise)
importFrom(dplyr,summarize)
importFrom(dplyr,sym)
importFrom(dplyr,ungroup)
importFrom(dplyr,vars)
importFrom(ggplot2,"%+replace%")
importFrom(ggplot2,aes)
importFrom(ggplot2,aes_)
Expand All @@ -72,6 +74,7 @@ importFrom(ggplot2,geom_col)
importFrom(ggplot2,geom_hline)
importFrom(ggplot2,geom_line)
importFrom(ggplot2,geom_point)
importFrom(ggplot2,geom_ribbon)
importFrom(ggplot2,geom_text)
importFrom(ggplot2,geom_vline)
importFrom(ggplot2,ggplot)
Expand Down Expand Up @@ -191,8 +194,10 @@ importFrom(stats,median)
importFrom(stats,na.omit)
importFrom(stats,reshape)
importFrom(stats,runif)
importFrom(stringr,str_extract)
importFrom(tidyr,crossing)
importFrom(tidyr,drop_na)
importFrom(tidyr,pivot_wider)
importFrom(tidyr,unite)
importFrom(tools,file_ext)
importFrom(tools,file_path_sans_ext)
Expand Down
107 changes: 107 additions & 0 deletions R/plotPercentiles.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
#' Comparison plots show user selected variables obtained from different scenario
tonnrueter marked this conversation as resolved.
Show resolved Hide resolved
#' runs

#' @author Tonn Rueter
#' @param df `quitte` style data frame containing all variables for each scenario
#' @param scenarios Character vector contains names of the desired scenarios. If none, all scenarios will be displayed
#' @param variables Character vector contains names of the desired variables. If none, all variables will be displayed
#' @importFrom dplyr filter mutate vars
#' @importFrom reshape2 melt
#' @importFrom stringr str_extract
#' @importFrom tidyr pivot_wider
#' @importFrom ggplot2 ggplot geom_line geom_ribbon facet_wrap facet_grid theme ylab
#' @export
plotPercentiles <- function(df, scenarios = NULL, variables = NULL) {

# In the quitte data frame all perenctiles are given as individual variables
# Manipulate input data frame such that all percentiles of a given quantity
# are transformed to individual columns. Variable names in the quitte data
tonnrueter marked this conversation as resolved.
Show resolved Hide resolved
# frame follow the format "Any|Variable|5.0th Percentile". The regular
# expressions below divide the variable name into the prefix and the
# percentile specifier
data <- df %>%
mutate(
"percentile" = stringr::str_extract(.data$variable, "[^\\|]+?$"),
"variable" = gsub("\\|[^\\|]+$", "", .data$variable)
) %>%
pivot_wider(
names_from = "percentile",
values_from = "value"
)

# Check which scenarios/variabes are available
uniqueScenarios <- unique(data$scenario)
tonnrueter marked this conversation as resolved.
Show resolved Hide resolved
uniqueVariables <- unique(data$variable)

# Check which function parameters have been provided and default to unique
# values from the data frame in case none have
theseScenarios <- if (is.null(scenarios)) {
uniqueScenarios
} else if (allItemsAvailable(scenarios, uniqueScenarios, warn = TRUE)) {
scenarios
} else {
stop("Provided scenario is missing in data")
}
theseVariables <- if (is.null(variables)) {
uniqueVariables
} else if (allItemsAvailable(variables, uniqueVariables, warn = TRUE)) {
variables
} else {
stop("Provided variable is missing in data")
}

# Set up the plot
p <- ggplot()

# Fill plot by filtering for the requested variables and scenarios
for (thisVariable in theseVariables) {
for (thisScenario in theseScenarios) {
plotData <- filter(data, .data$variable == thisVariable & .data$scenario == thisScenario)
p <- p +
geom_line(
data = plotData, aes(x = .data$period, y = get("50.0th Percentile"))
tonnrueter marked this conversation as resolved.
Show resolved Hide resolved
) +
geom_ribbon(
data = plotData, aes(x = .data$period, ymin = get("33.0th Percentile"), ymax = get("67.0th Percentile")),
fill = "#68788a", alpha = 0.5
) +
geom_ribbon(
data = plotData, aes(x = .data$period, ymin = get("5.0th Percentile"), ymax = get("95.0th Percentile")),
fill = "#68788a", alpha = 0.2
)
}
}

# Depending on the function parameters, plots need to be arranged
if (length(theseScenarios) == 1) {
# Plots all parameters for a given scenario. Y-axes need to be independent
p <- p +
facet_wrap(vars(.data$variable), scales = "free_y", ncol = 1) +
theme(axis.title.x = element_blank()) +
ylab(unique(data$unit))
} else if (length(theseVariables) == 1) {
# Plots a given parameter for all scenarios. Lock y-axes to improve comparison
p <- p +
facet_wrap(vars(.data$scenario)) +
theme(axis.title.x = element_blank()) +
ylab(unique(data$unit))
} else {
# Using facet grid when multiple variables in multiple scenarios are compared
p <- p +
facet_grid(.data$variable ~ .data$scenario, scales = "free_y") +
theme(axis.title.x = element_blank()) +
ylab(unique(data$unit))
}

return(p)
}

allItemsAvailable <- function(selection, available, warn = FALSE) {
for (item in selection) {
if (!(item %in% available)) {
if (warn) warning(paste0("'", item, "' missing in available data"))
return(FALSE)
}
}
return(TRUE)
}
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Comparison of multi-model runs

R package **mip**, version **0.147.0**
R package **mip**, version **0.148.0**

[![CRAN status](https://www.r-pkg.org/badges/version/mip)](https://cran.r-project.org/package=mip) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.1158586.svg)](https://doi.org/10.5281/zenodo.1158586) [![R build status](https://github.com/pik-piam/mip/workflows/check/badge.svg)](https://github.com/pik-piam/mip/actions) [![codecov](https://codecov.io/gh/pik-piam/mip/branch/master/graph/badge.svg)](https://app.codecov.io/gh/pik-piam/mip) [![r-universe](https://pik-piam.r-universe.dev/badges/mip)](https://pik-piam.r-universe.dev/builds)

Expand Down Expand Up @@ -47,16 +47,16 @@ In case of questions / problems please contact David Klein <[email protected]

To cite package **mip** in publications use:

Klein D, Dietrich J, Baumstark L, Humpenoeder F, Stevanovic M, Wirth S, Führlich P, Richters O (2023). _mip: Comparison of multi-model runs_. doi:10.5281/zenodo.1158586 <https://doi.org/10.5281/zenodo.1158586>, R package version 0.147.0, <https://github.com/pik-piam/mip>.
Klein D, Dietrich J, Baumstark L, Humpenoeder F, Stevanovic M, Wirth S, Führlich P, Richters O, Rüter T (2024). _mip: Comparison of multi-model runs_. doi:10.5281/zenodo.1158586 <https://doi.org/10.5281/zenodo.1158586>, R package version 0.148.0, <https://github.com/pik-piam/mip>.

A BibTeX entry for LaTeX users is

```latex
@Manual{,
title = {mip: Comparison of multi-model runs},
author = {David Klein and Jan Philipp Dietrich and Lavinia Baumstark and Florian Humpenoeder and Miodrag Stevanovic and Stephen Wirth and Pascal Führlich and Oliver Richters},
year = {2023},
note = {R package version 0.147.0},
author = {David Klein and Jan Philipp Dietrich and Lavinia Baumstark and Florian Humpenoeder and Miodrag Stevanovic and Stephen Wirth and Pascal Führlich and Oliver Richters and Tonn Rüter},
year = {2024},
note = {R package version 0.148.0},
doi = {10.5281/zenodo.1158586},
url = {https://github.com/pik-piam/mip},
}
Expand Down