From beeaa415ac15c5d56167dcb8dd9f83956034bb3d Mon Sep 17 00:00:00 2001
From: Reinhold Kainhofer <reinhold@kainhofer.com>
Date: Tue, 22 May 2018 17:46:26 +0200
Subject: [PATCH] Add log and aes arguments to plotMortalityTables

Implement dimensional factors in the plot functions for table comparisons and for the trend
---
 R/plotMortalityTableComparisons.R    |  7 ++-
 R/plotMortalityTables.R              | 77 +++++++++++++----------
 R/plotMortalityTrend.R               | 94 ++++++++++++++++------------
 man/plotMortalityTableComparisons.Rd |  6 +-
 man/plotMortalityTables.Rd           | 13 ++--
 man/plotMortalityTrend.Rd            | 10 +--
 6 files changed, 122 insertions(+), 85 deletions(-)

diff --git a/R/plotMortalityTableComparisons.R b/R/plotMortalityTableComparisons.R
index cb6ca2a..7a0b19d 100644
--- a/R/plotMortalityTableComparisons.R
+++ b/R/plotMortalityTableComparisons.R
@@ -26,6 +26,7 @@
 #' @export
 plotMortalityTableComparisons = function(
     data, ...,
+    aes = NULL,
     ages = NULL,
     xlim = NULL, ylim = NULL,
     xlab = NULL, ylab = NULL,
@@ -56,7 +57,11 @@ plotMortalityTableComparisons = function(
                           env=list(refname=reference@name));
     }
 
