#------------------------------------------------------------------------------
#' @title Create an individual plot for each name(WELL/FIELD/GROUP) and keyword, with multiple cases on each plot.
#' @description This function accepts a long format dataframe as input, and creates plots using ggplot
#' @param longdata A long format summary dataframe, not the csv file stored with each simulation case output. This may be either the output of the eclsum function, or the file "REPORTS/PROJSUM.csv".
#' @param casenames A list with casenames to be plotted. Default is all casenames in the dataframe.
#' @param wgnames A list with well/group/field names to be plotted. Default is all WELL/FIELD/GROUP names in the dataframe.
#' @param keywords A list with parameters to be plotted, e.g. "WOPR". Default is all keywords in the dataframe.
#' @param basecase The case against which all others will be compared.
#' @param ncolumns How many columns of plots to display. The default is a display 3 columns wide, with as many rows as necessary to plot all of the desired plots.
#' @details The intent of this function is to compare multiple runs (i.e. "cases") on the same plot. With too many cases, the plot will quickly become illegible, so a reasonable selection should be made.
#' @export
PlotEach <- function(longdata,
casenames = NULL,
wgnames = NULL,
keywords = NULL,
basecase = NULL,
ncolumns = 3){
# all of the combinations of case, well and parameter with data
allnames <- casenames
if (is.null(allnames)) {allnames <- unique(longdata$CASENAME)}
if (!is.null(basecase)) {allnames <- c(casenames, basecase)}
allnames <- unique(allnames)
vars.long.df <- .SelectPlotVars(longdata, casenames = allnames,
wgnames = wgnames, keywords = keywords)
all.plots.df <- .FilterLong(longdata, vars.long.df)
plot.vars.df <- unique(vars.long.df[,c("WGNAME", "KEYWORD")])
np <- nrow(plot.vars.df)
if (np < 1) {
return(warning("No data selected for plotting."))
}
# plot layout parameters
nc <- ncolumns
nr <- ceiling(np / nc)
op <- graphics::par(mfrow = c(as.integer(nr),as.integer(nc)))
# plot the selected data by well and parameter, colored by case
for (i in 1:np) {
filt <- plot.vars.df$WGNAME[i] == all.plots.df$WGNAME &
plot.vars.df$KEYWORD[i] == all.plots.df$KEYWORD
plotdf <- all.plots.df[filt,]
plotdf$CASENAME <- factor(plotdf$CASENAME, levels = unique(plotdf$CASENAME))
rownums <- match(unique(plotdf$CASENAME), plotdf$CASENAME)
# plotdf <- dplyr::mutate(plotdf, linetype = "solid", symbol = 20)
plotdf <- dplyr::mutate(plotdf, linetype = 1, symbol = 20)
# 20 is a small filled circle
# plotdf$linetype[plotdf$CASENAME == basecase] <- "blank"
no.bc.df <- plotdf
bc.only.df <- plotdf
if (!is.null(basecase)) {
plotdf$linetype[plotdf$CASENAME == basecase] <- 0
plotdf$symbol[!plotdf$CASENAME == basecase] <- 46
bc.only.df <- plotdf[plotdf$CASENAME == basecase,]
no.bc.df <- plotdf[!plotdf$CASENAME == basecase,]
}
# 46 is a dot (invisible under a line)
lns_pts <- data.frame(CASENAME = plotdf$CASENAME[rownums],
linetype = plotdf$linetype[rownums],
symbol = plotdf$symbol[rownums],
row.names = plotdf$CASENAME[rownums],
stringsAsFactors = FALSE)
man.cols <- pals::glasbey(nrow(lns_pts))
# pals::pal.bands(man.cols)
n <- plot.vars.df$WGNAME[i]
k <- plot.vars.df$KEYWORD[i]
lead <- "Well: "
b1pat <- "^\\d+$"
b2pat <- "^\\d+_\\d+_\\d+$"
fpat <- "FIELD"
if (any(grep(b1pat,n,perl = TRUE)) |
any(grep(b2pat,n,perl = TRUE))) {lead <- "Block: "}
if (any(grep(fpat,n,perl = TRUE))) {lead <- ""}
title <- .WGN_KW2Title(wgn = n, keyword = k)
ggp <- ggplot2::ggplot(data = plotdf,
ggplot2::aes(x = DATE, y = VALUE, color = CASENAME,
order = as.numeric(CASENAME)))
ggp <- ggp +
ggplot2::geom_line(data = no.bc.df,
ggplot2::aes(x = DATE, y = VALUE, color = CASENAME))
if (!is.null(basecase)) {
ggp <- ggp +
ggplot2::geom_point(data = bc.only.df,
ggplot2::aes(x = DATE, y = VALUE,
color = CASENAME))
}
ggp <- ggp +
ggplot2::scale_color_manual(breaks = lns_pts$CASENAME,
values = man.cols,
guide = ggplot2::guide_legend(
override.aes = list(shape = lns_pts$symbol,
linetype = lns_pts$linetype)
))
ggp <- ggp + ggplot2::labs(
title = title,
y = .KW2Label(plot.vars.df$KEYWORD[i])
)
ggp <- ggp + ggplot2::theme_bw()
ggp <- ggp + ggplot2::theme(
axis.text.x = ggplot2::element_text(angle = 90, vjust = 0.5),
legend.title = ggplot2::element_text(size = 8),
legend.text = ggplot2::element_text(size = 7),
legend.background = ggplot2::element_rect(fill = "white",
color = "black"),
legend.spacing = grid::unit(0.1, units = "points"),
legend.justification = "right",
legend.position = c(0.99, 0.5),
panel.grid.major = ggplot2::element_line(color = "lightgrey",
size = 1,
linetype = 1)
)
# ggp
print(ggp)
}
graphics::par(op)
}
#------------------------------------------------------------------------------
.SelectPlotVars <- function(longdata,
casenames = NULL,
wgnames = NULL,
keywords = NULL){
vars.long.df = unique(longdata[,c("CASENAME", "WGNAME", "KEYWORD")])
df <- vars.long.df[0,]
# filter down to selected cases
if (!is.null(casenames)) {
for (i in 1:length(casenames)) {
filt <- vars.long.df$CASENAME == casenames[i]
df <- rbind(df, vars.long.df[filt,])
}
vars.long.df <- df
}
df <- vars.long.df[0,]
# filter down again to selected wells
if (!is.null(wgnames)) {
for (i in 1:length(wgnames)) {
filt <- vars.long.df$WGNAME == wgnames[i]
df <- rbind(df, vars.long.df[filt,])
}
vars.long.df <- df
}
df <- vars.long.df[0,]
# filter down again to selected parameters
if (!is.null(keywords)) {
for (i in 1:length(keywords)) {
filt <- vars.long.df$KEYWORD == keywords[i]
df <- rbind(df, vars.long.df[filt,])
}
vars.long.df <- df
}
return(vars.long.df)
}
#------------------------------------------------------------------------------
.FilterLong <- function(longdata, vars.long.df){
case_filt <- .List2Filt(vars.long.df$CASENAME, longdata$CASENAME)
wgn_filt <- .List2Filt(vars.long.df$WGNAME, longdata$WGNAME)
key_filt <- .List2Filt(vars.long.df$KEYWORD, longdata$KEYWORD)
filt <- case_filt & wgn_filt & key_filt
all.plots.df <- longdata[filt,]
return(all.plots.df)
}
#------------------------------------------------------------------------------
.BuildPlotFIlter <- function(longdata,
casenames = NULL,
wgnames = NULL,
keywords = NULL,
vars.long.df = NULL){
df <- vars.long.df[0,]
# filter down to selected cases
if (!is.null(casenames)) {
for (i in 1:length(casenames)) {
filt <- vars.long.df$CASENAME == casenames[i]
df <- rbind(df, vars.long.df[filt,])
}
vars.long.df <- df
}
# filter down again to selected wells
if (!is.null(wgnames)) {
for (i in 1:length(wgnames)) {
filt <- vars.long.df$WGNAME == wgnames[i]
df <- rbind(df, vars.long.df[filt,])
}
vars.long.df <- df
}
# filter down again to selected parameters
if (!is.null(keywords)) {
for (i in 1:length(keywords)) {
filt <- vars.long.df$KEYWORD == keywords[i]
df <- rbind(df, vars.long.df[filt,])
}
vars.long.df <- df
}
return(vars.long.df)
}
#------------------------------------------------------------------------------
.UniqueVars <- function(longdata){
vl <- unique(paste(longdata$CASENAME,
longdata$WGNAME,
longdata$KEYWORD,sep = ":"))
vars.long.df <- as.data.frame(t(as.data.frame(strsplit(vl,":"))),
stringsAsFactors = FALSE)
rownames(vars.long.df) <- NULL
rownames(vars.long.df) <- rownames(vars.long.df, do.NULL = FALSE,
prefix = "")
colnames(vars.long.df) <- c("CASENAME","WGNAME","KEYWORD")
return(vars.long.df)
}
#------------------------------------------------------------------------------
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.