-    pl = ggplot(data, aes(x = x, y = y, color = group)) +
+    pl = ggplot(data, aes(x = x, y = y, color = group))
+    if (!is.null(aes)) {
+        pl = pl + aes
+    }
+    pl = pl +
         theme_bw() +
         theme(
             plot.title = element_text(size=18, face="bold"),
diff --git a/R/plotMortalityTables.R b/R/plotMortalityTables.R
index f18668b..981da9e 100644
--- a/R/plotMortalityTables.R
+++ b/R/plotMortalityTables.R
@@ -4,6 +4,7 @@
 #'
 #' @param data First life table to be plotted. Either a \code{data.frame} generated by \code{makeQxDataFrame} or a \code{mortalityTable} object
 #' @param ... Additional life tables to be plotted (if \code{data} is a \code{mortalityTable} object)
+#' @param aes Optional aesthetics to append or override the default. The default aesthetics will always be applied first and provide defaults for x, y and color. This argument can be used to override the defaults or append other aesthetics.
 #' @param xlim X-axis limitatation (as a two-element vector)
 #' @param ylim Y-axis limitatation (as a two-element vector)
 #' @param xlab X-axis label (default: "Alter")
@@ -14,6 +15,7 @@
 #' @param legend.key.width The keywith of the lines in the  legend (default is \code{unit(25,"mm")})
 #' @param legend.title Title of the legend (\code{NULL} to hide)
 #' @param ages Plot only the given ages
+#' @param log Display y axes in logarithmic scale (default: TRUE)
 #'
 #' @examples
 #' # Load the Austrian census data
@@ -40,13 +42,15 @@
 #' @export
 plotMortalityTables = function(
     data, ...,
+    aes = NULL,
     ages = NULL,
     legend.title = "Sterbetafel",
     xlim=NULL, ylim=NULL,
     xlab=NULL, ylab=NULL,
     title = "",
     legend.position = c(0.9,0.1), legend.justification = c(1, 0),
-    legend.key.width = unit(25, "mm")
+    legend.key.width = unit(25, "mm"),
+    log = TRUE
 ) {
     if (!is.data.frame(data)) {
         data = makeQxDataFrame(data, ...);
@@ -58,40 +62,47 @@ plotMortalityTables = function(
     if (!is.null(ages)) {
         data = data[data$x %in% ages,]
     }
-    pl = ggplot(subset(data, y > 0), aes(x = x, y = y, colour = group)) +
-    theme_bw() +
-    theme(
-      plot.title = element_text(size = 18, face = "bold"),
-      legend.title = element_text(size = 14, face = "bold.italic"),
-      # legend in bottom right corner of the plot
-      legend.justification = legend.justification, legend.position = legend.position,
-      # No box around legend entries
-      legend.key = element_blank(),
-      legend.key.width = legend.key.width,
-      legend.background = element_rect(colour = "gray50", linetype = "solid")
-    ) +
-    geom_line(na.rm = TRUE) +
-    scale_y_log10(
-      name = ylab,
-      breaks = scales::trans_breaks('log10', function(x) 10^x),
-      labels = scales::trans_format('log10', scales::math_format(10^.x))
-      #minor_breaks = log(c(sapply(x, function(x) seq(0, x, x/10))), 10)
-    ) +
-    scale_x_continuous(
-      name = xlab,
-      #breaks = function (limits) scales::trans_breaks('', function(x) 10^x),
-      # breaks = function (limits) seq(max(min(limits),0),max(limits),5),
-      minor_breaks = function(limits) seq(max(round(min(limits)), 0), round(max(limits)), 1)
-      #labels = scales::trans_format('log10', scales::math_format(10^.x))
 
+    pl = ggplot(subset(data, y > 0), aes(x = x, y = y, color = group))
+    if (!is.null(aes)) {
+        pl = pl + aes
+    }
+    pl = pl +
+        theme_bw() +
+        theme(
+            plot.title = element_text(size = 14, face = "bold"),
+            legend.title = element_text(size = 12, face = "plain"),
+            # legend in bottom right corner of the plot
+            legend.justification = legend.justification, legend.position = legend.position,
+            # No box around legend entries
+            legend.key = element_blank(),
+            legend.key.width = legend.key.width,
+
+            legend.background = element_rect(colour = "gray50", linetype = "solid")
+        ) +
+        geom_line(na.rm = TRUE)
+
+    if (log) {
+        pl = pl + scale_y_log10(
+            name = ylab,
+            breaks = scales::trans_breaks('log10', function(x) 10^x),
+            labels = scales::trans_format('log10', scales::math_format(10^.x))
+            #minor_breaks = log(c(sapply(x, function(x) seq(0, x, x/10))), 10)
+        ) +
+            annotation_logticks(sides = "lr")
+    }
+
+    pl = pl + scale_x_continuous(
+        name = xlab,
+        minor_breaks = function(limits) seq(max(round(min(limits)), 0), round(max(limits)), 1)
     ) +
-    coord_cartesian(xlim = xlim, ylim = ylim) +
-    annotation_logticks(sides = "lr") +
-    xlab("Alter") + labs(colour = legend.title, shape = legend.title);
-  if (title != "") {
-    pl = pl + ggtitle(title);
-  }
-  pl
+        coord_cartesian(xlim = xlim, ylim = ylim) +
+        xlab("Alter") +
+        labs(colour = legend.title);
+    if (title != "") {
+        pl = pl + ggtitle(title);
+    }
+    pl
 }
 
 globalVariables(c("x", "y", ".x", "group"))
diff --git a/R/plotMortalityTrend.R b/R/plotMortalityTrend.R
index e385f76..9283f5b 100644
--- a/R/plotMortalityTrend.R
+++ b/R/plotMortalityTrend.R
@@ -6,6 +6,7 @@
 #'
 #' @param data First life table to be plotted. Either a \code{data.frame} generated by \code{makeQxDataFrame} or a \code{mortalityTable} object
 #' @param ... Additional life tables to be plotted (if \code{data} is a \code{mortalityTable} object)
+#' @param aes Optional aesthetics to append or override the default. The default aesthetics will always be applied first and provide defaults for x, y and color. This argument can be used to override the defaults or append other aesthetics.
 #' @param xlim X-axis limitatation (as a two-element vector)
 #' @param ylim Y-axis limitatation (as a two-element vector)
 #' @param xlab X-axis label (default: "Alter")
@@ -39,6 +40,7 @@
 #' @export
 plotMortalityTrend = function(
     data, ...,
+    aes = NULL,
     ages = NULL,
     xlim=NULL, ylim=NULL,
     xlab=NULL, ylab=NULL,
@@ -56,60 +58,70 @@ plotMortalityTrend = function(
     if (missing(xlab)) xlab = "Alter";
     if (missing(ylab)) ylab = expression(paste("Sterblichkeitstrend ", lambda[x]));
 
-  pl = ggplot(data, aes(x = x, y = y, colour = data$group)) +
-    theme_bw() +
-    theme(
-      plot.title = element_text(size = 18, face = "bold"),
-      legend.title = element_text(size = 14, face = "bold.italic"),
-      # legend in bottom right corner of the plot
-      legend.justification = legend.justification, legend.position = legend.position,
-      # No box around legend entries
-      legend.key = element_blank(),
-      legend.key.width = legend.key.width,
-      legend.background = element_rect(colour = "gray50", linetype = "solid")
-    ) +
-    geom_line() +
-    scale_y_continuous(
-      name = ylab,
-#      breaks = scales::trans_breaks('log10', function(x) 10^x),
-#      labels = scales::trans_format('log10', scales::math_format(10^.x))
-      #minor_breaks = log(c(sapply(x, function(x) seq(0, x, x/10))), 10)
-    ) +
-    scale_x_continuous(
-      name = xlab,
-      #breaks = function (limits) scales::trans_breaks('', function(x) 10^x),
-      breaks = function(limits) seq(max(min(limits), 0), max(limits), 5),
-      minor_breaks = function(limits) seq(max(round(min(limits)), 0), round(max(limits)), 1)
-      #labels = scales::trans_format('log10', scales::math_format(10^.x))
-    ) +
-    coord_cartesian(xlim = xlim, ylim = ylim) +
-    annotation_logticks(sides = "lr") +
-    xlab("Alter") + labs(colour = legend.title);
-  if (title != "") {
-    pl = pl + ggtitle(title);
-  }
-  pl
+    pl = ggplot(data, aes(x = x, y = y, color = group))
+    if (!is.null(aes)) {
+        pl = pl + aes
+    }
+    pl = pl +
+        theme_bw() +
+        theme(
+            plot.title = element_text(size = 18, face = "bold"),
+            legend.title = element_text(size = 14, face = "bold.italic"),
+            # legend in bottom right corner of the plot
+            legend.justification = legend.justification, legend.position = legend.position,
+            # No box around legend entries
+            legend.key = element_blank(),
+            legend.key.width = legend.key.width,
+            legend.background = element_rect(colour = "gray50", linetype = "solid")
+        ) +
+        geom_line() +
+        scale_y_continuous(
+            name = ylab,
+            #      breaks = scales::trans_breaks('log10', function(x) 10^x),
+            #      labels = scales::trans_format('log10', scales::math_format(10^.x))
+            #minor_breaks = log(c(sapply(x, function(x) seq(0, x, x/10))), 10)
+        ) +
+        scale_x_continuous(
+            name = xlab,
+            #breaks = function (limits) scales::trans_breaks('', function(x) 10^x),
+            breaks = function(limits) seq(max(min(limits), 0), max(limits), 5),
+            minor_breaks = function(limits) seq(max(round(min(limits)), 0), round(max(limits)), 1)
+            #labels = scales::trans_format('log10', scales::math_format(10^.x))
+        ) +
+        coord_cartesian(xlim = xlim, ylim = ylim) +
+        xlab("Alter") + labs(colour = legend.title);
+    if (title != "") {
+        pl = pl + ggtitle(title);
+    }
+    pl
 }
 
 makeMortalityTrendDataFrame = function(..., YOB = 1972, Period = NULL) {
     # If reference is given, normalize all probabilities by that table!
     data = unlist(list(...));
-    names(data) = lapply(data, function(t) t@name);
+    if (is.null(data)) return(data.frame(x = double(), y = double(), group = character()))
+    # names(data) = lapply(data, function(t) t@name);
 
     if (missing(Period) || is.null(Period)) {
         data = lapply(data, function(t) {
-                cbind(x = ages(t), y = mortalityImprovement(t, YOB = YOB))
+            if (is.data.frame(t@data$dim) || is.list(t@data$dim)) {
+                data.frame(x = ages(t), y = `names<-`(mortalityImprovement(t, YOB = YOB), NULL), group = t@name, as.data.frame(t@data$dim))
+            } else {
+                data.frame(x = ages(t), y = `names<-`(mortalityImprovement(t, YOB = YOB), NULL), group = t@name)
+            }
         });
     } else {
         data = lapply(data, function(t) {
-                cbind(x = ages(t), y = mortalityImprovement(t, Period = Period))
+            if (is.data.frame(t@data$dim) || is.list(t@data$dim)) {
+                data.frame(x = ages(t), y = `names<-`(mortalityImprovement(t, Period = Period), NULL), group = t@name, as.data.frame(t@data$dim))
+            } else {
+                data.frame(x = ages(t), y = `names<-`(mortalityImprovement(t, Period = Period), NULL), group = t@name)
+            }
         });
     }
 
-    list.names = names(data)
-    lns <- sapply(data, nrow)
-    data <- as.data.frame(do.call("rbind", data))
-    data$group <- rep(list.names, lns)
+    names(data) = NULL
+    data <- as.data.frame(do.call("rbind.expand", data))
     data
 }
 
@@ -120,7 +132,7 @@ globalVariables(c("x", "y", ".x"))
 # mortalityTables.load("Austria_*")
 # plotMortalityTrend(AVOe1996R.male, AVOe1996R.female, AVOe2005R.male, AVOe2005R.female, YOB=1972, title="Austrian Annuity Tables, YOB=1972 (for cohort tables)")
 #
-# plotMortalityTables(mort.AT.census.2001.male, AVOe2005R.male, YOB=1972, title="Comparison Austrian Tables")
+# plotMortalityTables(mort.AT.census.2001.male, AVOe2005R.male, AVOe2005R.female, YOB=1972, title="Comparison Austrian Tables")
 #  plotMortalityTables(getCohortTable(AVOe2005R.male, YOB=1972), getCohortTable(AVOe2005R.male, YOB=2016), title="Comparison Austrian Tables")
 
 # plotMortalityTrend(EttlPagler.male@qx, AVOe1999P.male@qx, AVOe2008P.male@qx, YOB = 2003, title="Sterblichkeitstrends der Pagler-Tafeln")
diff --git a/man/plotMortalityTableComparisons.Rd b/man/plotMortalityTableComparisons.Rd
index 5acedb9..89766de 100644
--- a/man/plotMortalityTableComparisons.Rd
+++ b/man/plotMortalityTableComparisons.Rd
@@ -4,8 +4,8 @@
 \alias{plotMortalityTableComparisons}
 \title{Plot multiple mortality tables (life tables) in one plot, relative to a given reference table}
 \usage{
-plotMortalityTableComparisons(data, ..., ages = NULL, xlim = NULL,
-  ylim = NULL, xlab = NULL, ylab = NULL, title = "",
+plotMortalityTableComparisons(data, ..., aes = NULL, ages = NULL,
+  xlim = NULL, ylim = NULL, xlab = NULL, ylab = NULL, title = "",
   legend.position = c(0.9, 0.1), legend.justification = c(1, 0),
   legend.title = "Sterbetafel", legend.key.width = unit(25, "mm"),
   reference = NULL)
@@ -15,6 +15,8 @@ plotMortalityTableComparisons(data, ..., ages = NULL, xlim = NULL,
 
 \item{...}{Additional life tables to be plotted (if \code{data} is a \code{mortalityTable} object)}
 
+\item{aes}{Optional aesthetics to append or override the default. The default aesthetics will always be applied first and provide defaults for x, y and color. This argument can be used to override the defaults or append other aesthetics.}
+
 \item{ages}{Plot only the given ages}
 
 \item{xlim}{X-axis limitatation (as a two-element vector)}
diff --git a/man/plotMortalityTables.Rd b/man/plotMortalityTables.Rd
index 58456ee..1ab331a 100644
--- a/man/plotMortalityTables.Rd
+++ b/man/plotMortalityTables.Rd
@@ -4,16 +4,19 @@
 \alias{plotMortalityTables}
 \title{Plot multiple mortality tables (life tables) in one plot}
 \usage{
-plotMortalityTables(data, ..., ages = NULL, legend.title = "Sterbetafel",
-  xlim = NULL, ylim = NULL, xlab = NULL, ylab = NULL, title = "",
-  legend.position = c(0.9, 0.1), legend.justification = c(1, 0),
-  legend.key.width = unit(25, "mm"))
+plotMortalityTables(data, ..., aes = NULL, ages = NULL,
+  legend.title = "Sterbetafel", xlim = NULL, ylim = NULL, xlab = NULL,
+  ylab = NULL, title = "", legend.position = c(0.9, 0.1),
+  legend.justification = c(1, 0), legend.key.width = unit(25, "mm"),
+  log = TRUE)
 }
 \arguments{
 \item{data}{First life table to be plotted. Either a \code{data.frame} generated by \code{makeQxDataFrame} or a \code{mortalityTable} object}
 
 \item{...}{Additional life tables to be plotted (if \code{data} is a \code{mortalityTable} object)}
 
+\item{aes}{Optional aesthetics to append or override the default. The default aesthetics will always be applied first and provide defaults for x, y and color. This argument can be used to override the defaults or append other aesthetics.}
+
 \item{ages}{Plot only the given ages}
 
 \item{legend.title}{Title of the legend (\code{NULL} to hide)}
@@ -33,6 +36,8 @@ plotMortalityTables(data, ..., ages = NULL, legend.title = "Sterbetafel",
 \item{legend.justification}{The justification of the legend (default is \code{c(1,)})}
 
 \item{legend.key.width}{The keywith of the lines in the  legend (default is \code{unit(25,"mm")})}
+
+\item{log}{Display y axes in logarithmic scale (default: TRUE)}
 }
 \description{
 \code{plotMortalityTables} prints multiple life tables (objects of child classes of \code{mortalityTable}) in one log-linear plot, with a legend showing the names of the tables.
diff --git a/man/plotMortalityTrend.Rd b/man/plotMortalityTrend.Rd
index 6d67412..fc77cc3 100644
--- a/man/plotMortalityTrend.Rd
+++ b/man/plotMortalityTrend.Rd
@@ -4,16 +4,18 @@
 \alias{plotMortalityTrend}
 \title{Plot the trends of multiple mortality tables (life tables) in one chart}
 \usage{
-plotMortalityTrend(data, ..., ages = NULL, xlim = NULL, ylim = NULL,
-  xlab = NULL, ylab = NULL, title = "", legend.position = c(0.9, 0.9),
-  legend.justification = c(1, 1), legend.title = "Sterbetafel",
-  legend.key.width = unit(25, "mm"))
+plotMortalityTrend(data, ..., aes = NULL, ages = NULL, xlim = NULL,
+  ylim = NULL, xlab = NULL, ylab = NULL, title = "",
+  legend.position = c(0.9, 0.9), legend.justification = c(1, 1),
+  legend.title = "Sterbetafel", legend.key.width = unit(25, "mm"))
 }
 \arguments{
 \item{data}{First life table to be plotted. Either a \code{data.frame} generated by \code{makeQxDataFrame} or a \code{mortalityTable} object}
 
 \item{...}{Additional life tables to be plotted (if \code{data} is a \code{mortalityTable} object)}
 
+\item{aes}{Optional aesthetics to append or override the default. The default aesthetics will always be applied first and provide defaults for x, y and color. This argument can be used to override the defaults or append other aesthetics.}
+
 \item{ages}{Plot only the given ages}
 
 \item{xlim}{X-axis limitatation (as a two-element vector)}
-- 
GitLab