From 51a3e1a0fb3e4f27650162fe493c378b00ee4be9 Mon Sep 17 00:00:00 2001
From: Grant McDermott <grant.mcdermott@gmail.com>
Date: Sun, 8 Sep 2024 20:48:55 -0700
Subject: [PATCH 01/72] initial attempt at flip support

---
 R/draw_elements.R | 97 +++++++++++++++++++++++++++++++++--------------
 R/facet.R         | 28 ++++++++++++--
 R/tinyplot.R      | 42 +++++++++++++++++++-
 3 files changed, 132 insertions(+), 35 deletions(-)

diff --git a/R/draw_elements.R b/R/draw_elements.R
index e96afc87..46d104e2 100644
--- a/R/draw_elements.R
+++ b/R/draw_elements.R
@@ -22,44 +22,83 @@ draw_elements = function(
     facet_by,
     split_data,
     i = 1,
-    xlvls,
-    lgnd_labs,
-    x_by = FALSE
+    xlvls,     # do we still need this?
+    lgnd_labs, # ditto?
+    x_by = FALSE,
+    flip = FALSE
     ) {
 
       ## polygons before lines, segments/arrows before points, etc.
       if (isTRUE(empty_plot)) {
 
       } else if (type == "ribbon") {
-        polygon(
-          x = c(xx, rev(xx)),
-          y = c(yymin, rev(yymax)),
-          col = bg[i],
-          border = FALSE
-        )
+        if (isFALSE(flip)) {
+          polygon(
+            x = c(xx, rev(xx)),
+            y = c(yymin, rev(yymax)),
+            col = bg[i],
+            border = FALSE
+          )
+        } else {
+          polygon(
+            x = c(xxmin, rev(xxmax)),
+            y = c(yy, rev(yy)),
+            col = bg[i],
+            border = FALSE
+          )
+          
+        }
+        
       } else if (type == "pointrange") {
-        segments(
-          x0 = xx,
-          y0 = yymin,
-          x1 = xx,
-          y1 = yymax,
-          col = icol,
-          # lty = ilty,
-          lwd = ilwd
+        if (isFALSE(flip)) {
+          segments(
+            x0 = xx,
+            y0 = yymin,
+            x1 = xx,
+            y1 = yymax,
+            col = icol,
+            # lty = ilty,
+            lwd = ilwd
+          )
+        } else (
+          segments(
+            x0 = xxmin,
+            y0 = yy,
+            x1 = xxmax,
+            y1 = yy,
+            col = icol,
+            # lty = ilty,
+            lwd = ilwd
+          )
         )
       } else if (type == "errorbar") {
-        arrows(
-          x0 = xx,
-          y0 = yymin,
-          x1 = xx,
-          y1 = yymax,
-          col = icol,
-          # lty = ilty,
-          lwd = ilwd,
-          length = 0.05,
-          angle = 90,
-          code = 3
-        )
+        if (isFALSE(flip)) {
+          arrows(
+            x0 = xx,
+            y0 = yymin,
+            x1 = xx,
+            y1 = yymax,
+            col = icol,
+            # lty = ilty,
+            lwd = ilwd,
+            length = 0.05,
+            angle = 90,
+            code = 3
+          )
+        } else {
+          arrows(
+            x0 = xxmin,
+            y0 = yy,
+            x1 = xxmax,
+            y1 = yy,
+            col = icol,
+            # lty = ilty,
+            lwd = ilwd,
+            length = 0.05,
+            angle = 90,
+            code = 3
+          )
+        }
       }
 
       ## now draw the points/lines/polygons/etc
diff --git a/R/facet.R b/R/facet.R
index afcb2a3f..4bbc1123 100644
--- a/R/facet.R
+++ b/R/facet.R
@@ -240,7 +240,12 @@ draw_facet_window = function(grid, ...) {
           } else {
             tinyAxis(x, side = xside, type = xaxt)
           }
-          tinyAxis(y, side = yside, type = yaxt)
+          # tinyAxis(y, side = yside, type = yaxt)
+          if (isTRUE(flip) && type %in% c("pointrange", "errorbar", "ribbon", "boxplot", "p") && !is.null(ylabs)) {
+            tinyAxis(y, side = yside, at = ylabs, labels = names(ylabs), type = yaxt)
+          } else {
+            tinyAxis(y, side = yside, type = yaxt)
+          }
         } else {
           # ... else only print the "outside" axes.
           if (ii %in% oxaxis) {
@@ -251,7 +256,12 @@ draw_facet_window = function(grid, ...) {
             }
           }
           if (ii %in% oyaxis) {
-            tinyAxis(y, side = yside, type = yaxt)
+            # tinyAxis(y, side = yside, type = yaxt)
+            if (isTRUE(flip) && type %in% c("pointrange", "errorbar", "ribbon", "boxplot", "p") && !is.null(ylabs)) {
+              tinyAxis(y, side = yside, at = ylabs, labels = names(ylabs), type = yaxt)
+            } else {
+              tinyAxis(y, side = yside, type = yaxt)
+            }
           }
         }
       }
@@ -403,11 +413,21 @@ draw_facet_window = function(grid, ...) {
           if (isTRUE(grid)) {
             gnx = gny = NULL
             if (!par("xlog")) {
-              abline(v = pretty(extendrange(x)), col = "lightgray", lty = "dotted", lwd = par("lwd"))
+              # abline(v = pretty(extendrange(x)), col = "lightgray", lty = "dotted", lwd = par("lwd"))
+              if (isFALSE(flip)) {
+                abline(v = pretty(extendrange(x)), col = "lightgray", lty = "dotted", lwd = par("lwd"))
+              } else {
+                abline(h = pretty(extendrange(x)), col = "lightgray", lty = "dotted", lwd = par("lwd"))
+              }
               gnx = NA
             }
             if (!par("ylog")) {
-              abline(h = pretty(extendrange(c(y, ymin, ymax))), col = "lightgray", lty = "dotted", lwd = par("lwd"))
+              # abline(h = pretty(extendrange(c(y, ymin, ymax))), col = "lightgray", lty = "dotted", lwd = par("lwd"))
+              if (isFALSE(flip)) {
+                abline(h = pretty(extendrange(c(y, ymin, ymax))), col = "lightgray", lty = "dotted", lwd = par("lwd"))
+              } else {
+                abline(v = pretty(extendrange(c(y, ymin, ymax))), col = "lightgray", lty = "dotted", lwd = par("lwd"))
+              }
               gny = NA
             }
             grid(nx = gnx, ny = gny)
diff --git a/R/tinyplot.R b/R/tinyplot.R
index c622adfa..ba84ce18 100644
--- a/R/tinyplot.R
+++ b/R/tinyplot.R
@@ -245,6 +245,9 @@
 #' @param add logical. If TRUE, then elements are added to the current plot rather
 #'   than drawing a new plot window. Note that the automatic legend for the
 #'   added elements will be turned off.
+#' @param flip logical. Should the plot orientation be flipped, so that the
+#'   y-axis is on the horizontal plane and the x-axis is on the vertical plane?
+#'   Default is FALSE.
 #' @param file character string giving the file path for writing a plot to disk.
 #'   If specified, the plot will not be displayed interactively, but rather sent
 #'   to the appropriate external graphics device (i.e.,
@@ -518,6 +521,7 @@ tinyplot.default = function(
     empty = FALSE,
     xaxt = NULL,
     yaxt = NULL,
+    flip = FALSE,
     ...
     ) {
   
@@ -675,6 +679,39 @@ tinyplot.default = function(
     list2env(fargs, environment())
   }
   
+  # swap x and y values if flip is TRUE
+  if (isTRUE(flip) && type != "boxplot") {
+    # limits, labs, etc.
+    xlim_cp = xlim
+    xlim = ylim
+    ylim = xlim_cp
+    xlab_cp = xlab
+    xlab = ylab
+    ylab = xlab_cp
+    xlabs_cp = xlabs
+    xlabs = ylabs
+    ylabs = xlabs_cp
+    xaxt_cp = xaxt
+    xaxt = yaxt
+    yaxt = xaxt_cp
+    # log
+    # x/y vars
+    x_cp = datapoints[['x']]
+    datapoints[['x']] = datapoints[['y']]
+    datapoints[['y']] = x_cp
+    # x/y min and max vars
+    xmin_cp = if (!is.null(datapoints[['xmin']])) datapoints[['xmin']] else NULL
+    datapoints[['xmin']] = if (!is.null(datapoints[['ymin']])) datapoints[['ymin']] else NULL
+    datapoints[['ymin']] = if (!is.null(xmin_cp)) xmin_cp else NULL
+    xmax_cp = if (!is.null(datapoints[['xmax']])) datapoints[['xmax']] else NULL
+    datapoints[['xmax']] = if (!is.null(datapoints[['ymax']])) datapoints[['ymax']] else NULL
+    datapoints[['ymax']] = if (!is.null(xmax_cp)) xmax_cp else NULL
+    # clean up
+    rm(xlim_cp, xlab_cp, xlabs_cp, xaxt_cp, x_cp, xmin_cp, xmax_cp) 
+  }
+  
+  
+  
   # plot limits
   fargs = lim_args(
     datapoints = datapoints, xlim = xlim, ylim = ylim, palette = palette,
@@ -917,7 +954,7 @@ tinyplot.default = function(
     nfacet_rows = nfacet_rows, nfacets = nfacets, oxaxis = oxaxis, oyaxis =
     oyaxis, type = type, x = x, xaxt = xaxt, xlab = xlab, xlabs = xlabs, xlim =
     xlim, xmax = xmax, xmin = xmin, y = y, yaxt = yaxt, ylab = ylab, ylabs =
-    ylabs, ylim = ylim, ymax = ymax, ymin = ymin
+    ylabs, ylim = ylim, ymax = ymax, ymin = ymin, flip = flip
   )
   list2env(facet_window_args, environment())
 
@@ -1018,7 +1055,8 @@ tinyplot.default = function(
         i = i,
         xlvls = xlvls,
         lgnd_labs = lgnd_labs,
-        x_by = x_by
+        x_by = x_by,
+        flip = flip
       )
     }
   }

From c7dc99810f09b9bb98e3cdb65d80a538cf78871d Mon Sep 17 00:00:00 2001
From: Grant McDermott <grant.mcdermott@gmail.com>
Date: Sun, 8 Sep 2024 20:56:46 -0700
Subject: [PATCH 02/72] catch logs and boxplots

---
 R/tinyplot.R | 62 ++++++++++++++++++++++++++++------------------------
 1 file changed, 34 insertions(+), 28 deletions(-)

diff --git a/R/tinyplot.R b/R/tinyplot.R
index ba84ce18..31921ca5 100644
--- a/R/tinyplot.R
+++ b/R/tinyplot.R
@@ -680,34 +680,40 @@ tinyplot.default = function(
   }
   
   # swap x and y values if flip is TRUE
-  if (isTRUE(flip) && type != "boxplot") {
-    # limits, labs, etc.
-    xlim_cp = xlim
-    xlim = ylim
-    ylim = xlim_cp
-    xlab_cp = xlab
-    xlab = ylab
-    ylab = xlab_cp
-    xlabs_cp = xlabs
-    xlabs = ylabs
-    ylabs = xlabs_cp
-    xaxt_cp = xaxt
-    xaxt = yaxt
-    yaxt = xaxt_cp
-    # log
-    # x/y vars
-    x_cp = datapoints[['x']]
-    datapoints[['x']] = datapoints[['y']]
-    datapoints[['y']] = x_cp
-    # x/y min and max vars
-    xmin_cp = if (!is.null(datapoints[['xmin']])) datapoints[['xmin']] else NULL
-    datapoints[['xmin']] = if (!is.null(datapoints[['ymin']])) datapoints[['ymin']] else NULL
-    datapoints[['ymin']] = if (!is.null(xmin_cp)) xmin_cp else NULL
-    xmax_cp = if (!is.null(datapoints[['xmax']])) datapoints[['xmax']] else NULL
-    datapoints[['xmax']] = if (!is.null(datapoints[['ymax']])) datapoints[['ymax']] else NULL
-    datapoints[['ymax']] = if (!is.null(xmax_cp)) xmax_cp else NULL
-    # clean up
-    rm(xlim_cp, xlab_cp, xlabs_cp, xaxt_cp, x_cp, xmin_cp, xmax_cp) 
+  if (isTRUE(flip)) {
+    if (type != "boxplot") {
+      # limits, labs, etc.
+      xlim_cp = xlim
+      xlim = ylim
+      ylim = xlim_cp
+      xlab_cp = xlab
+      xlab = ylab
+      ylab = xlab_cp
+      xlabs_cp = xlabs
+      xlabs = ylabs
+      ylabs = xlabs_cp
+      xaxt_cp = xaxt
+      xaxt = yaxt
+      yaxt = xaxt_cp
+      if (!is.null(log)) {
+        log = if (log=="x") "y" else if (log=="y") "x" else log
+      }
+      # x/y vars
+      x_cp = datapoints[['x']]
+      datapoints[['x']] = datapoints[['y']]
+      datapoints[['y']] = x_cp
+      # x/y min and max vars
+      xmin_cp = if (!is.null(datapoints[['xmin']])) datapoints[['xmin']] else NULL
+      datapoints[['xmin']] = if (!is.null(datapoints[['ymin']])) datapoints[['ymin']] else NULL
+      datapoints[['ymin']] = if (!is.null(xmin_cp)) xmin_cp else NULL
+      xmax_cp = if (!is.null(datapoints[['xmax']])) datapoints[['xmax']] else NULL
+      datapoints[['xmax']] = if (!is.null(datapoints[['ymax']])) datapoints[['ymax']] else NULL
+      datapoints[['ymax']] = if (!is.null(xmax_cp)) xmax_cp else NULL
+      # clean up
+      rm(xlim_cp, xlab_cp, xlabs_cp, xaxt_cp, x_cp, xmin_cp, xmax_cp) 
+    } else {
+      dots[["horizontal"]] = TRUE
+    }
   }
   
   

From 6bfee6deb769f82754bddd47785a38cbc6ec8df5 Mon Sep 17 00:00:00 2001
From: Grant McDermott <grant.mcdermott@gmail.com>
Date: Sat, 21 Sep 2024 10:02:41 -0700
Subject: [PATCH 03/72] simplify grid using x/ylim

---
 R/facet.R | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/R/facet.R b/R/facet.R
index 4bbc1123..d37c1459 100644
--- a/R/facet.R
+++ b/R/facet.R
@@ -415,9 +415,11 @@ draw_facet_window = function(grid, ...) {
             if (!par("xlog")) {
               # abline(v = pretty(extendrange(x)), col = "lightgray", lty = "dotted", lwd = par("lwd"))
               if (isFALSE(flip)) {
+                # would be nice to use xlim but fails for date types
                 abline(v = pretty(extendrange(x)), col = "lightgray", lty = "dotted", lwd = par("lwd"))
+                # abline(v = pretty(xlim), col = "lightgray", lty = "dotted", lwd = par("lwd"))
               } else {
-                abline(h = pretty(extendrange(x)), col = "lightgray", lty = "dotted", lwd = par("lwd"))
+                abline(v = pretty(xlim), col = "lightgray", lty = "dotted", lwd = par("lwd"))
               }
               gnx = NA
             }
@@ -425,8 +427,9 @@ draw_facet_window = function(grid, ...) {
               # abline(h = pretty(extendrange(c(y, ymin, ymax))), col = "lightgray", lty = "dotted", lwd = par("lwd"))
               if (isFALSE(flip)) {
                 abline(h = pretty(extendrange(c(y, ymin, ymax))), col = "lightgray", lty = "dotted", lwd = par("lwd"))
+                # abline(h = pretty(ylim), col = "lightgray", lty = "dotted", lwd = par("lwd"))
               } else {
-                abline(v = pretty(extendrange(c(y, ymin, ymax))), col = "lightgray", lty = "dotted", lwd = par("lwd"))
+                abline(h = pretty(ylim), col = "lightgray", lty = "dotted", lwd = par("lwd"))
               }
               gny = NA
             }

From a03e537a8e6eb9cde05bc1d1036cd22e4bc7213b Mon Sep 17 00:00:00 2001
From: Grant McDermott <grant.mcdermott@gmail.com>
Date: Sat, 21 Sep 2024 10:43:48 -0700
Subject: [PATCH 04/72] add tests

---
 inst/tinytest/_tinysnapshot/flip_boxplot.svg  | 105 +++++
 inst/tinytest/_tinysnapshot/flip_density.svg  |  96 +++++
 inst/tinytest/_tinysnapshot/flip_facet_by.svg | 379 ++++++++++++++++++
 inst/tinytest/_tinysnapshot/flip_hist.svg     | 124 ++++++
 inst/tinytest/_tinysnapshot/flip_p.svg        | 246 ++++++++++++
 inst/tinytest/_tinysnapshot/flip_p_logx.svg   | 246 ++++++++++++
 .../_tinysnapshot/flip_pointrange.svg         |  70 ++++
 .../_tinysnapshot/flip_ribbon_pred.svg        | 126 ++++++
 inst/tinytest/test-flip.R                     | 108 +++++
 9 files changed, 1500 insertions(+)
 create mode 100644 inst/tinytest/_tinysnapshot/flip_boxplot.svg
 create mode 100644 inst/tinytest/_tinysnapshot/flip_density.svg
 create mode 100644 inst/tinytest/_tinysnapshot/flip_facet_by.svg
 create mode 100644 inst/tinytest/_tinysnapshot/flip_hist.svg
 create mode 100644 inst/tinytest/_tinysnapshot/flip_p.svg
 create mode 100644 inst/tinytest/_tinysnapshot/flip_p_logx.svg
 create mode 100644 inst/tinytest/_tinysnapshot/flip_pointrange.svg
 create mode 100644 inst/tinytest/_tinysnapshot/flip_ribbon_pred.svg
 create mode 100644 inst/tinytest/test-flip.R

diff --git a/inst/tinytest/_tinysnapshot/flip_boxplot.svg b/inst/tinytest/_tinysnapshot/flip_boxplot.svg
new file mode 100644
index 00000000..7039737b
--- /dev/null
+++ b/inst/tinytest/_tinysnapshot/flip_boxplot.svg
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' class='svglite' width='504.00pt' height='504.00pt' viewBox='0 0 504.00 504.00'>
+<defs>
+  <style type='text/css'><![CDATA[
+    .svglite line, .svglite polyline, .svglite polygon, .svglite path, .svglite rect, .svglite circle {
+      fill: none;
+      stroke: #000000;
+      stroke-linecap: round;
+      stroke-linejoin: round;
+      stroke-miterlimit: 10.00;
+    }
+    .svglite text {
+      white-space: pre;
+    }
+  ]]></style>
+</defs>
+<rect width='100%' height='100%' style='stroke: none; fill: #FFFFFF;'/>
+<defs>
+  <clipPath id='cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='504.00' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<text x='266.40' y='485.28' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='29.35px' lengthAdjust='spacingAndGlyphs'>spray</text>
+<text transform='translate(12.96,244.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='29.36px' lengthAdjust='spacingAndGlyphs'>count</text>
+<line x1='59.04' y1='388.13' x2='59.04' y2='101.47' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='388.13' x2='51.84' y2='388.13' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='330.80' x2='51.84' y2='330.80' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='273.47' x2='51.84' y2='273.47' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='216.13' x2='51.84' y2='216.13' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='158.80' x2='51.84' y2='158.80' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='101.47' x2='51.84' y2='101.47' style='stroke-width: 0.75;' />
+<text transform='translate(41.76,388.13) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='8.01px' lengthAdjust='spacingAndGlyphs'>A</text>
+<text transform='translate(41.76,330.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='8.01px' lengthAdjust='spacingAndGlyphs'>B</text>
+<text transform='translate(41.76,273.47) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='8.67px' lengthAdjust='spacingAndGlyphs'>C</text>
+<text transform='translate(41.76,216.13) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='8.67px' lengthAdjust='spacingAndGlyphs'>D</text>
+<text transform='translate(41.76,158.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='8.01px' lengthAdjust='spacingAndGlyphs'>E</text>
+<text transform='translate(41.76,101.47) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='7.33px' lengthAdjust='spacingAndGlyphs'>F</text>
+<line x1='74.40' y1='430.56' x2='443.63' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='74.40' y1='430.56' x2='74.40' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='148.25' y1='430.56' x2='148.25' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='222.09' y1='430.56' x2='222.09' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='295.94' y1='430.56' x2='295.94' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='369.78' y1='430.56' x2='369.78' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='443.63' y1='430.56' x2='443.63' y2='437.76' style='stroke-width: 0.75;' />
+<text x='74.40' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>0</text>
+<text x='148.25' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='222.09' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='295.94' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='369.78' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>20</text>
+<text x='443.63' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>25</text>
+<polygon points='59.04,430.56 473.76,430.56 473.76,59.04 59.04,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpNTkuMDR8NDczLjc2fDU5LjA0fDQzMC41Ng=='>
+    <rect x='59.04' y='59.04' width='414.72' height='371.52' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpNTkuMDR8NDczLjc2fDU5LjA0fDQzMC41Ng==)'>
+<polygon points='236.86,411.07 236.86,365.20 347.63,365.20 347.63,411.07 ' style='stroke-width: 0.75; stroke: none; fill: #D3D3D3;' />
+<line x1='281.17' y1='411.07' x2='281.17' y2='365.20' style='stroke-width: 2.25; stroke-linecap: butt;' />
+<line x1='177.78' y1='388.13' x2='236.86' y2='388.13' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
+<line x1='414.09' y1='388.13' x2='347.63' y2='388.13' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
+<line x1='177.78' y1='399.60' x2='177.78' y2='376.67' style='stroke-width: 0.75;' />
+<line x1='414.09' y1='399.60' x2='414.09' y2='376.67' style='stroke-width: 0.75;' />
+<polygon points='236.86,411.07 236.86,365.20 347.63,365.20 347.63,411.07 ' style='stroke-width: 0.75;' />
+<polygon points='251.63,353.73 251.63,307.87 340.25,307.87 340.25,353.73 ' style='stroke-width: 0.75; stroke: none; fill: #D3D3D3;' />
+<line x1='318.09' y1='353.73' x2='318.09' y2='307.87' style='stroke-width: 2.25; stroke-linecap: butt;' />
+<line x1='177.78' y1='330.80' x2='251.63' y2='330.80' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
+<line x1='384.55' y1='330.80' x2='340.25' y2='330.80' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
+<line x1='177.78' y1='342.27' x2='177.78' y2='319.33' style='stroke-width: 0.75;' />
+<line x1='384.55' y1='342.27' x2='384.55' y2='319.33' style='stroke-width: 0.75;' />
+<polygon points='251.63,353.73 251.63,307.87 340.25,307.87 340.25,353.73 ' style='stroke-width: 0.75;' />
+<polygon points='89.17,296.40 89.17,250.53 118.71,250.53 118.71,296.40 ' style='stroke-width: 0.75; stroke: none; fill: #D3D3D3;' />
+<line x1='96.55' y1='296.40' x2='96.55' y2='250.53' style='stroke-width: 2.25; stroke-linecap: butt;' />
+<line x1='74.40' y1='273.47' x2='89.17' y2='273.47' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
+<line x1='133.48' y1='273.47' x2='118.71' y2='273.47' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
+<line x1='74.40' y1='284.93' x2='74.40' y2='262.00' style='stroke-width: 0.75;' />
+<line x1='133.48' y1='284.93' x2='133.48' y2='262.00' style='stroke-width: 0.75;' />
+<polygon points='89.17,296.40 89.17,250.53 118.71,250.53 118.71,296.40 ' style='stroke-width: 0.75;' />
+<circle cx='177.78' cy='273.47' r='2.70' style='stroke-width: 0.75;' />
+<polygon points='126.09,239.07 126.09,193.20 148.25,193.20 148.25,239.07 ' style='stroke-width: 0.75; stroke: none; fill: #D3D3D3;' />
+<line x1='148.25' y1='239.07' x2='148.25' y2='193.20' style='stroke-width: 2.25; stroke-linecap: butt;' />
+<line x1='103.94' y1='216.13' x2='126.09' y2='216.13' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
+<line x1='163.02' y1='216.13' x2='148.25' y2='216.13' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
+<line x1='103.94' y1='227.60' x2='103.94' y2='204.67' style='stroke-width: 0.75;' />
+<line x1='163.02' y1='227.60' x2='163.02' y2='204.67' style='stroke-width: 0.75;' />
+<polygon points='126.09,239.07 126.09,193.20 148.25,193.20 148.25,239.07 ' style='stroke-width: 0.75;' />
+<circle cx='251.63' cy='216.13' r='2.70' style='stroke-width: 0.75;' />
+<polygon points='111.32,181.73 111.32,135.87 148.25,135.87 148.25,181.73 ' style='stroke-width: 0.75; stroke: none; fill: #D3D3D3;' />
+<line x1='118.71' y1='181.73' x2='118.71' y2='135.87' style='stroke-width: 2.25; stroke-linecap: butt;' />
+<line x1='89.17' y1='158.80' x2='111.32' y2='158.80' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
+<line x1='163.02' y1='158.80' x2='148.25' y2='158.80' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
+<line x1='89.17' y1='170.27' x2='89.17' y2='147.33' style='stroke-width: 0.75;' />
+<line x1='163.02' y1='170.27' x2='163.02' y2='147.33' style='stroke-width: 0.75;' />
+<polygon points='111.32,181.73 111.32,135.87 148.25,135.87 148.25,181.73 ' style='stroke-width: 0.75;' />
+<polygon points='251.63,124.40 251.63,78.53 414.09,78.53 414.09,124.40 ' style='stroke-width: 0.75; stroke: none; fill: #D3D3D3;' />
+<line x1='295.94' y1='124.40' x2='295.94' y2='78.53' style='stroke-width: 2.25; stroke-linecap: butt;' />
+<line x1='207.32' y1='101.47' x2='251.63' y2='101.47' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
+<line x1='458.40' y1='101.47' x2='414.09' y2='101.47' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
+<line x1='207.32' y1='112.93' x2='207.32' y2='90.00' style='stroke-width: 0.75;' />
+<line x1='458.40' y1='112.93' x2='458.40' y2='90.00' style='stroke-width: 0.75;' />
+<polygon points='251.63,124.40 251.63,78.53 414.09,78.53 414.09,124.40 ' style='stroke-width: 0.75;' />
+</g>
+</svg>
diff --git a/inst/tinytest/_tinysnapshot/flip_density.svg b/inst/tinytest/_tinysnapshot/flip_density.svg
new file mode 100644
index 00000000..83ca9308
--- /dev/null
+++ b/inst/tinytest/_tinysnapshot/flip_density.svg
@@ -0,0 +1,96 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' class='svglite' width='504.00pt' height='504.00pt' viewBox='0 0 504.00 504.00'>
+<defs>
+  <style type='text/css'><![CDATA[
+    .svglite line, .svglite polyline, .svglite polygon, .svglite path, .svglite rect, .svglite circle {
+      fill: none;
+      stroke: #000000;
+      stroke-linecap: round;
+      stroke-linejoin: round;
+      stroke-miterlimit: 10.00;
+    }
+    .svglite text {
+      white-space: pre;
+    }
+  ]]></style>
+</defs>
+<rect width='100%' height='100%' style='stroke: none; fill: #FFFFFF;'/>
+<defs>
+  <clipPath id='cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='504.00' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<rect x='423.93' y='227.43' width='16.75' height='16.75' style='stroke-width: 0.75; fill: #000000; fill-opacity: 0.10;' />
+<rect x='423.93' y='245.43' width='16.75' height='16.75' style='stroke-width: 0.75; stroke: #DF536B; fill: #DF536B; fill-opacity: 0.10;' />
+<rect x='423.93' y='263.43' width='16.75' height='16.75' style='stroke-width: 0.75; stroke: #61D04F; fill: #61D04F; fill-opacity: 0.10;' />
+<text x='462.03' y='216.00' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='42.70px' lengthAdjust='spacingAndGlyphs'>Species</text>
+<text x='445.80' y='239.93' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='35.37px' lengthAdjust='spacingAndGlyphs'>setosa</text>
+<text x='445.80' y='257.93' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='51.36px' lengthAdjust='spacingAndGlyphs'>versicolor</text>
+<text x='445.80' y='275.93' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='44.02px' lengthAdjust='spacingAndGlyphs'>virginica</text>
+</g>
+<defs>
+  <clipPath id='cpMC4wMHw0MDcuMTB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='407.10' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw0MDcuMTB8MC4wMHw1MDQuMDA=)'>
+<text x='233.07' y='34.47' text-anchor='middle' style='font-size: 14.40px; font-weight: bold; font-family: "Liberation Sans";' textLength='124.73px' lengthAdjust='spacingAndGlyphs'>Flipped histogram</text>
+<text x='233.07' y='485.28' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='40.02px' lengthAdjust='spacingAndGlyphs'>Density</text>
+<text transform='translate(12.96,244.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='227.51px' lengthAdjust='spacingAndGlyphs'>N = [50, 50, 50]   Joint Bandwidth = 0.1551</text>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='71.93' y1='430.56' x2='338.69' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='71.93' y1='430.56' x2='71.93' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='160.85' y1='430.56' x2='160.85' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='249.77' y1='430.56' x2='249.77' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='338.69' y1='430.56' x2='338.69' y2='437.76' style='stroke-width: 0.75;' />
+<text x='71.93' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.0</text>
+<text x='160.85' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.5</text>
+<text x='249.77' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>1.0</text>
+<text x='338.69' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>1.5</text>
+<line x1='59.04' y1='393.37' x2='59.04' y2='91.19' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='393.37' x2='51.84' y2='393.37' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='343.01' x2='51.84' y2='343.01' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='292.65' x2='51.84' y2='292.65' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='242.28' x2='51.84' y2='242.28' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='191.92' x2='51.84' y2='191.92' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='141.56' x2='51.84' y2='141.56' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='91.19' x2='51.84' y2='91.19' style='stroke-width: 0.75;' />
+<text transform='translate(41.76,393.37) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>1</text>
+<text transform='translate(41.76,343.01) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>2</text>
+<text transform='translate(41.76,292.65) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>3</text>
+<text transform='translate(41.76,242.28) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>4</text>
+<text transform='translate(41.76,191.92) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text transform='translate(41.76,141.56) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>6</text>
+<text transform='translate(41.76,91.19) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>7</text>
+<polygon points='59.04,430.56 407.10,430.56 407.10,59.04 59.04,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpNTkuMDR8NDA3LjEwfDU5LjA0fDQzMC41Ng=='>
+    <rect x='59.04' y='59.04' width='348.06' height='371.52' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpNTkuMDR8NDA3LjEwfDU5LjA0fDQzMC41Ng==)'>
+<line x1='71.93' y1='430.56' x2='71.93' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='160.85' y1='430.56' x2='160.85' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='249.77' y1='430.56' x2='249.77' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='338.69' y1='430.56' x2='338.69' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='427.61' y1='430.56' x2='427.61' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='443.74' x2='407.10' y2='443.74' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='393.37' x2='407.10' y2='393.37' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='343.01' x2='407.10' y2='343.01' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='292.65' x2='407.10' y2='292.65' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='242.28' x2='407.10' y2='242.28' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='191.92' x2='407.10' y2='191.92' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='141.56' x2='407.10' y2='141.56' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='91.19' x2='407.10' y2='91.19' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='40.83' x2='407.10' y2='40.83' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<polygon points='71.93,416.80 71.93,416.62 71.93,416.44 71.93,416.26 71.93,416.08 71.93,415.90 71.93,415.72 71.93,415.54 71.93,415.36 71.93,415.18 71.93,415.00 71.93,414.82 71.93,414.64 71.93,414.45 71.93,414.27 71.93,414.09 71.93,413.91 71.93,413.73 71.93,413.55 71.93,413.37 71.93,413.19 71.93,413.01 71.93,412.83 71.93,412.65 71.93,412.47 71.93,412.29 71.93,412.11 71.93,411.93 71.93,411.75 71.93,411.57 71.93,411.39 71.93,411.21 71.93,411.03 71.93,410.85 71.93,410.67 71.93,410.49 71.93,410.31 71.93,410.13 71.93,409.94 71.93,409.76 71.93,409.58 71.93,409.40 71.93,409.22 71.93,409.04 71.93,408.86 71.93,408.68 71.93,408.50 71.93,408.32 71.93,408.14 71.93,407.96 71.93,407.78 71.93,407.60 71.93,407.42 71.93,407.24 71.93,407.06 71.93,406.88 71.93,406.70 71.93,406.52 71.93,406.34 71.93,406.16 71.93,405.98 71.93,405.80 71.93,405.62 71.93,405.43 71.93,405.25 71.93,405.07 71.93,404.89 71.93,404.71 71.93,404.53 71.93,404.35 71.93,404.17 71.93,403.99 71.93,403.81 71.93,403.63 71.93,403.45 71.93,403.27 71.93,403.09 71.93,402.91 71.93,402.73 71.93,402.55 71.93,402.37 71.93,402.19 71.93,402.01 71.93,401.83 71.93,401.65 71.93,401.47 71.93,401.29 71.93,401.11 71.93,400.92 71.93,400.74 71.93,400.56 71.93,400.38 71.93,400.20 71.93,400.02 71.93,399.84 71.93,399.66 71.93,399.48 71.93,399.30 71.93,399.12 71.93,398.94 71.93,398.76 71.93,398.58 71.93,398.40 71.93,398.22 71.93,398.04 71.93,397.86 71.93,397.68 71.93,397.50 71.93,397.32 71.93,397.14 71.93,396.96 71.93,396.78 71.93,396.60 71.93,396.42 71.93,396.23 71.93,396.05 71.93,395.87 71.93,395.69 71.93,395.51 71.93,395.33 71.93,395.15 71.93,394.97 71.93,394.79 71.93,394.61 71.93,394.43 71.93,394.25 71.93,394.07 71.93,393.89 71.93,393.71 71.93,393.53 71.93,393.35 71.93,393.17 71.93,392.99 71.93,392.81 71.93,392.63 71.93,392.45 71.93,392.27 71.93,392.09 71.93,391.91 71.93,391.72 71.93,391.54 71.93,391.36 71.93,391.18 71.93,391.00 71.93,390.82 71.93,390.64 71.93,390.46 71.93,390.28 71.93,390.10 71.93,389.92 71.93,389.74 71.93,389.56 71.93,389.38 71.93,389.20 71.93,389.02 71.93,388.84 71.93,388.66 71.93,388.48 71.93,388.30 71.93,388.12 71.93,387.94 71.93,387.76 71.93,387.58 71.93,387.40 71.93,387.21 71.93,387.03 71.93,386.85 71.93,386.67 71.93,386.49 71.93,386.31 71.93,386.13 71.93,385.95 71.93,385.77 71.93,385.59 71.93,385.41 71.93,385.23 71.93,385.05 71.93,384.87 71.93,384.69 71.93,384.51 71.93,384.33 71.93,384.15 71.93,383.97 71.93,383.79 71.93,383.61 71.93,383.43 71.93,383.25 71.93,383.07 71.93,382.89 71.93,382.70 71.93,382.52 71.93,382.34 71.93,382.16 71.93,381.98 71.93,381.80 71.93,381.62 71.93,381.44 71.93,381.26 71.93,381.08 71.93,380.90 71.93,380.72 71.93,380.54 71.93,380.36 71.93,380.18 71.93,380.00 71.93,379.82 71.93,379.64 71.93,379.46 71.93,379.28 71.93,379.10 71.93,378.92 71.93,378.74 71.93,378.56 71.93,378.38 71.93,378.19 71.93,378.01 71.93,377.83 71.93,377.65 71.93,377.47 71.93,377.29 71.93,377.11 71.93,376.93 71.93,376.75 71.93,376.57 71.93,376.39 71.93,376.21 71.93,376.03 71.93,375.85 71.93,375.67 71.93,375.49 71.93,375.31 71.93,375.13 71.93,374.95 71.93,374.77 71.93,374.59 71.93,374.41 71.93,374.23 71.93,374.05 71.93,373.87 71.93,373.68 71.93,373.50 71.93,373.32 71.93,373.14 71.93,372.96 71.93,372.78 71.93,372.60 71.93,372.42 71.93,372.24 71.93,372.06 71.93,371.88 71.93,371.70 71.93,371.52 71.93,371.34 71.93,371.16 71.93,370.98 71.93,370.80 71.93,370.62 71.93,370.44 71.93,370.26 71.93,370.08 71.93,369.90 71.93,369.72 71.93,369.54 71.93,369.36 71.93,369.17 71.93,368.99 71.93,368.81 71.93,368.63 71.93,368.45 71.93,368.27 71.93,368.09 71.93,367.91 71.93,367.73 71.93,367.55 71.93,367.37 71.93,367.19 71.93,367.01 71.93,366.83 71.93,366.65 71.93,366.47 71.93,366.29 71.93,366.11 71.93,365.93 71.93,365.75 71.93,365.57 71.93,365.39 71.93,365.21 71.93,365.03 71.93,364.85 71.93,364.66 71.93,364.48 71.93,364.30 71.93,364.12 71.93,363.94 71.93,363.76 71.93,363.58 71.93,363.40 71.93,363.22 71.93,363.04 71.93,362.86 71.93,362.68 71.93,362.50 71.93,362.32 71.93,362.14 71.93,361.96 71.93,361.78 71.93,361.60 71.93,361.42 71.93,361.24 71.93,361.06 71.93,360.88 71.93,360.70 71.93,360.52 71.93,360.34 71.93,360.16 71.93,359.97 71.93,359.79 71.93,359.61 71.93,359.43 71.93,359.25 71.93,359.07 71.93,358.89 71.93,358.71 71.93,358.53 71.93,358.35 71.93,358.17 71.93,357.99 71.93,357.81 71.93,357.63 71.93,357.45 71.93,357.27 71.93,357.09 71.93,356.91 71.93,356.73 71.93,356.55 71.93,356.37 71.93,356.19 71.93,356.01 71.93,355.83 71.93,355.65 71.93,355.46 71.93,355.28 71.93,355.10 71.93,354.92 71.93,354.74 71.93,354.56 71.93,354.38 71.93,354.20 71.93,354.02 71.93,353.84 71.93,353.66 71.93,353.48 71.93,353.30 71.93,353.12 71.93,352.94 71.93,352.76 71.93,352.58 71.93,352.40 71.93,352.22 71.93,352.04 71.93,351.86 71.93,351.68 71.93,351.50 71.93,351.32 71.93,351.14 71.93,350.95 71.93,350.77 71.93,350.59 71.93,350.41 71.93,350.23 71.93,350.05 71.93,349.87 71.93,349.69 71.93,349.51 71.93,349.33 71.93,349.15 71.93,348.97 71.93,348.79 71.93,348.61 71.93,348.43 71.93,348.25 71.93,348.07 71.93,347.89 71.93,347.71 71.93,347.53 71.93,347.35 71.93,347.17 71.93,346.99 71.93,346.81 71.93,346.63 71.93,346.44 71.93,346.26 71.93,346.08 71.93,345.90 71.93,345.72 71.93,345.54 71.93,345.36 71.93,345.18 71.93,345.00 71.93,344.82 71.93,344.64 71.93,344.46 71.93,344.28 71.93,344.10 71.93,343.92 71.93,343.74 71.93,343.56 71.93,343.38 71.93,343.20 71.93,343.02 71.93,342.84 71.93,342.66 71.93,342.48 71.93,342.30 71.93,342.12 71.93,341.93 71.93,341.75 71.93,341.57 71.93,341.39 71.93,341.21 71.93,341.03 71.93,340.85 71.93,340.67 71.93,340.49 71.93,340.31 71.93,340.13 71.93,339.95 71.93,339.77 71.93,339.59 71.93,339.41 71.93,339.23 71.93,339.05 71.93,338.87 71.93,338.69 71.93,338.51 71.93,338.33 71.93,338.15 71.93,337.97 71.93,337.79 71.93,337.61 71.93,337.42 71.93,337.24 71.93,337.06 71.93,336.88 71.93,336.70 71.93,336.52 71.93,336.34 71.93,336.16 71.93,335.98 71.93,335.80 71.93,335.62 71.93,335.44 71.93,335.26 71.93,335.08 71.93,334.90 71.93,334.72 71.93,334.54 71.93,334.36 71.93,334.18 71.93,334.00 71.93,333.82 71.93,333.64 71.93,333.46 71.93,333.28 71.93,333.10 71.93,332.91 71.93,332.73 71.93,332.55 71.93,332.37 71.93,332.19 71.93,332.01 71.93,331.83 71.93,331.65 71.93,331.47 71.93,331.29 71.93,331.11 71.93,330.93 71.93,330.75 71.93,330.57 71.93,330.39 71.93,330.21 71.93,330.03 71.93,329.85 71.93,329.67 71.93,329.49 71.93,329.31 71.93,329.13 71.93,328.95 71.93,328.77 71.93,328.59 71.93,328.40 71.93,328.22 71.93,328.04 71.93,327.86 71.93,327.68 71.93,327.50 71.93,327.32 71.93,327.14 71.93,326.96 71.93,326.78 71.93,326.60 71.93,326.42 71.93,326.24 71.93,326.06 71.93,325.88 71.93,325.70 71.93,325.52 71.93,325.34 71.93,325.16 71.93,324.98 71.93,324.80 71.93,324.62 72.14,324.62 72.15,324.80 72.17,324.98 72.19,325.16 72.21,325.34 72.22,325.52 72.24,325.70 72.27,325.88 72.29,326.06 72.31,326.24 72.34,326.42 72.37,326.60 72.39,326.78 72.42,326.96 72.46,327.14 72.49,327.32 72.53,327.50 72.56,327.68 72.60,327.86 72.65,328.04 72.69,328.22 72.74,328.40 72.79,328.59 72.84,328.77 72.89,328.95 72.95,329.13 73.01,329.31 73.07,329.49 73.14,329.67 73.21,329.85 73.28,330.03 73.35,330.21 73.43,330.39 73.51,330.57 73.60,330.75 73.69,330.93 73.79,331.11 73.88,331.29 73.99,331.47 74.09,331.65 74.20,331.83 74.32,332.01 74.44,332.19 74.57,332.37 74.70,332.55 74.83,332.73 74.98,332.91 75.12,333.10 75.28,333.28 75.43,333.46 75.60,333.64 75.77,333.82 75.94,334.00 76.13,334.18 76.32,334.36 76.51,334.54 76.71,334.72 76.92,334.90 77.14,335.08 77.36,335.26 77.59,335.44 77.83,335.62 78.07,335.80 78.32,335.98 78.58,336.16 78.85,336.34 79.12,336.52 79.41,336.70 79.70,336.88 80.00,337.06 80.31,337.24 80.63,337.42 80.95,337.61 81.29,337.79 81.63,337.97 81.98,338.15 82.34,338.33 82.71,338.51 83.10,338.69 83.49,338.87 83.89,339.05 84.30,339.23 84.72,339.41 85.15,339.59 85.59,339.77 86.04,339.95 86.50,340.13 86.97,340.31 87.46,340.49 87.95,340.67 88.46,340.85 88.98,341.03 89.50,341.21 90.05,341.39 90.60,341.57 91.17,341.75 91.75,341.93 92.33,342.12 92.94,342.30 93.56,342.48 94.19,342.66 94.84,342.84 95.49,343.02 96.17,343.20 96.85,343.38 97.56,343.56 98.28,343.74 99.01,343.92 99.76,344.10 100.53,344.28 101.31,344.46 102.11,344.64 102.92,344.82 103.77,345.00 104.62,345.18 105.49,345.36 106.38,345.54 107.29,345.72 108.23,345.90 109.18,346.08 110.15,346.26 111.15,346.44 112.16,346.63 113.21,346.81 114.27,346.99 115.35,347.17 116.47,347.35 117.60,347.53 118.76,347.71 119.94,347.89 121.16,348.07 122.40,348.25 123.66,348.43 124.96,348.61 126.28,348.79 127.64,348.97 129.02,349.15 130.42,349.33 131.87,349.51 133.34,349.69 134.85,349.87 136.38,350.05 137.95,350.23 139.56,350.41 141.19,350.59 142.87,350.77 144.57,350.95 146.31,351.14 148.09,351.32 149.88,351.50 151.74,351.68 153.62,351.86 155.54,352.04 157.50,352.22 159.48,352.40 161.52,352.58 163.58,352.76 165.69,352.94 167.83,353.12 170.00,353.30 172.23,353.48 174.47,353.66 176.77,353.84 179.10,354.02 181.45,354.20 183.87,354.38 186.30,354.56 188.78,354.74 191.29,354.92 193.83,355.10 196.42,355.28 199.03,355.46 201.69,355.65 204.37,355.83 207.08,356.01 209.84,356.19 212.61,356.37 215.43,356.55 218.27,356.73 221.13,356.91 224.03,357.09 226.95,357.27 229.90,357.45 232.88,357.63 235.87,357.81 238.89,357.99 241.93,358.17 244.99,358.35 248.06,358.53 251.15,358.71 254.26,358.89 257.38,359.07 260.52,359.25 263.66,359.43 266.81,359.61 269.97,359.79 273.13,359.97 276.29,360.16 279.46,360.34 282.62,360.52 285.78,360.70 288.94,360.88 292.09,361.06 295.23,361.24 298.36,361.42 301.48,361.60 304.59,361.78 307.66,361.96 310.73,362.14 313.77,362.32 316.79,362.50 319.79,362.68 322.75,362.86 325.68,363.04 328.58,363.22 331.45,363.40 334.28,363.58 337.06,363.76 339.81,363.94 342.51,364.12 345.16,364.30 347.78,364.48 350.32,364.66 352.84,364.85 355.28,365.03 357.67,365.21 360.01,365.39 362.26,365.57 364.48,365.75 366.61,365.93 368.69,366.11 370.70,366.29 372.62,366.47 374.50,366.65 376.27,366.83 377.98,367.01 379.62,367.19 381.16,367.37 382.65,367.55 384.02,367.73 385.33,367.91 386.56,368.09 387.68,368.27 388.75,368.45 389.68,368.63 390.55,368.81 391.34,368.99 392.01,369.17 392.63,369.36 393.11,369.54 393.53,369.72 393.84,369.90 394.05,370.08 394.21,370.26 394.21,370.44 394.16,370.62 394.00,370.80 393.74,370.98 393.42,371.16 392.95,371.34 392.43,371.52 391.80,371.70 391.07,371.88 390.28,372.06 389.34,372.24 388.36,372.42 387.27,372.60 386.09,372.78 384.84,372.96 383.47,373.14 382.05,373.32 380.52,373.50 378.91,373.68 377.24,373.87 375.45,374.05 373.62,374.23 371.69,374.41 369.69,374.59 367.63,374.77 365.47,374.95 363.27,375.13 360.98,375.31 358.63,375.49 356.23,375.67 353.74,375.85 351.22,376.03 348.62,376.21 345.98,376.39 343.28,376.57 340.52,376.75 337.74,376.93 334.88,377.11 332.00,377.29 329.07,377.47 326.10,377.65 323.10,377.83 320.05,378.01 316.98,378.19 313.88,378.38 310.75,378.56 307.60,378.74 304.42,378.92 301.23,379.10 298.01,379.28 294.78,379.46 291.55,379.64 288.29,379.82 285.03,380.00 281.76,380.18 278.49,380.36 275.22,380.54 271.94,380.72 268.67,380.90 265.40,381.08 262.14,381.26 258.88,381.44 255.64,381.62 252.41,381.80 249.19,381.98 245.99,382.16 242.80,382.34 239.64,382.52 236.49,382.70 233.36,382.89 230.26,383.07 227.18,383.25 224.13,383.43 221.10,383.61 218.11,383.79 215.14,383.97 212.20,384.15 209.30,384.33 206.42,384.51 203.58,384.69 200.78,384.87 198.00,385.05 195.27,385.23 192.56,385.41 189.91,385.59 187.29,385.77 184.69,385.95 182.15,386.13 179.63,386.31 177.17,386.49 174.74,386.67 172.35,386.85 170.00,387.03 167.68,387.21 165.42,387.40 163.19,387.58 161.00,387.76 158.85,387.94 156.73,388.12 154.67,388.30 152.64,388.48 150.64,388.66 148.70,388.84 146.77,389.02 144.91,389.20 143.07,389.38 141.27,389.56 139.51,389.74 137.78,389.92 136.10,390.10 134.45,390.28 132.83,390.46 131.26,390.64 129.70,390.82 128.21,391.00 126.72,391.18 125.28,391.36 123.88,391.54 122.49,391.72 121.15,391.91 119.83,392.09 118.55,392.27 117.30,392.45 116.07,392.63 114.88,392.81 113.71,392.99 112.57,393.17 111.46,393.35 110.37,393.53 109.32,393.71 108.28,393.89 107.27,394.07 106.28,394.25 105.32,394.43 104.39,394.61 103.47,394.79 102.58,394.97 101.71,395.15 100.85,395.33 100.03,395.51 99.21,395.69 98.43,395.87 97.66,396.05 96.91,396.23 96.18,396.42 95.46,396.60 94.77,396.78 94.08,396.96 93.42,397.14 92.78,397.32 92.14,397.50 91.53,397.68 90.93,397.86 90.35,398.04 89.78,398.22 89.22,398.40 88.68,398.58 88.15,398.76 87.64,398.94 87.14,399.12 86.65,399.30 86.17,399.48 85.71,399.66 85.26,399.84 84.82,400.02 84.39,400.20 83.97,400.38 83.57,400.56 83.17,400.74 82.79,400.92 82.41,401.11 82.05,401.29 81.69,401.47 81.35,401.65 81.02,401.83 80.69,402.01 80.37,402.19 80.06,402.37 79.77,402.55 79.48,402.73 79.19,402.91 78.92,403.09 78.66,403.27 78.40,403.45 78.15,403.63 77.91,403.81 77.67,403.99 77.45,404.17 77.23,404.35 77.01,404.53 76.81,404.71 76.61,404.89 76.41,405.07 76.23,405.25 76.05,405.43 75.87,405.62 75.71,405.80 75.54,405.98 75.39,406.16 75.23,406.34 75.09,406.52 74.95,406.70 74.81,406.88 74.68,407.06 74.56,407.24 74.43,407.42 74.32,407.60 74.21,407.78 74.10,407.96 74.00,408.14 73.90,408.32 73.80,408.50 73.71,408.68 73.62,408.86 73.54,409.04 73.46,409.22 73.38,409.40 73.31,409.58 73.24,409.76 73.17,409.94 73.10,410.13 73.04,410.31 72.98,410.49 72.93,410.67 72.87,410.85 72.82,411.03 72.77,411.21 72.73,411.39 72.68,411.57 72.64,411.75 72.60,411.93 72.56,412.11 72.53,412.29 72.49,412.47 72.46,412.65 72.43,412.83 72.40,413.01 72.37,413.19 72.34,413.37 72.32,413.55 72.30,413.73 72.27,413.91 72.25,414.09 72.23,414.27 72.21,414.45 72.20,414.64 72.18,414.82 72.16,415.00 72.15,415.18 72.13,415.36 72.12,415.54 72.11,415.72 72.10,415.90 72.09,416.08 72.07,416.26 72.07,416.44 72.06,416.62 72.05,416.80 ' style='stroke-width: 0.75; stroke: none; fill: #000000; fill-opacity: 0.10;' />
+<polyline points='72.05,416.80 72.06,416.62 72.07,416.44 72.07,416.26 72.09,416.08 72.10,415.90 72.11,415.72 72.12,415.54 72.13,415.36 72.15,415.18 72.16,415.00 72.18,414.82 72.20,414.64 72.21,414.45 72.23,414.27 72.25,414.09 72.27,413.91 72.30,413.73 72.32,413.55 72.34,413.37 72.37,413.19 72.40,413.01 72.43,412.83 72.46,412.65 72.49,412.47 72.53,412.29 72.56,412.11 72.60,411.93 72.64,411.75 72.68,411.57 72.73,411.39 72.77,411.21 72.82,411.03 72.87,410.85 72.93,410.67 72.98,410.49 73.04,410.31 73.10,410.13 73.17,409.94 73.24,409.76 73.31,409.58 73.38,409.40 73.46,409.22 73.54,409.04 73.62,408.86 73.71,408.68 73.80,408.50 73.90,408.32 74.00,408.14 74.10,407.96 74.21,407.78 74.32,407.60 74.43,407.42 74.56,407.24 74.68,407.06 74.81,406.88 74.95,406.70 75.09,406.52 75.23,406.34 75.39,406.16 75.54,405.98 75.71,405.80 75.87,405.62 76.05,405.43 76.23,405.25 76.41,405.07 76.61,404.89 76.81,404.71 77.01,404.53 77.23,404.35 77.45,404.17 77.67,403.99 77.91,403.81 78.15,403.63 78.40,403.45 78.66,403.27 78.92,403.09 79.19,402.91 79.48,402.73 79.77,402.55 80.06,402.37 80.37,402.19 80.69,402.01 81.02,401.83 81.35,401.65 81.69,401.47 82.05,401.29 82.41,401.11 82.79,400.92 83.17,400.74 83.57,400.56 83.97,400.38 84.39,400.20 84.82,400.02 85.26,399.84 85.71,399.66 86.17,399.48 86.65,399.30 87.14,399.12 87.64,398.94 88.15,398.76 88.68,398.58 89.22,398.40 89.78,398.22 90.35,398.04 90.93,397.86 91.53,397.68 92.14,397.50 92.78,397.32 93.42,397.14 94.08,396.96 94.77,396.78 95.46,396.60 96.18,396.42 96.91,396.23 97.66,396.05 98.43,395.87 99.21,395.69 100.03,395.51 100.85,395.33 101.71,395.15 102.58,394.97 103.47,394.79 104.39,394.61 105.32,394.43 106.28,394.25 107.27,394.07 108.28,393.89 109.32,393.71 110.37,393.53 111.46,393.35 112.57,393.17 113.71,392.99 114.88,392.81 116.07,392.63 117.30,392.45 118.55,392.27 119.83,392.09 121.15,391.91 122.49,391.72 123.88,391.54 125.28,391.36 126.72,391.18 128.21,391.00 129.70,390.82 131.26,390.64 132.83,390.46 134.45,390.28 136.10,390.10 137.78,389.92 139.51,389.74 141.27,389.56 143.07,389.38 144.91,389.20 146.77,389.02 148.70,388.84 150.64,388.66 152.64,388.48 154.67,388.30 156.73,388.12 158.85,387.94 161.00,387.76 163.19,387.58 165.42,387.40 167.68,387.21 170.00,387.03 172.35,386.85 174.74,386.67 177.17,386.49 179.63,386.31 182.15,386.13 184.69,385.95 187.29,385.77 189.91,385.59 192.56,385.41 195.27,385.23 198.00,385.05 200.78,384.87 203.58,384.69 206.42,384.51 209.30,384.33 212.20,384.15 215.14,383.97 218.11,383.79 221.10,383.61 224.13,383.43 227.18,383.25 230.26,383.07 233.36,382.89 236.49,382.70 239.64,382.52 242.80,382.34 245.99,382.16 249.19,381.98 252.41,381.80 255.64,381.62 258.88,381.44 262.14,381.26 265.40,381.08 268.67,380.90 271.94,380.72 275.22,380.54 278.49,380.36 281.76,380.18 285.03,380.00 288.29,379.82 291.55,379.64 294.78,379.46 298.01,379.28 301.23,379.10 304.42,378.92 307.60,378.74 310.75,378.56 313.88,378.38 316.98,378.19 320.05,378.01 323.10,377.83 326.10,377.65 329.07,377.47 332.00,377.29 334.88,377.11 337.74,376.93 340.52,376.75 343.28,376.57 345.98,376.39 348.62,376.21 351.22,376.03 353.74,375.85 356.23,375.67 358.63,375.49 360.98,375.31 363.27,375.13 365.47,374.95 367.63,374.77 369.69,374.59 371.69,374.41 373.62,374.23 375.45,374.05 377.24,373.87 378.91,373.68 380.52,373.50 382.05,373.32 383.47,373.14 384.84,372.96 386.09,372.78 387.27,372.60 388.36,372.42 389.34,372.24 390.28,372.06 391.07,371.88 391.80,371.70 392.43,371.52 392.95,371.34 393.42,371.16 393.74,370.98 394.00,370.80 394.16,370.62 394.21,370.44 394.21,370.26 394.05,370.08 393.84,369.90 393.53,369.72 393.11,369.54 392.63,369.36 392.01,369.17 391.34,368.99 390.55,368.81 389.68,368.63 388.75,368.45 387.68,368.27 386.56,368.09 385.33,367.91 384.02,367.73 382.65,367.55 381.16,367.37 379.62,367.19 377.98,367.01 376.27,366.83 374.50,366.65 372.62,366.47 370.70,366.29 368.69,366.11 366.61,365.93 364.48,365.75 362.26,365.57 360.01,365.39 357.67,365.21 355.28,365.03 352.84,364.85 350.32,364.66 347.78,364.48 345.16,364.30 342.51,364.12 339.81,363.94 337.06,363.76 334.28,363.58 331.45,363.40 328.58,363.22 325.68,363.04 322.75,362.86 319.79,362.68 316.79,362.50 313.77,362.32 310.73,362.14 307.66,361.96 304.59,361.78 301.48,361.60 298.36,361.42 295.23,361.24 292.09,361.06 288.94,360.88 285.78,360.70 282.62,360.52 279.46,360.34 276.29,360.16 273.13,359.97 269.97,359.79 266.81,359.61 263.66,359.43 260.52,359.25 257.38,359.07 254.26,358.89 251.15,358.71 248.06,358.53 244.99,358.35 241.93,358.17 238.89,357.99 235.87,357.81 232.88,357.63 229.90,357.45 226.95,357.27 224.03,357.09 221.13,356.91 218.27,356.73 215.43,356.55 212.61,356.37 209.84,356.19 207.08,356.01 204.37,355.83 201.69,355.65 199.03,355.46 196.42,355.28 193.83,355.10 191.29,354.92 188.78,354.74 186.30,354.56 183.87,354.38 181.45,354.20 179.10,354.02 176.77,353.84 174.47,353.66 172.23,353.48 170.00,353.30 167.83,353.12 165.69,352.94 163.58,352.76 161.52,352.58 159.48,352.40 157.50,352.22 155.54,352.04 153.62,351.86 151.74,351.68 149.88,351.50 148.09,351.32 146.31,351.14 144.57,350.95 142.87,350.77 141.19,350.59 139.56,350.41 137.95,350.23 136.38,350.05 134.85,349.87 133.34,349.69 131.87,349.51 130.42,349.33 129.02,349.15 127.64,348.97 126.28,348.79 124.96,348.61 123.66,348.43 122.40,348.25 121.16,348.07 119.94,347.89 118.76,347.71 117.60,347.53 116.47,347.35 115.35,347.17 114.27,346.99 113.21,346.81 112.16,346.63 111.15,346.44 110.15,346.26 109.18,346.08 108.23,345.90 107.29,345.72 106.38,345.54 105.49,345.36 104.62,345.18 103.77,345.00 102.92,344.82 102.11,344.64 101.31,344.46 100.53,344.28 99.76,344.10 99.01,343.92 98.28,343.74 97.56,343.56 96.85,343.38 96.17,343.20 95.49,343.02 94.84,342.84 94.19,342.66 93.56,342.48 92.94,342.30 92.33,342.12 91.75,341.93 91.17,341.75 90.60,341.57 90.05,341.39 89.50,341.21 88.98,341.03 88.46,340.85 87.95,340.67 87.46,340.49 86.97,340.31 86.50,340.13 86.04,339.95 85.59,339.77 85.15,339.59 84.72,339.41 84.30,339.23 83.89,339.05 83.49,338.87 83.10,338.69 82.71,338.51 82.34,338.33 81.98,338.15 81.63,337.97 81.29,337.79 80.95,337.61 80.63,337.42 80.31,337.24 80.00,337.06 79.70,336.88 79.41,336.70 79.12,336.52 78.85,336.34 78.58,336.16 78.32,335.98 78.07,335.80 77.83,335.62 77.59,335.44 77.36,335.26 77.14,335.08 76.92,334.90 76.71,334.72 76.51,334.54 76.32,334.36 76.13,334.18 75.94,334.00 75.77,333.82 75.60,333.64 75.43,333.46 75.28,333.28 75.12,333.10 74.98,332.91 74.83,332.73 74.70,332.55 74.57,332.37 74.44,332.19 74.32,332.01 74.20,331.83 74.09,331.65 73.99,331.47 73.88,331.29 73.79,331.11 73.69,330.93 73.60,330.75 73.51,330.57 73.43,330.39 73.35,330.21 73.28,330.03 73.21,329.85 73.14,329.67 73.07,329.49 73.01,329.31 72.95,329.13 72.89,328.95 72.84,328.77 72.79,328.59 72.74,328.40 72.69,328.22 72.65,328.04 72.60,327.86 72.56,327.68 72.53,327.50 72.49,327.32 72.46,327.14 72.42,326.96 72.39,326.78 72.37,326.60 72.34,326.42 72.31,326.24 72.29,326.06 72.27,325.88 72.24,325.70 72.22,325.52 72.21,325.34 72.19,325.16 72.17,324.98 72.15,324.80 72.14,324.62 ' style='stroke-width: 0.75;' />
+<polygon points='71.93,316.07 71.93,315.77 71.93,315.48 71.93,315.18 71.93,314.88 71.93,314.58 71.93,314.28 71.93,313.98 71.93,313.68 71.93,313.39 71.93,313.09 71.93,312.79 71.93,312.49 71.93,312.19 71.93,311.89 71.93,311.59 71.93,311.29 71.93,311.00 71.93,310.70 71.93,310.40 71.93,310.10 71.93,309.80 71.93,309.50 71.93,309.20 71.93,308.91 71.93,308.61 71.93,308.31 71.93,308.01 71.93,307.71 71.93,307.41 71.93,307.11 71.93,306.81 71.93,306.52 71.93,306.22 71.93,305.92 71.93,305.62 71.93,305.32 71.93,305.02 71.93,304.72 71.93,304.43 71.93,304.13 71.93,303.83 71.93,303.53 71.93,303.23 71.93,302.93 71.93,302.63 71.93,302.33 71.93,302.04 71.93,301.74 71.93,301.44 71.93,301.14 71.93,300.84 71.93,300.54 71.93,300.24 71.93,299.95 71.93,299.65 71.93,299.35 71.93,299.05 71.93,298.75 71.93,298.45 71.93,298.15 71.93,297.85 71.93,297.56 71.93,297.26 71.93,296.96 71.93,296.66 71.93,296.36 71.93,296.06 71.93,295.76 71.93,295.47 71.93,295.17 71.93,294.87 71.93,294.57 71.93,294.27 71.93,293.97 71.93,293.67 71.93,293.37 71.93,293.08 71.93,292.78 71.93,292.48 71.93,292.18 71.93,291.88 71.93,291.58 71.93,291.28 71.93,290.99 71.93,290.69 71.93,290.39 71.93,290.09 71.93,289.79 71.93,289.49 71.93,289.19 71.93,288.89 71.93,288.60 71.93,288.30 71.93,288.00 71.93,287.70 71.93,287.40 71.93,287.10 71.93,286.80 71.93,286.51 71.93,286.21 71.93,285.91 71.93,285.61 71.93,285.31 71.93,285.01 71.93,284.71 71.93,284.41 71.93,284.12 71.93,283.82 71.93,283.52 71.93,283.22 71.93,282.92 71.93,282.62 71.93,282.32 71.93,282.03 71.93,281.73 71.93,281.43 71.93,281.13 71.93,280.83 71.93,280.53 71.93,280.23 71.93,279.93 71.93,279.64 71.93,279.34 71.93,279.04 71.93,278.74 71.93,278.44 71.93,278.14 71.93,277.84 71.93,277.55 71.93,277.25 71.93,276.95 71.93,276.65 71.93,276.35 71.93,276.05 71.93,275.75 71.93,275.45 71.93,275.16 71.93,274.86 71.93,274.56 71.93,274.26 71.93,273.96 71.93,273.66 71.93,273.36 71.93,273.07 71.93,272.77 71.93,272.47 71.93,272.17 71.93,271.87 71.93,271.57 71.93,271.27 71.93,270.97 71.93,270.68 71.93,270.38 71.93,270.08 71.93,269.78 71.93,269.48 71.93,269.18 71.93,268.88 71.93,268.59 71.93,268.29 71.93,267.99 71.93,267.69 71.93,267.39 71.93,267.09 71.93,266.79 71.93,266.49 71.93,266.20 71.93,265.90 71.93,265.60 71.93,265.30 71.93,265.00 71.93,264.70 71.93,264.40 71.93,264.11 71.93,263.81 71.93,263.51 71.93,263.21 71.93,262.91 71.93,262.61 71.93,262.31 71.93,262.01 71.93,261.72 71.93,261.42 71.93,261.12 71.93,260.82 71.93,260.52 71.93,260.22 71.93,259.92 71.93,259.63 71.93,259.33 71.93,259.03 71.93,258.73 71.93,258.43 71.93,258.13 71.93,257.83 71.93,257.53 71.93,257.24 71.93,256.94 71.93,256.64 71.93,256.34 71.93,256.04 71.93,255.74 71.93,255.44 71.93,255.15 71.93,254.85 71.93,254.55 71.93,254.25 71.93,253.95 71.93,253.65 71.93,253.35 71.93,253.05 71.93,252.76 71.93,252.46 71.93,252.16 71.93,251.86 71.93,251.56 71.93,251.26 71.93,250.96 71.93,250.67 71.93,250.37 71.93,250.07 71.93,249.77 71.93,249.47 71.93,249.17 71.93,248.87 71.93,248.57 71.93,248.28 71.93,247.98 71.93,247.68 71.93,247.38 71.93,247.08 71.93,246.78 71.93,246.48 71.93,246.19 71.93,245.89 71.93,245.59 71.93,245.29 71.93,244.99 71.93,244.69 71.93,244.39 71.93,244.09 71.93,243.80 71.93,243.50 71.93,243.20 71.93,242.90 71.93,242.60 71.93,242.30 71.93,242.00 71.93,241.71 71.93,241.41 71.93,241.11 71.93,240.81 71.93,240.51 71.93,240.21 71.93,239.91 71.93,239.61 71.93,239.32 71.93,239.02 71.93,238.72 71.93,238.42 71.93,238.12 71.93,237.82 71.93,237.52 71.93,237.22 71.93,236.93 71.93,236.63 71.93,236.33 71.93,236.03 71.93,235.73 71.93,235.43 71.93,235.13 71.93,234.84 71.93,234.54 71.93,234.24 71.93,233.94 71.93,233.64 71.93,233.34 71.93,233.04 71.93,232.74 71.93,232.45 71.93,232.15 71.93,231.85 71.93,231.55 71.93,231.25 71.93,230.95 71.93,230.65 71.93,230.36 71.93,230.06 71.93,229.76 71.93,229.46 71.93,229.16 71.93,228.86 71.93,228.56 71.93,228.26 71.93,227.97 71.93,227.67 71.93,227.37 71.93,227.07 71.93,226.77 71.93,226.47 71.93,226.17 71.93,225.88 71.93,225.58 71.93,225.28 71.93,224.98 71.93,224.68 71.93,224.38 71.93,224.08 71.93,223.78 71.93,223.49 71.93,223.19 71.93,222.89 71.93,222.59 71.93,222.29 71.93,221.99 71.93,221.69 71.93,221.40 71.93,221.10 71.93,220.80 71.93,220.50 71.93,220.20 71.93,219.90 71.93,219.60 71.93,219.30 71.93,219.01 71.93,218.71 71.93,218.41 71.93,218.11 71.93,217.81 71.93,217.51 71.93,217.21 71.93,216.92 71.93,216.62 71.93,216.32 71.93,216.02 71.93,215.72 71.93,215.42 71.93,215.12 71.93,214.82 71.93,214.53 71.93,214.23 71.93,213.93 71.93,213.63 71.93,213.33 71.93,213.03 71.93,212.73 71.93,212.44 71.93,212.14 71.93,211.84 71.93,211.54 71.93,211.24 71.93,210.94 71.93,210.64 71.93,210.34 71.93,210.05 71.93,209.75 71.93,209.45 71.93,209.15 71.93,208.85 71.93,208.55 71.93,208.25 71.93,207.96 71.93,207.66 71.93,207.36 71.93,207.06 71.93,206.76 71.93,206.46 71.93,206.16 71.93,205.86 71.93,205.57 71.93,205.27 71.93,204.97 71.93,204.67 71.93,204.37 71.93,204.07 71.93,203.77 71.93,203.48 71.93,203.18 71.93,202.88 71.93,202.58 71.93,202.28 71.93,201.98 71.93,201.68 71.93,201.38 71.93,201.09 71.93,200.79 71.93,200.49 71.93,200.19 71.93,199.89 71.93,199.59 71.93,199.29 71.93,199.00 71.93,198.70 71.93,198.40 71.93,198.10 71.93,197.80 71.93,197.50 71.93,197.20 71.93,196.90 71.93,196.61 71.93,196.31 71.93,196.01 71.93,195.71 71.93,195.41 71.93,195.11 71.93,194.81 71.93,194.52 71.93,194.22 71.93,193.92 71.93,193.62 71.93,193.32 71.93,193.02 71.93,192.72 71.93,192.42 71.93,192.13 71.93,191.83 71.93,191.53 71.93,191.23 71.93,190.93 71.93,190.63 71.93,190.33 71.93,190.04 71.93,189.74 71.93,189.44 71.93,189.14 71.93,188.84 71.93,188.54 71.93,188.24 71.93,187.94 71.93,187.65 71.93,187.35 71.93,187.05 71.93,186.75 71.93,186.45 71.93,186.15 71.93,185.85 71.93,185.56 71.93,185.26 71.93,184.96 71.93,184.66 71.93,184.36 71.93,184.06 71.93,183.76 71.93,183.46 71.93,183.17 71.93,182.87 71.93,182.57 71.93,182.27 71.93,181.97 71.93,181.67 71.93,181.37 71.93,181.08 71.93,180.78 71.93,180.48 71.93,180.18 71.93,179.88 71.93,179.58 71.93,179.28 71.93,178.98 71.93,178.69 71.93,178.39 71.93,178.09 71.93,177.79 71.93,177.49 71.93,177.19 71.93,176.89 71.93,176.60 71.93,176.30 71.93,176.00 71.93,175.70 71.93,175.40 71.93,175.10 71.93,174.80 71.93,174.50 71.93,174.21 71.93,173.91 71.93,173.61 71.93,173.31 71.93,173.01 71.93,172.71 71.93,172.41 71.93,172.12 71.93,171.82 71.93,171.52 71.93,171.22 71.93,170.92 71.93,170.62 71.93,170.32 71.93,170.02 71.93,169.73 71.93,169.43 71.93,169.13 71.93,168.83 71.93,168.53 71.93,168.23 71.93,167.93 71.93,167.64 71.93,167.34 71.93,167.04 71.93,166.74 71.93,166.44 71.93,166.14 71.93,165.84 71.93,165.54 71.93,165.25 71.93,164.95 71.93,164.65 71.93,164.35 71.93,164.05 71.93,163.75 71.93,163.45 72.05,163.45 72.06,163.75 72.08,164.05 72.10,164.35 72.11,164.65 72.14,164.95 72.16,165.25 72.19,165.54 72.22,165.84 72.25,166.14 72.28,166.44 72.32,166.74 72.36,167.04 72.41,167.34 72.46,167.64 72.52,167.93 72.58,168.23 72.64,168.53 72.71,168.83 72.79,169.13 72.87,169.43 72.96,169.73 73.06,170.02 73.16,170.32 73.27,170.62 73.39,170.92 73.52,171.22 73.66,171.52 73.81,171.82 73.96,172.12 74.13,172.41 74.31,172.71 74.50,173.01 74.70,173.31 74.92,173.61 75.15,173.91 75.39,174.21 75.64,174.50 75.91,174.80 76.19,175.10 76.49,175.40 76.81,175.70 77.13,176.00 77.48,176.30 77.84,176.60 78.22,176.89 78.62,177.19 79.03,177.49 79.46,177.79 79.90,178.09 80.37,178.39 80.86,178.69 81.36,178.98 81.88,179.28 82.42,179.58 82.97,179.88 83.55,180.18 84.14,180.48 84.76,180.78 85.38,181.08 86.03,181.37 86.70,181.67 87.39,181.97 88.09,182.27 88.81,182.57 89.55,182.87 90.31,183.17 91.08,183.46 91.88,183.76 92.68,184.06 93.51,184.36 94.35,184.66 95.21,184.96 96.08,185.26 96.98,185.56 97.89,185.85 98.81,186.15 99.75,186.45 100.71,186.75 101.68,187.05 102.66,187.35 103.67,187.65 104.69,187.94 105.72,188.24 106.77,188.54 107.84,188.84 108.92,189.14 110.02,189.44 111.13,189.74 112.26,190.04 113.40,190.33 114.57,190.63 115.75,190.93 116.94,191.23 118.15,191.53 119.38,191.83 120.62,192.13 121.88,192.42 123.16,192.72 124.46,193.02 125.77,193.32 127.10,193.62 128.46,193.92 129.82,194.22 131.20,194.52 132.61,194.81 134.03,195.11 135.47,195.41 136.92,195.71 138.40,196.01 139.89,196.31 141.39,196.61 142.92,196.90 144.46,197.20 146.01,197.50 147.59,197.80 149.18,198.10 150.78,198.40 152.39,198.70 154.02,199.00 155.66,199.29 157.31,199.59 158.98,199.89 160.65,200.19 162.34,200.49 164.03,200.79 165.73,201.09 167.43,201.38 169.14,201.68 170.85,201.98 172.56,202.28 174.28,202.58 175.99,202.88 177.70,203.18 179.41,203.48 181.12,203.77 182.81,204.07 184.50,204.37 186.19,204.67 187.86,204.97 189.51,205.27 191.16,205.57 192.79,205.86 194.39,206.16 195.98,206.46 197.55,206.76 199.10,207.06 200.62,207.36 202.12,207.66 203.59,207.96 205.02,208.25 206.43,208.55 207.81,208.85 209.14,209.15 210.44,209.45 211.70,209.75 212.92,210.05 214.09,210.34 215.23,210.64 216.32,210.94 217.36,211.24 218.34,211.54 219.29,211.84 220.17,212.14 221.00,212.44 221.78,212.73 222.51,213.03 223.16,213.33 223.76,213.63 224.32,213.93 224.80,214.23 225.21,214.53 225.58,214.82 225.88,215.12 226.11,215.42 226.28,215.72 226.40,216.02 226.45,216.32 226.43,216.62 226.36,216.92 226.24,217.21 226.04,217.51 225.79,217.81 225.50,218.11 225.14,218.41 224.73,218.71 224.27,219.01 223.77,219.30 223.21,219.60 222.62,219.90 221.99,220.20 221.32,220.50 220.61,220.80 219.88,221.10 219.12,221.40 218.33,221.69 217.53,221.99 216.71,222.29 215.86,222.59 215.02,222.89 214.16,223.19 213.30,223.49 212.44,223.78 211.59,224.08 210.74,224.38 209.90,224.68 209.07,224.98 208.25,225.28 207.46,225.58 206.68,225.88 205.93,226.17 205.20,226.47 204.50,226.77 203.82,227.07 203.17,227.37 202.57,227.67 201.99,227.97 201.44,228.26 200.92,228.56 200.45,228.86 200.00,229.16 199.58,229.46 199.21,229.76 198.87,230.06 198.55,230.36 198.27,230.65 198.02,230.95 197.80,231.25 197.60,231.55 197.44,231.85 197.30,232.15 197.17,232.45 197.07,232.74 196.99,233.04 196.92,233.34 196.86,233.64 196.81,233.94 196.77,234.24 196.73,234.54 196.69,234.84 196.65,235.13 196.61,235.43 196.56,235.73 196.50,236.03 196.43,236.33 196.34,236.63 196.23,236.93 196.10,237.22 195.95,237.52 195.77,237.82 195.55,238.12 195.31,238.42 195.04,238.72 194.72,239.02 194.37,239.32 193.99,239.61 193.56,239.91 193.08,240.21 192.56,240.51 192.00,240.81 191.38,241.11 190.72,241.41 190.02,241.71 189.26,242.00 188.46,242.30 187.61,242.60 186.71,242.90 185.76,243.20 184.76,243.50 183.73,243.80 182.64,244.09 181.51,244.39 180.34,244.69 179.13,244.99 177.87,245.29 176.58,245.59 175.26,245.89 173.90,246.19 172.52,246.48 171.11,246.78 169.67,247.08 168.20,247.38 166.73,247.68 165.23,247.98 163.72,248.28 162.20,248.57 160.67,248.87 159.14,249.17 157.61,249.47 156.08,249.77 154.55,250.07 153.03,250.37 151.52,250.67 150.02,250.96 148.54,251.26 147.08,251.56 145.64,251.86 144.22,252.16 142.83,252.46 141.46,252.76 140.12,253.05 138.82,253.35 137.55,253.65 136.31,253.95 135.10,254.25 133.94,254.55 132.81,254.85 131.72,255.15 130.67,255.44 129.66,255.74 128.68,256.04 127.75,256.34 126.86,256.64 126.00,256.94 125.18,257.24 124.41,257.53 123.67,257.83 122.96,258.13 122.30,258.43 121.67,258.73 121.07,259.03 120.50,259.33 119.97,259.63 119.47,259.92 118.99,260.22 118.54,260.52 118.12,260.82 117.73,261.12 117.35,261.42 117.00,261.72 116.66,262.01 116.35,262.31 116.05,262.61 115.77,262.91 115.49,263.21 115.23,263.51 114.99,263.81 114.75,264.11 114.51,264.40 114.29,264.70 114.07,265.00 113.86,265.30 113.64,265.60 113.43,265.90 113.22,266.20 113.02,266.49 112.81,266.79 112.59,267.09 112.38,267.39 112.16,267.69 111.94,267.99 111.72,268.29 111.49,268.59 111.25,268.88 111.01,269.18 110.77,269.48 110.52,269.78 110.26,270.08 109.99,270.38 109.72,270.68 109.44,270.97 109.15,271.27 108.85,271.57 108.55,271.87 108.24,272.17 107.92,272.47 107.60,272.77 107.26,273.07 106.92,273.36 106.57,273.66 106.21,273.96 105.85,274.26 105.47,274.56 105.10,274.86 104.71,275.16 104.32,275.45 103.92,275.75 103.51,276.05 103.10,276.35 102.68,276.65 102.26,276.95 101.83,277.25 101.40,277.55 100.96,277.84 100.52,278.14 100.08,278.44 99.64,278.74 99.19,279.04 98.74,279.34 98.29,279.64 97.84,279.93 97.40,280.23 96.95,280.53 96.50,280.83 96.06,281.13 95.62,281.43 95.19,281.73 94.76,282.03 94.33,282.32 93.91,282.62 93.50,282.92 93.09,283.22 92.69,283.52 92.30,283.82 91.91,284.12 91.54,284.41 91.17,284.71 90.81,285.01 90.46,285.31 90.12,285.61 89.78,285.91 89.46,286.21 89.14,286.51 88.83,286.80 88.53,287.10 88.24,287.40 87.96,287.70 87.68,288.00 87.42,288.30 87.16,288.60 86.90,288.89 86.65,289.19 86.41,289.49 86.17,289.79 85.93,290.09 85.70,290.39 85.47,290.69 85.24,290.99 85.02,291.28 84.79,291.58 84.57,291.88 84.35,292.18 84.13,292.48 83.91,292.78 83.69,293.08 83.46,293.37 83.24,293.67 83.01,293.97 82.78,294.27 82.55,294.57 82.32,294.87 82.08,295.17 81.85,295.47 81.61,295.76 81.37,296.06 81.12,296.36 80.88,296.66 80.63,296.96 80.39,297.26 80.14,297.56 79.89,297.85 79.64,298.15 79.39,298.45 79.14,298.75 78.89,299.05 78.64,299.35 78.39,299.65 78.15,299.95 77.90,300.24 77.66,300.54 77.42,300.84 77.19,301.14 76.96,301.44 76.73,301.74 76.51,302.04 76.29,302.33 76.08,302.63 75.87,302.93 75.67,303.23 75.47,303.53 75.28,303.83 75.09,304.13 74.91,304.43 74.74,304.72 74.58,305.02 74.42,305.32 74.26,305.62 74.12,305.92 73.98,306.22 73.84,306.52 73.71,306.81 73.59,307.11 73.48,307.41 73.37,307.71 73.26,308.01 73.17,308.31 73.07,308.61 72.99,308.91 72.90,309.20 72.83,309.50 72.76,309.80 72.69,310.10 72.63,310.40 72.57,310.70 72.51,311.00 72.46,311.29 72.42,311.59 72.37,311.89 72.33,312.19 72.30,312.49 72.26,312.79 72.23,313.09 72.20,313.39 72.17,313.68 72.15,313.98 72.13,314.28 72.11,314.58 72.09,314.88 72.07,315.18 72.06,315.48 72.05,315.77 72.03,316.07 ' style='stroke-width: 0.75; stroke: none; fill: #DF536B; fill-opacity: 0.10;' />
+<polyline points='72.03,316.07 72.05,315.77 72.06,315.48 72.07,315.18 72.09,314.88 72.11,314.58 72.13,314.28 72.15,313.98 72.17,313.68 72.20,313.39 72.23,313.09 72.26,312.79 72.30,312.49 72.33,312.19 72.37,311.89 72.42,311.59 72.46,311.29 72.51,311.00 72.57,310.70 72.63,310.40 72.69,310.10 72.76,309.80 72.83,309.50 72.90,309.20 72.99,308.91 73.07,308.61 73.17,308.31 73.26,308.01 73.37,307.71 73.48,307.41 73.59,307.11 73.71,306.81 73.84,306.52 73.98,306.22 74.12,305.92 74.26,305.62 74.42,305.32 74.58,305.02 74.74,304.72 74.91,304.43 75.09,304.13 75.28,303.83 75.47,303.53 75.67,303.23 75.87,302.93 76.08,302.63 76.29,302.33 76.51,302.04 76.73,301.74 76.96,301.44 77.19,301.14 77.42,300.84 77.66,300.54 77.90,300.24 78.15,299.95 78.39,299.65 78.64,299.35 78.89,299.05 79.14,298.75 79.39,298.45 79.64,298.15 79.89,297.85 80.14,297.56 80.39,297.26 80.63,296.96 80.88,296.66 81.12,296.36 81.37,296.06 81.61,295.76 81.85,295.47 82.08,295.17 82.32,294.87 82.55,294.57 82.78,294.27 83.01,293.97 83.24,293.67 83.46,293.37 83.69,293.08 83.91,292.78 84.13,292.48 84.35,292.18 84.57,291.88 84.79,291.58 85.02,291.28 85.24,290.99 85.47,290.69 85.70,290.39 85.93,290.09 86.17,289.79 86.41,289.49 86.65,289.19 86.90,288.89 87.16,288.60 87.42,288.30 87.68,288.00 87.96,287.70 88.24,287.40 88.53,287.10 88.83,286.80 89.14,286.51 89.46,286.21 89.78,285.91 90.12,285.61 90.46,285.31 90.81,285.01 91.17,284.71 91.54,284.41 91.91,284.12 92.30,283.82 92.69,283.52 93.09,283.22 93.50,282.92 93.91,282.62 94.33,282.32 94.76,282.03 95.19,281.73 95.62,281.43 96.06,281.13 96.50,280.83 96.95,280.53 97.40,280.23 97.84,279.93 98.29,279.64 98.74,279.34 99.19,279.04 99.64,278.74 100.08,278.44 100.52,278.14 100.96,277.84 101.40,277.55 101.83,277.25 102.26,276.95 102.68,276.65 103.10,276.35 103.51,276.05 103.92,275.75 104.32,275.45 104.71,275.16 105.10,274.86 105.47,274.56 105.85,274.26 106.21,273.96 106.57,273.66 106.92,273.36 107.26,273.07 107.60,272.77 107.92,272.47 108.24,272.17 108.55,271.87 108.85,271.57 109.15,271.27 109.44,270.97 109.72,270.68 109.99,270.38 110.26,270.08 110.52,269.78 110.77,269.48 111.01,269.18 111.25,268.88 111.49,268.59 111.72,268.29 111.94,267.99 112.16,267.69 112.38,267.39 112.59,267.09 112.81,266.79 113.02,266.49 113.22,266.20 113.43,265.90 113.64,265.60 113.86,265.30 114.07,265.00 114.29,264.70 114.51,264.40 114.75,264.11 114.99,263.81 115.23,263.51 115.49,263.21 115.77,262.91 116.05,262.61 116.35,262.31 116.66,262.01 117.00,261.72 117.35,261.42 117.73,261.12 118.12,260.82 118.54,260.52 118.99,260.22 119.47,259.92 119.97,259.63 120.50,259.33 121.07,259.03 121.67,258.73 122.30,258.43 122.96,258.13 123.67,257.83 124.41,257.53 125.18,257.24 126.00,256.94 126.86,256.64 127.75,256.34 128.68,256.04 129.66,255.74 130.67,255.44 131.72,255.15 132.81,254.85 133.94,254.55 135.10,254.25 136.31,253.95 137.55,253.65 138.82,253.35 140.12,253.05 141.46,252.76 142.83,252.46 144.22,252.16 145.64,251.86 147.08,251.56 148.54,251.26 150.02,250.96 151.52,250.67 153.03,250.37 154.55,250.07 156.08,249.77 157.61,249.47 159.14,249.17 160.67,248.87 162.20,248.57 163.72,248.28 165.23,247.98 166.73,247.68 168.20,247.38 169.67,247.08 171.11,246.78 172.52,246.48 173.90,246.19 175.26,245.89 176.58,245.59 177.87,245.29 179.13,244.99 180.34,244.69 181.51,244.39 182.64,244.09 183.73,243.80 184.76,243.50 185.76,243.20 186.71,242.90 187.61,242.60 188.46,242.30 189.26,242.00 190.02,241.71 190.72,241.41 191.38,241.11 192.00,240.81 192.56,240.51 193.08,240.21 193.56,239.91 193.99,239.61 194.37,239.32 194.72,239.02 195.04,238.72 195.31,238.42 195.55,238.12 195.77,237.82 195.95,237.52 196.10,237.22 196.23,236.93 196.34,236.63 196.43,236.33 196.50,236.03 196.56,235.73 196.61,235.43 196.65,235.13 196.69,234.84 196.73,234.54 196.77,234.24 196.81,233.94 196.86,233.64 196.92,233.34 196.99,233.04 197.07,232.74 197.17,232.45 197.30,232.15 197.44,231.85 197.60,231.55 197.80,231.25 198.02,230.95 198.27,230.65 198.55,230.36 198.87,230.06 199.21,229.76 199.58,229.46 200.00,229.16 200.45,228.86 200.92,228.56 201.44,228.26 201.99,227.97 202.57,227.67 203.17,227.37 203.82,227.07 204.50,226.77 205.20,226.47 205.93,226.17 206.68,225.88 207.46,225.58 208.25,225.28 209.07,224.98 209.90,224.68 210.74,224.38 211.59,224.08 212.44,223.78 213.30,223.49 214.16,223.19 215.02,222.89 215.86,222.59 216.71,222.29 217.53,221.99 218.33,221.69 219.12,221.40 219.88,221.10 220.61,220.80 221.32,220.50 221.99,220.20 222.62,219.90 223.21,219.60 223.77,219.30 224.27,219.01 224.73,218.71 225.14,218.41 225.50,218.11 225.79,217.81 226.04,217.51 226.24,217.21 226.36,216.92 226.43,216.62 226.45,216.32 226.40,216.02 226.28,215.72 226.11,215.42 225.88,215.12 225.58,214.82 225.21,214.53 224.80,214.23 224.32,213.93 223.76,213.63 223.16,213.33 222.51,213.03 221.78,212.73 221.00,212.44 220.17,212.14 219.29,211.84 218.34,211.54 217.36,211.24 216.32,210.94 215.23,210.64 214.09,210.34 212.92,210.05 211.70,209.75 210.44,209.45 209.14,209.15 207.81,208.85 206.43,208.55 205.02,208.25 203.59,207.96 202.12,207.66 200.62,207.36 199.10,207.06 197.55,206.76 195.98,206.46 194.39,206.16 192.79,205.86 191.16,205.57 189.51,205.27 187.86,204.97 186.19,204.67 184.50,204.37 182.81,204.07 181.12,203.77 179.41,203.48 177.70,203.18 175.99,202.88 174.28,202.58 172.56,202.28 170.85,201.98 169.14,201.68 167.43,201.38 165.73,201.09 164.03,200.79 162.34,200.49 160.65,200.19 158.98,199.89 157.31,199.59 155.66,199.29 154.02,199.00 152.39,198.70 150.78,198.40 149.18,198.10 147.59,197.80 146.01,197.50 144.46,197.20 142.92,196.90 141.39,196.61 139.89,196.31 138.40,196.01 136.92,195.71 135.47,195.41 134.03,195.11 132.61,194.81 131.20,194.52 129.82,194.22 128.46,193.92 127.10,193.62 125.77,193.32 124.46,193.02 123.16,192.72 121.88,192.42 120.62,192.13 119.38,191.83 118.15,191.53 116.94,191.23 115.75,190.93 114.57,190.63 113.40,190.33 112.26,190.04 111.13,189.74 110.02,189.44 108.92,189.14 107.84,188.84 106.77,188.54 105.72,188.24 104.69,187.94 103.67,187.65 102.66,187.35 101.68,187.05 100.71,186.75 99.75,186.45 98.81,186.15 97.89,185.85 96.98,185.56 96.08,185.26 95.21,184.96 94.35,184.66 93.51,184.36 92.68,184.06 91.88,183.76 91.08,183.46 90.31,183.17 89.55,182.87 88.81,182.57 88.09,182.27 87.39,181.97 86.70,181.67 86.03,181.37 85.38,181.08 84.76,180.78 84.14,180.48 83.55,180.18 82.97,179.88 82.42,179.58 81.88,179.28 81.36,178.98 80.86,178.69 80.37,178.39 79.90,178.09 79.46,177.79 79.03,177.49 78.62,177.19 78.22,176.89 77.84,176.60 77.48,176.30 77.13,176.00 76.81,175.70 76.49,175.40 76.19,175.10 75.91,174.80 75.64,174.50 75.39,174.21 75.15,173.91 74.92,173.61 74.70,173.31 74.50,173.01 74.31,172.71 74.13,172.41 73.96,172.12 73.81,171.82 73.66,171.52 73.52,171.22 73.39,170.92 73.27,170.62 73.16,170.32 73.06,170.02 72.96,169.73 72.87,169.43 72.79,169.13 72.71,168.83 72.64,168.53 72.58,168.23 72.52,167.93 72.46,167.64 72.41,167.34 72.36,167.04 72.32,166.74 72.28,166.44 72.25,166.14 72.22,165.84 72.19,165.54 72.16,165.25 72.14,164.95 72.11,164.65 72.10,164.35 72.08,164.05 72.06,163.75 72.05,163.45 ' style='stroke-width: 0.75; stroke: #DF536B;' />
+<polygon points='71.93,240.53 71.93,240.20 71.93,239.87 71.93,239.54 71.93,239.22 71.93,238.89 71.93,238.56 71.93,238.23 71.93,237.90 71.93,237.57 71.93,237.25 71.93,236.92 71.93,236.59 71.93,236.26 71.93,235.93 71.93,235.60 71.93,235.28 71.93,234.95 71.93,234.62 71.93,234.29 71.93,233.96 71.93,233.64 71.93,233.31 71.93,232.98 71.93,232.65 71.93,232.32 71.93,231.99 71.93,231.67 71.93,231.34 71.93,231.01 71.93,230.68 71.93,230.35 71.93,230.02 71.93,229.70 71.93,229.37 71.93,229.04 71.93,228.71 71.93,228.38 71.93,228.06 71.93,227.73 71.93,227.40 71.93,227.07 71.93,226.74 71.93,226.41 71.93,226.09 71.93,225.76 71.93,225.43 71.93,225.10 71.93,224.77 71.93,224.44 71.93,224.12 71.93,223.79 71.93,223.46 71.93,223.13 71.93,222.80 71.93,222.48 71.93,222.15 71.93,221.82 71.93,221.49 71.93,221.16 71.93,220.83 71.93,220.51 71.93,220.18 71.93,219.85 71.93,219.52 71.93,219.19 71.93,218.86 71.93,218.54 71.93,218.21 71.93,217.88 71.93,217.55 71.93,217.22 71.93,216.90 71.93,216.57 71.93,216.24 71.93,215.91 71.93,215.58 71.93,215.25 71.93,214.93 71.93,214.60 71.93,214.27 71.93,213.94 71.93,213.61 71.93,213.28 71.93,212.96 71.93,212.63 71.93,212.30 71.93,211.97 71.93,211.64 71.93,211.32 71.93,210.99 71.93,210.66 71.93,210.33 71.93,210.00 71.93,209.67 71.93,209.35 71.93,209.02 71.93,208.69 71.93,208.36 71.93,208.03 71.93,207.70 71.93,207.38 71.93,207.05 71.93,206.72 71.93,206.39 71.93,206.06 71.93,205.74 71.93,205.41 71.93,205.08 71.93,204.75 71.93,204.42 71.93,204.09 71.93,203.77 71.93,203.44 71.93,203.11 71.93,202.78 71.93,202.45 71.93,202.12 71.93,201.80 71.93,201.47 71.93,201.14 71.93,200.81 71.93,200.48 71.93,200.16 71.93,199.83 71.93,199.50 71.93,199.17 71.93,198.84 71.93,198.51 71.93,198.19 71.93,197.86 71.93,197.53 71.93,197.20 71.93,196.87 71.93,196.54 71.93,196.22 71.93,195.89 71.93,195.56 71.93,195.23 71.93,194.90 71.93,194.58 71.93,194.25 71.93,193.92 71.93,193.59 71.93,193.26 71.93,192.93 71.93,192.61 71.93,192.28 71.93,191.95 71.93,191.62 71.93,191.29 71.93,190.96 71.93,190.64 71.93,190.31 71.93,189.98 71.93,189.65 71.93,189.32 71.93,189.00 71.93,188.67 71.93,188.34 71.93,188.01 71.93,187.68 71.93,187.35 71.93,187.03 71.93,186.70 71.93,186.37 71.93,186.04 71.93,185.71 71.93,185.38 71.93,185.06 71.93,184.73 71.93,184.40 71.93,184.07 71.93,183.74 71.93,183.42 71.93,183.09 71.93,182.76 71.93,182.43 71.93,182.10 71.93,181.77 71.93,181.45 71.93,181.12 71.93,180.79 71.93,180.46 71.93,180.13 71.93,179.80 71.93,179.48 71.93,179.15 71.93,178.82 71.93,178.49 71.93,178.16 71.93,177.84 71.93,177.51 71.93,177.18 71.93,176.85 71.93,176.52 71.93,176.19 71.93,175.87 71.93,175.54 71.93,175.21 71.93,174.88 71.93,174.55 71.93,174.22 71.93,173.90 71.93,173.57 71.93,173.24 71.93,172.91 71.93,172.58 71.93,172.26 71.93,171.93 71.93,171.60 71.93,171.27 71.93,170.94 71.93,170.61 71.93,170.29 71.93,169.96 71.93,169.63 71.93,169.30 71.93,168.97 71.93,168.64 71.93,168.32 71.93,167.99 71.93,167.66 71.93,167.33 71.93,167.00 71.93,166.68 71.93,166.35 71.93,166.02 71.93,165.69 71.93,165.36 71.93,165.03 71.93,164.71 71.93,164.38 71.93,164.05 71.93,163.72 71.93,163.39 71.93,163.06 71.93,162.74 71.93,162.41 71.93,162.08 71.93,161.75 71.93,161.42 71.93,161.10 71.93,160.77 71.93,160.44 71.93,160.11 71.93,159.78 71.93,159.45 71.93,159.13 71.93,158.80 71.93,158.47 71.93,158.14 71.93,157.81 71.93,157.48 71.93,157.16 71.93,156.83 71.93,156.50 71.93,156.17 71.93,155.84 71.93,155.52 71.93,155.19 71.93,154.86 71.93,154.53 71.93,154.20 71.93,153.87 71.93,153.55 71.93,153.22 71.93,152.89 71.93,152.56 71.93,152.23 71.93,151.90 71.93,151.58 71.93,151.25 71.93,150.92 71.93,150.59 71.93,150.26 71.93,149.94 71.93,149.61 71.93,149.28 71.93,148.95 71.93,148.62 71.93,148.29 71.93,147.97 71.93,147.64 71.93,147.31 71.93,146.98 71.93,146.65 71.93,146.32 71.93,146.00 71.93,145.67 71.93,145.34 71.93,145.01 71.93,144.68 71.93,144.36 71.93,144.03 71.93,143.70 71.93,143.37 71.93,143.04 71.93,142.71 71.93,142.39 71.93,142.06 71.93,141.73 71.93,141.40 71.93,141.07 71.93,140.74 71.93,140.42 71.93,140.09 71.93,139.76 71.93,139.43 71.93,139.10 71.93,138.78 71.93,138.45 71.93,138.12 71.93,137.79 71.93,137.46 71.93,137.13 71.93,136.81 71.93,136.48 71.93,136.15 71.93,135.82 71.93,135.49 71.93,135.16 71.93,134.84 71.93,134.51 71.93,134.18 71.93,133.85 71.93,133.52 71.93,133.20 71.93,132.87 71.93,132.54 71.93,132.21 71.93,131.88 71.93,131.55 71.93,131.23 71.93,130.90 71.93,130.57 71.93,130.24 71.93,129.91 71.93,129.58 71.93,129.26 71.93,128.93 71.93,128.60 71.93,128.27 71.93,127.94 71.93,127.62 71.93,127.29 71.93,126.96 71.93,126.63 71.93,126.30 71.93,125.97 71.93,125.65 71.93,125.32 71.93,124.99 71.93,124.66 71.93,124.33 71.93,124.00 71.93,123.68 71.93,123.35 71.93,123.02 71.93,122.69 71.93,122.36 71.93,122.04 71.93,121.71 71.93,121.38 71.93,121.05 71.93,120.72 71.93,120.39 71.93,120.07 71.93,119.74 71.93,119.41 71.93,119.08 71.93,118.75 71.93,118.42 71.93,118.10 71.93,117.77 71.93,117.44 71.93,117.11 71.93,116.78 71.93,116.46 71.93,116.13 71.93,115.80 71.93,115.47 71.93,115.14 71.93,114.81 71.93,114.49 71.93,114.16 71.93,113.83 71.93,113.50 71.93,113.17 71.93,112.84 71.93,112.52 71.93,112.19 71.93,111.86 71.93,111.53 71.93,111.20 71.93,110.88 71.93,110.55 71.93,110.22 71.93,109.89 71.93,109.56 71.93,109.23 71.93,108.91 71.93,108.58 71.93,108.25 71.93,107.92 71.93,107.59 71.93,107.26 71.93,106.94 71.93,106.61 71.93,106.28 71.93,105.95 71.93,105.62 71.93,105.30 71.93,104.97 71.93,104.64 71.93,104.31 71.93,103.98 71.93,103.65 71.93,103.33 71.93,103.00 71.93,102.67 71.93,102.34 71.93,102.01 71.93,101.68 71.93,101.36 71.93,101.03 71.93,100.70 71.93,100.37 71.93,100.04 71.93,99.72 71.93,99.39 71.93,99.06 71.93,98.73 71.93,98.40 71.93,98.07 71.93,97.75 71.93,97.42 71.93,97.09 71.93,96.76 71.93,96.43 71.93,96.10 71.93,95.78 71.93,95.45 71.93,95.12 71.93,94.79 71.93,94.46 71.93,94.14 71.93,93.81 71.93,93.48 71.93,93.15 71.93,92.82 71.93,92.49 71.93,92.17 71.93,91.84 71.93,91.51 71.93,91.18 71.93,90.85 71.93,90.52 71.93,90.20 71.93,89.87 71.93,89.54 71.93,89.21 71.93,88.88 71.93,88.56 71.93,88.23 71.93,87.90 71.93,87.57 71.93,87.24 71.93,86.91 71.93,86.59 71.93,86.26 71.93,85.93 71.93,85.60 71.93,85.27 71.93,84.94 71.93,84.62 71.93,84.29 71.93,83.96 71.93,83.63 71.93,83.30 71.93,82.98 71.93,82.65 71.93,82.32 71.93,81.99 71.93,81.66 71.93,81.33 71.93,81.01 71.93,80.68 71.93,80.35 71.93,80.02 71.93,79.69 71.93,79.36 71.93,79.04 71.93,78.71 71.93,78.38 71.93,78.05 71.93,77.72 71.93,77.40 71.93,77.07 71.93,76.74 71.93,76.41 71.93,76.08 71.93,75.75 71.93,75.43 71.93,75.10 71.93,74.77 71.93,74.44 71.93,74.11 71.93,73.78 71.93,73.46 71.93,73.13 71.93,72.80 72.04,72.80 72.05,73.13 72.06,73.46 72.08,73.78 72.10,74.11 72.12,74.44 72.15,74.77 72.17,75.10 72.20,75.43 72.24,75.75 72.27,76.08 72.31,76.41 72.35,76.74 72.40,77.07 72.45,77.40 72.51,77.72 72.57,78.05 72.64,78.38 72.71,78.71 72.79,79.04 72.87,79.36 72.96,79.69 73.06,80.02 73.17,80.35 73.28,80.68 73.41,81.01 73.54,81.33 73.67,81.66 73.82,81.99 73.98,82.32 74.15,82.65 74.33,82.98 74.52,83.30 74.72,83.63 74.92,83.96 75.15,84.29 75.38,84.62 75.62,84.94 75.88,85.27 76.15,85.60 76.43,85.93 76.72,86.26 77.02,86.59 77.34,86.91 77.67,87.24 78.01,87.57 78.36,87.90 78.72,88.23 79.10,88.56 79.48,88.88 79.88,89.21 80.29,89.54 80.71,89.87 81.15,90.20 81.59,90.52 82.04,90.85 82.50,91.18 82.97,91.51 83.45,91.84 83.94,92.17 84.44,92.49 84.94,92.82 85.46,93.15 85.97,93.48 86.50,93.81 87.03,94.14 87.57,94.46 88.11,94.79 88.65,95.12 89.20,95.45 89.75,95.78 90.30,96.10 90.86,96.43 91.41,96.76 91.97,97.09 92.52,97.42 93.07,97.75 93.62,98.07 94.16,98.40 94.70,98.73 95.23,99.06 95.76,99.39 96.28,99.72 96.79,100.04 97.29,100.37 97.78,100.70 98.25,101.03 98.71,101.36 99.16,101.68 99.60,102.01 100.01,102.34 100.41,102.67 100.79,103.00 101.15,103.33 101.49,103.65 101.81,103.98 102.10,104.31 102.38,104.64 102.63,104.97 102.85,105.30 103.06,105.62 103.23,105.95 103.38,106.28 103.51,106.61 103.62,106.94 103.69,107.26 103.75,107.59 103.78,107.92 103.79,108.25 103.77,108.58 103.73,108.91 103.68,109.23 103.60,109.56 103.51,109.89 103.40,110.22 103.27,110.55 103.13,110.88 102.97,111.20 102.81,111.53 102.64,111.86 102.45,112.19 102.26,112.52 102.07,112.84 101.88,113.17 101.68,113.50 101.49,113.83 101.29,114.16 101.10,114.49 100.92,114.81 100.75,115.14 100.58,115.47 100.42,115.80 100.28,116.13 100.15,116.46 100.03,116.78 99.93,117.11 99.84,117.44 99.77,117.77 99.72,118.10 99.69,118.42 99.67,118.75 99.68,119.08 99.71,119.41 99.76,119.74 99.83,120.07 99.92,120.39 100.05,120.72 100.19,121.05 100.35,121.38 100.54,121.71 100.76,122.04 101.00,122.36 101.26,122.69 101.56,123.02 101.88,123.35 102.22,123.68 102.58,124.00 102.99,124.33 103.41,124.66 103.86,124.99 104.33,125.32 104.84,125.65 105.37,125.97 105.93,126.30 106.51,126.63 107.13,126.96 107.76,127.29 108.42,127.62 109.12,127.94 109.84,128.27 110.58,128.60 111.34,128.93 112.13,129.26 112.94,129.58 113.77,129.91 114.63,130.24 115.50,130.57 116.40,130.90 117.30,131.23 118.23,131.55 119.18,131.88 120.13,132.21 121.09,132.54 122.07,132.87 123.06,133.20 124.05,133.52 125.05,133.85 126.05,134.18 127.06,134.51 128.07,134.84 129.07,135.16 130.08,135.49 131.08,135.82 132.08,136.15 133.07,136.48 134.06,136.81 135.04,137.13 136.02,137.46 136.98,137.79 137.94,138.12 138.89,138.45 139.82,138.78 140.75,139.10 141.68,139.43 142.59,139.76 143.49,140.09 144.39,140.42 145.28,140.74 146.16,141.07 147.04,141.40 147.92,141.73 148.79,142.06 149.66,142.39 150.53,142.71 151.40,143.04 152.28,143.37 153.15,143.70 154.03,144.03 154.92,144.36 155.82,144.68 156.72,145.01 157.64,145.34 158.56,145.67 159.50,146.00 160.45,146.32 161.41,146.65 162.39,146.98 163.38,147.31 164.39,147.64 165.41,147.97 166.45,148.29 167.50,148.62 168.57,148.95 169.65,149.28 170.74,149.61 171.85,149.94 172.97,150.26 174.09,150.59 175.22,150.92 176.36,151.25 177.50,151.58 178.65,151.90 179.79,152.23 180.93,152.56 182.06,152.89 183.18,153.22 184.29,153.55 185.39,153.87 186.47,154.20 187.52,154.53 188.54,154.86 189.54,155.19 190.51,155.52 191.44,155.84 192.33,156.17 193.18,156.50 193.98,156.83 194.73,157.16 195.43,157.48 196.09,157.81 196.67,158.14 197.19,158.47 197.66,158.80 198.07,159.13 198.39,159.45 198.65,159.78 198.85,160.11 198.98,160.44 199.02,160.77 199.01,161.10 198.93,161.42 198.76,161.75 198.52,162.08 198.23,162.41 197.87,162.74 197.43,163.06 196.93,163.39 196.38,163.72 195.77,164.05 195.09,164.38 194.37,164.71 193.61,165.03 192.80,165.36 191.95,165.69 191.07,166.02 190.16,166.35 189.22,166.68 188.27,167.00 187.30,167.33 186.32,167.66 185.35,167.99 184.37,168.32 183.40,168.64 182.45,168.97 181.52,169.30 180.61,169.63 179.72,169.96 178.88,170.29 178.08,170.61 177.32,170.94 176.60,171.27 175.95,171.60 175.35,171.93 174.80,172.26 174.33,172.58 173.92,172.91 173.58,173.24 173.30,173.57 173.12,173.90 173.01,174.22 172.96,174.55 172.99,174.88 173.11,175.21 173.30,175.54 173.55,175.87 173.89,176.19 174.32,176.52 174.80,176.85 175.34,177.18 175.97,177.51 176.65,177.84 177.39,178.16 178.17,178.49 179.03,178.82 179.92,179.15 180.85,179.48 181.81,179.80 182.82,180.13 183.84,180.46 184.87,180.79 185.93,181.12 186.99,181.45 188.05,181.77 189.10,182.10 190.14,182.43 191.16,182.76 192.15,183.09 193.12,183.42 194.04,183.74 194.92,184.07 195.76,184.40 196.54,184.73 197.25,185.06 197.91,185.38 198.51,185.71 199.01,186.04 199.44,186.37 199.81,186.70 200.08,187.03 200.26,187.35 200.36,187.68 200.38,188.01 200.28,188.34 200.10,188.67 199.83,189.00 199.48,189.32 199.00,189.65 198.44,189.98 197.80,190.31 197.07,190.64 196.22,190.96 195.31,191.29 194.31,191.62 193.22,191.95 192.04,192.28 190.79,192.61 189.48,192.93 188.07,193.26 186.59,193.59 185.06,193.92 183.47,194.25 181.80,194.58 180.09,194.90 178.33,195.23 176.51,195.56 174.65,195.89 172.75,196.22 170.82,196.54 168.84,196.87 166.84,197.20 164.82,197.53 162.78,197.86 160.71,198.19 158.63,198.51 156.53,198.84 154.43,199.17 152.33,199.50 150.22,199.83 148.12,200.16 146.02,200.48 143.93,200.81 141.85,201.14 139.78,201.47 137.74,201.80 135.71,202.12 133.70,202.45 131.72,202.78 129.78,203.11 127.85,203.44 125.96,203.77 124.11,204.09 122.30,204.42 120.52,204.75 118.77,205.08 117.09,205.41 115.44,205.74 113.83,206.06 112.26,206.39 110.76,206.72 109.29,207.05 107.87,207.38 106.51,207.70 105.19,208.03 103.92,208.36 102.70,208.69 101.54,209.02 100.42,209.35 99.34,209.67 98.32,210.00 97.35,210.33 96.42,210.66 95.52,210.99 94.68,211.32 93.89,211.64 93.12,211.97 92.39,212.30 91.71,212.63 91.06,212.96 90.44,213.28 89.85,213.61 89.30,213.94 88.77,214.27 88.26,214.60 87.79,214.93 87.33,215.25 86.89,215.58 86.47,215.91 86.07,216.24 85.68,216.57 85.30,216.90 84.94,217.22 84.58,217.55 84.24,217.88 83.90,218.21 83.57,218.54 83.25,218.86 82.93,219.19 82.61,219.52 82.30,219.85 81.99,220.18 81.68,220.51 81.38,220.83 81.08,221.16 80.78,221.49 80.48,221.82 80.18,222.15 79.89,222.48 79.59,222.80 79.30,223.13 79.01,223.46 78.73,223.79 78.45,224.12 78.17,224.44 77.89,224.77 77.62,225.10 77.35,225.43 77.09,225.76 76.84,226.09 76.59,226.41 76.34,226.74 76.11,227.07 75.88,227.40 75.65,227.73 75.43,228.06 75.23,228.38 75.02,228.71 74.83,229.04 74.64,229.37 74.46,229.70 74.29,230.02 74.13,230.35 73.98,230.68 73.83,231.01 73.69,231.34 73.55,231.67 73.43,231.99 73.31,232.32 73.20,232.65 73.10,232.98 73.00,233.31 72.91,233.64 72.83,233.96 72.75,234.29 72.68,234.62 72.61,234.95 72.54,235.28 72.49,235.60 72.43,235.93 72.38,236.26 72.34,236.59 72.30,236.92 72.26,237.25 72.23,237.57 72.20,237.90 72.17,238.23 72.14,238.56 72.12,238.89 72.10,239.22 72.08,239.54 72.06,239.87 72.05,240.20 72.03,240.53 ' style='stroke-width: 0.75; stroke: none; fill: #61D04F; fill-opacity: 0.10;' />
+<polyline points='72.03,240.53 72.05,240.20 72.06,239.87 72.08,239.54 72.10,239.22 72.12,238.89 72.14,238.56 72.17,238.23 72.20,237.90 72.23,237.57 72.26,237.25 72.30,236.92 72.34,236.59 72.38,236.26 72.43,235.93 72.49,235.60 72.54,235.28 72.61,234.95 72.68,234.62 72.75,234.29 72.83,233.96 72.91,233.64 73.00,233.31 73.10,232.98 73.20,232.65 73.31,232.32 73.43,231.99 73.55,231.67 73.69,231.34 73.83,231.01 73.98,230.68 74.13,230.35 74.29,230.02 74.46,229.70 74.64,229.37 74.83,229.04 75.02,228.71 75.23,228.38 75.43,228.06 75.65,227.73 75.88,227.40 76.11,227.07 76.34,226.74 76.59,226.41 76.84,226.09 77.09,225.76 77.35,225.43 77.62,225.10 77.89,224.77 78.17,224.44 78.45,224.12 78.73,223.79 79.01,223.46 79.30,223.13 79.59,222.80 79.89,222.48 80.18,222.15 80.48,221.82 80.78,221.49 81.08,221.16 81.38,220.83 81.68,220.51 81.99,220.18 82.30,219.85 82.61,219.52 82.93,219.19 83.25,218.86 83.57,218.54 83.90,218.21 84.24,217.88 84.58,217.55 84.94,217.22 85.30,216.90 85.68,216.57 86.07,216.24 86.47,215.91 86.89,215.58 87.33,215.25 87.79,214.93 88.26,214.60 88.77,214.27 89.30,213.94 89.85,213.61 90.44,213.28 91.06,212.96 91.71,212.63 92.39,212.30 93.12,211.97 93.89,211.64 94.68,211.32 95.52,210.99 96.42,210.66 97.35,210.33 98.32,210.00 99.34,209.67 100.42,209.35 101.54,209.02 102.70,208.69 103.92,208.36 105.19,208.03 106.51,207.70 107.87,207.38 109.29,207.05 110.76,206.72 112.26,206.39 113.83,206.06 115.44,205.74 117.09,205.41 118.77,205.08 120.52,204.75 122.30,204.42 124.11,204.09 125.96,203.77 127.85,203.44 129.78,203.11 131.72,202.78 133.70,202.45 135.71,202.12 137.74,201.80 139.78,201.47 141.85,201.14 143.93,200.81 146.02,200.48 148.12,200.16 150.22,199.83 152.33,199.50 154.43,199.17 156.53,198.84 158.63,198.51 160.71,198.19 162.78,197.86 164.82,197.53 166.84,197.20 168.84,196.87 170.82,196.54 172.75,196.22 174.65,195.89 176.51,195.56 178.33,195.23 180.09,194.90 181.80,194.58 183.47,194.25 185.06,193.92 186.59,193.59 188.07,193.26 189.48,192.93 190.79,192.61 192.04,192.28 193.22,191.95 194.31,191.62 195.31,191.29 196.22,190.96 197.07,190.64 197.80,190.31 198.44,189.98 199.00,189.65 199.48,189.32 199.83,189.00 200.10,188.67 200.28,188.34 200.38,188.01 200.36,187.68 200.26,187.35 200.08,187.03 199.81,186.70 199.44,186.37 199.01,186.04 198.51,185.71 197.91,185.38 197.25,185.06 196.54,184.73 195.76,184.40 194.92,184.07 194.04,183.74 193.12,183.42 192.15,183.09 191.16,182.76 190.14,182.43 189.10,182.10 188.05,181.77 186.99,181.45 185.93,181.12 184.87,180.79 183.84,180.46 182.82,180.13 181.81,179.80 180.85,179.48 179.92,179.15 179.03,178.82 178.17,178.49 177.39,178.16 176.65,177.84 175.97,177.51 175.34,177.18 174.80,176.85 174.32,176.52 173.89,176.19 173.55,175.87 173.30,175.54 173.11,175.21 172.99,174.88 172.96,174.55 173.01,174.22 173.12,173.90 173.30,173.57 173.58,173.24 173.92,172.91 174.33,172.58 174.80,172.26 175.35,171.93 175.95,171.60 176.60,171.27 177.32,170.94 178.08,170.61 178.88,170.29 179.72,169.96 180.61,169.63 181.52,169.30 182.45,168.97 183.40,168.64 184.37,168.32 185.35,167.99 186.32,167.66 187.30,167.33 188.27,167.00 189.22,166.68 190.16,166.35 191.07,166.02 191.95,165.69 192.80,165.36 193.61,165.03 194.37,164.71 195.09,164.38 195.77,164.05 196.38,163.72 196.93,163.39 197.43,163.06 197.87,162.74 198.23,162.41 198.52,162.08 198.76,161.75 198.93,161.42 199.01,161.10 199.02,160.77 198.98,160.44 198.85,160.11 198.65,159.78 198.39,159.45 198.07,159.13 197.66,158.80 197.19,158.47 196.67,158.14 196.09,157.81 195.43,157.48 194.73,157.16 193.98,156.83 193.18,156.50 192.33,156.17 191.44,155.84 190.51,155.52 189.54,155.19 188.54,154.86 187.52,154.53 186.47,154.20 185.39,153.87 184.29,153.55 183.18,153.22 182.06,152.89 180.93,152.56 179.79,152.23 178.65,151.90 177.50,151.58 176.36,151.25 175.22,150.92 174.09,150.59 172.97,150.26 171.85,149.94 170.74,149.61 169.65,149.28 168.57,148.95 167.50,148.62 166.45,148.29 165.41,147.97 164.39,147.64 163.38,147.31 162.39,146.98 161.41,146.65 160.45,146.32 159.50,146.00 158.56,145.67 157.64,145.34 156.72,145.01 155.82,144.68 154.92,144.36 154.03,144.03 153.15,143.70 152.28,143.37 151.40,143.04 150.53,142.71 149.66,142.39 148.79,142.06 147.92,141.73 147.04,141.40 146.16,141.07 145.28,140.74 144.39,140.42 143.49,140.09 142.59,139.76 141.68,139.43 140.75,139.10 139.82,138.78 138.89,138.45 137.94,138.12 136.98,137.79 136.02,137.46 135.04,137.13 134.06,136.81 133.07,136.48 132.08,136.15 131.08,135.82 130.08,135.49 129.07,135.16 128.07,134.84 127.06,134.51 126.05,134.18 125.05,133.85 124.05,133.52 123.06,133.20 122.07,132.87 121.09,132.54 120.13,132.21 119.18,131.88 118.23,131.55 117.30,131.23 116.40,130.90 115.50,130.57 114.63,130.24 113.77,129.91 112.94,129.58 112.13,129.26 111.34,128.93 110.58,128.60 109.84,128.27 109.12,127.94 108.42,127.62 107.76,127.29 107.13,126.96 106.51,126.63 105.93,126.30 105.37,125.97 104.84,125.65 104.33,125.32 103.86,124.99 103.41,124.66 102.99,124.33 102.58,124.00 102.22,123.68 101.88,123.35 101.56,123.02 101.26,122.69 101.00,122.36 100.76,122.04 100.54,121.71 100.35,121.38 100.19,121.05 100.05,120.72 99.92,120.39 99.83,120.07 99.76,119.74 99.71,119.41 99.68,119.08 99.67,118.75 99.69,118.42 99.72,118.10 99.77,117.77 99.84,117.44 99.93,117.11 100.03,116.78 100.15,116.46 100.28,116.13 100.42,115.80 100.58,115.47 100.75,115.14 100.92,114.81 101.10,114.49 101.29,114.16 101.49,113.83 101.68,113.50 101.88,113.17 102.07,112.84 102.26,112.52 102.45,112.19 102.64,111.86 102.81,111.53 102.97,111.20 103.13,110.88 103.27,110.55 103.40,110.22 103.51,109.89 103.60,109.56 103.68,109.23 103.73,108.91 103.77,108.58 103.79,108.25 103.78,107.92 103.75,107.59 103.69,107.26 103.62,106.94 103.51,106.61 103.38,106.28 103.23,105.95 103.06,105.62 102.85,105.30 102.63,104.97 102.38,104.64 102.10,104.31 101.81,103.98 101.49,103.65 101.15,103.33 100.79,103.00 100.41,102.67 100.01,102.34 99.60,102.01 99.16,101.68 98.71,101.36 98.25,101.03 97.78,100.70 97.29,100.37 96.79,100.04 96.28,99.72 95.76,99.39 95.23,99.06 94.70,98.73 94.16,98.40 93.62,98.07 93.07,97.75 92.52,97.42 91.97,97.09 91.41,96.76 90.86,96.43 90.30,96.10 89.75,95.78 89.20,95.45 88.65,95.12 88.11,94.79 87.57,94.46 87.03,94.14 86.50,93.81 85.97,93.48 85.46,93.15 84.94,92.82 84.44,92.49 83.94,92.17 83.45,91.84 82.97,91.51 82.50,91.18 82.04,90.85 81.59,90.52 81.15,90.20 80.71,89.87 80.29,89.54 79.88,89.21 79.48,88.88 79.10,88.56 78.72,88.23 78.36,87.90 78.01,87.57 77.67,87.24 77.34,86.91 77.02,86.59 76.72,86.26 76.43,85.93 76.15,85.60 75.88,85.27 75.62,84.94 75.38,84.62 75.15,84.29 74.92,83.96 74.72,83.63 74.52,83.30 74.33,82.98 74.15,82.65 73.98,82.32 73.82,81.99 73.67,81.66 73.54,81.33 73.41,81.01 73.28,80.68 73.17,80.35 73.06,80.02 72.96,79.69 72.87,79.36 72.79,79.04 72.71,78.71 72.64,78.38 72.57,78.05 72.51,77.72 72.45,77.40 72.40,77.07 72.35,76.74 72.31,76.41 72.27,76.08 72.24,75.75 72.20,75.43 72.17,75.10 72.15,74.77 72.12,74.44 72.10,74.11 72.08,73.78 72.06,73.46 72.05,73.13 72.04,72.80 ' style='stroke-width: 0.75; stroke: #61D04F;' />
+</g>
+</svg>
diff --git a/inst/tinytest/_tinysnapshot/flip_facet_by.svg b/inst/tinytest/_tinysnapshot/flip_facet_by.svg
new file mode 100644
index 00000000..de664799
--- /dev/null
+++ b/inst/tinytest/_tinysnapshot/flip_facet_by.svg
@@ -0,0 +1,379 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' class='svglite' width='504.00pt' height='504.00pt' viewBox='0 0 504.00 504.00'>
+<defs>
+  <style type='text/css'><![CDATA[
+    .svglite line, .svglite polyline, .svglite polygon, .svglite path, .svglite rect, .svglite circle {
+      fill: none;
+      stroke: #000000;
+      stroke-linecap: round;
+      stroke-linejoin: round;
+      stroke-miterlimit: 10.00;
+    }
+    .svglite text {
+      white-space: pre;
+    }
+  ]]></style>
+</defs>
+<rect width='100%' height='100%' style='stroke: none; fill: #FFFFFF;'/>
+<defs>
+  <clipPath id='cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='504.00' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<circle cx='435.00' cy='237.60' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='435.00' cy='252.00' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='435.00' cy='266.40' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<text x='463.38' y='223.20' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='42.70px' lengthAdjust='spacingAndGlyphs'>Species</text>
+<text x='445.80' y='241.73' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='35.37px' lengthAdjust='spacingAndGlyphs'>setosa</text>
+<text x='445.80' y='256.13' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='51.36px' lengthAdjust='spacingAndGlyphs'>versicolor</text>
+<text x='445.80' y='270.53' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='44.02px' lengthAdjust='spacingAndGlyphs'>virginica</text>
+</g>
+<defs>
+  <clipPath id='cpMC4wMHw0MDkuODB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='409.80' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw0MDkuODB8MC4wMHw1MDQuMDA=)'>
+<text x='234.42' y='34.47' text-anchor='middle' style='font-size: 14.40px; font-weight: bold; font-family: "Liberation Sans";' textLength='200.35px' lengthAdjust='spacingAndGlyphs'>Flipped + facetted scatterplot</text>
+<text x='234.42' y='485.28' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='70.73px' lengthAdjust='spacingAndGlyphs'>Sepal.Length</text>
+<text transform='translate(12.96,244.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='67.39px' lengthAdjust='spacingAndGlyphs'>Petal.Length</text>
+</g>
+<defs>
+  <clipPath id='cpNTkuMDR8MTU5LjY0fDU5LjA0fDQzMC41Ng=='>
+    <rect x='59.04' y='59.04' width='100.60' height='371.52' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpNTkuMDR8MTU5LjY0fDU5LjA0fDQzMC41Ng==)'>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='67.94' y1='430.56' x2='158.50' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='67.94' y1='430.56' x2='67.94' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='80.88' y1='430.56' x2='80.88' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='93.82' y1='430.56' x2='93.82' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='106.75' y1='430.56' x2='106.75' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='119.69' y1='430.56' x2='119.69' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='132.63' y1='430.56' x2='132.63' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='145.56' y1='430.56' x2='145.56' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='158.50' y1='430.56' x2='158.50' y2='435.31' style='stroke-width: 0.75;' />
+<text x='67.94' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>4.5</text>
+<text x='93.82' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>5.5</text>
+<text x='119.69' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>6.5</text>
+<text x='145.56' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>7.5</text>
+<line x1='59.04' y1='416.80' x2='59.04' y2='66.97' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='416.80' x2='54.29' y2='416.80' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='358.49' x2='54.29' y2='358.49' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='300.19' x2='54.29' y2='300.19' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='241.88' x2='54.29' y2='241.88' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='183.58' x2='54.29' y2='183.58' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='125.27' x2='54.29' y2='125.27' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='66.97' x2='54.29' y2='66.97' style='stroke-width: 0.75;' />
+<text transform='translate(47.64,416.80) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>1</text>
+<text transform='translate(47.64,358.49) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>2</text>
+<text transform='translate(47.64,300.19) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>3</text>
+<text transform='translate(47.64,241.88) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>4</text>
+<text transform='translate(47.64,183.58) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text transform='translate(47.64,125.27) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>6</text>
+<text transform='translate(47.64,66.97) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>7</text>
+<rect x='59.04' y='43.20' width='100.60' height='15.84' style='stroke-width: 0.75; stroke: none;' />
+<text x='109.34' y='55.24' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='35.37px' lengthAdjust='spacingAndGlyphs'>setosa</text>
+<polygon points='59.04,430.56 159.64,430.56 159.64,59.04 59.04,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<g clip-path='url(#cpNTkuMDR8MTU5LjY0fDU5LjA0fDQzMC41Ng==)'>
+<line x1='55.00' y1='430.56' x2='55.00' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='80.88' y1='430.56' x2='80.88' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='106.75' y1='430.56' x2='106.75' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='132.63' y1='430.56' x2='132.63' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='158.50' y1='430.56' x2='158.50' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='416.80' x2='159.64' y2='416.80' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='358.49' x2='159.64' y2='358.49' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='300.19' x2='159.64' y2='300.19' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='241.88' x2='159.64' y2='241.88' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='183.58' x2='159.64' y2='183.58' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='125.27' x2='159.64' y2='125.27' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='66.97' x2='159.64' y2='66.97' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+</g>
+<defs>
+  <clipPath id='cpMTg0LjEyfDI4NC43Mnw1OS4wNHw0MzAuNTY='>
+    <rect x='184.12' y='59.04' width='100.60' height='371.52' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMTg0LjEyfDI4NC43Mnw1OS4wNHw0MzAuNTY=)'>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='193.02' y1='430.56' x2='283.58' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='193.02' y1='430.56' x2='193.02' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='205.96' y1='430.56' x2='205.96' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='218.90' y1='430.56' x2='218.90' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='231.83' y1='430.56' x2='231.83' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='244.77' y1='430.56' x2='244.77' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='257.71' y1='430.56' x2='257.71' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='270.65' y1='430.56' x2='270.65' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='283.58' y1='430.56' x2='283.58' y2='435.31' style='stroke-width: 0.75;' />
+<text x='193.02' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>4.5</text>
+<text x='218.90' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>5.5</text>
+<text x='244.77' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>6.5</text>
+<text x='270.65' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>7.5</text>
+<line x1='184.12' y1='416.80' x2='184.12' y2='66.97' style='stroke-width: 0.75;' />
+<line x1='184.12' y1='416.80' x2='179.37' y2='416.80' style='stroke-width: 0.75;' />
+<line x1='184.12' y1='358.49' x2='179.37' y2='358.49' style='stroke-width: 0.75;' />
+<line x1='184.12' y1='300.19' x2='179.37' y2='300.19' style='stroke-width: 0.75;' />
+<line x1='184.12' y1='241.88' x2='179.37' y2='241.88' style='stroke-width: 0.75;' />
+<line x1='184.12' y1='183.58' x2='179.37' y2='183.58' style='stroke-width: 0.75;' />
+<line x1='184.12' y1='125.27' x2='179.37' y2='125.27' style='stroke-width: 0.75;' />
+<line x1='184.12' y1='66.97' x2='179.37' y2='66.97' style='stroke-width: 0.75;' />
+<text transform='translate(172.72,416.80) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>1</text>
+<text transform='translate(172.72,358.49) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>2</text>
+<text transform='translate(172.72,300.19) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>3</text>
+<text transform='translate(172.72,241.88) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>4</text>
+<text transform='translate(172.72,183.58) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text transform='translate(172.72,125.27) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>6</text>
+<text transform='translate(172.72,66.97) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>7</text>
+<rect x='184.12' y='43.20' width='100.60' height='15.84' style='stroke-width: 0.75; stroke: none;' />
+<text x='234.42' y='55.24' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='51.36px' lengthAdjust='spacingAndGlyphs'>versicolor</text>
+<polygon points='184.12,430.56 284.72,430.56 284.72,59.04 184.12,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<g clip-path='url(#cpMTg0LjEyfDI4NC43Mnw1OS4wNHw0MzAuNTY=)'>
+<line x1='180.08' y1='430.56' x2='180.08' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='205.96' y1='430.56' x2='205.96' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='231.83' y1='430.56' x2='231.83' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='257.71' y1='430.56' x2='257.71' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='283.58' y1='430.56' x2='283.58' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='184.12' y1='416.80' x2='284.72' y2='416.80' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='184.12' y1='358.49' x2='284.72' y2='358.49' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='184.12' y1='300.19' x2='284.72' y2='300.19' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='184.12' y1='241.88' x2='284.72' y2='241.88' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='184.12' y1='183.58' x2='284.72' y2='183.58' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='184.12' y1='125.27' x2='284.72' y2='125.27' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='184.12' y1='66.97' x2='284.72' y2='66.97' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+</g>
+<defs>
+  <clipPath id='cpMzA5LjIwfDQwOS44MHw1OS4wNHw0MzAuNTY='>
+    <rect x='309.20' y='59.04' width='100.60' height='371.52' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMzA5LjIwfDQwOS44MHw1OS4wNHw0MzAuNTY=)'>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='318.10' y1='430.56' x2='408.66' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='318.10' y1='430.56' x2='318.10' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='331.04' y1='430.56' x2='331.04' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='343.98' y1='430.56' x2='343.98' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='356.91' y1='430.56' x2='356.91' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='369.85' y1='430.56' x2='369.85' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='382.79' y1='430.56' x2='382.79' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='395.73' y1='430.56' x2='395.73' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='408.66' y1='430.56' x2='408.66' y2='435.31' style='stroke-width: 0.75;' />
+<text x='318.10' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>4.5</text>
+<text x='343.98' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>5.5</text>
+<text x='369.85' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>6.5</text>
+<text x='395.73' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>7.5</text>
+<line x1='309.20' y1='416.80' x2='309.20' y2='66.97' style='stroke-width: 0.75;' />
+<line x1='309.20' y1='416.80' x2='304.45' y2='416.80' style='stroke-width: 0.75;' />
+<line x1='309.20' y1='358.49' x2='304.45' y2='358.49' style='stroke-width: 0.75;' />
+<line x1='309.20' y1='300.19' x2='304.45' y2='300.19' style='stroke-width: 0.75;' />
+<line x1='309.20' y1='241.88' x2='304.45' y2='241.88' style='stroke-width: 0.75;' />
+<line x1='309.20' y1='183.58' x2='304.45' y2='183.58' style='stroke-width: 0.75;' />
+<line x1='309.20' y1='125.27' x2='304.45' y2='125.27' style='stroke-width: 0.75;' />
+<line x1='309.20' y1='66.97' x2='304.45' y2='66.97' style='stroke-width: 0.75;' />
+<text transform='translate(297.80,416.80) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>1</text>
+<text transform='translate(297.80,358.49) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>2</text>
+<text transform='translate(297.80,300.19) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>3</text>
+<text transform='translate(297.80,241.88) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>4</text>
+<text transform='translate(297.80,183.58) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text transform='translate(297.80,125.27) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>6</text>
+<text transform='translate(297.80,66.97) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>7</text>
+<rect x='309.20' y='43.20' width='100.60' height='15.84' style='stroke-width: 0.75; stroke: none;' />
+<text x='359.50' y='55.24' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='44.02px' lengthAdjust='spacingAndGlyphs'>virginica</text>
+<polygon points='309.20,430.56 409.80,430.56 409.80,59.04 309.20,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<g clip-path='url(#cpMzA5LjIwfDQwOS44MHw1OS4wNHw0MzAuNTY=)'>
+<line x1='305.17' y1='430.56' x2='305.17' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='331.04' y1='430.56' x2='331.04' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='356.91' y1='430.56' x2='356.91' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='382.79' y1='430.56' x2='382.79' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='408.66' y1='430.56' x2='408.66' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='309.20' y1='416.80' x2='409.80' y2='416.80' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='309.20' y1='358.49' x2='409.80' y2='358.49' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='309.20' y1='300.19' x2='409.80' y2='300.19' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='309.20' y1='241.88' x2='409.80' y2='241.88' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='309.20' y1='183.58' x2='409.80' y2='183.58' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='309.20' y1='125.27' x2='409.80' y2='125.27' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='309.20' y1='66.97' x2='409.80' y2='66.97' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+</g>
+<g clip-path='url(#cpNTkuMDR8MTU5LjY0fDU5LjA0fDQzMC41Ng==)'>
+<circle cx='83.47' cy='393.48' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='78.29' cy='393.48' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='73.12' cy='399.31' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='70.53' cy='387.65' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='80.88' cy='393.48' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='91.23' cy='375.99' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='70.53' cy='393.48' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='80.88' cy='387.65' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='65.35' cy='393.48' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='78.29' cy='387.65' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='91.23' cy='387.65' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='75.70' cy='381.82' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='75.70' cy='393.48' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='62.77' cy='410.97' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='101.58' cy='405.14' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='98.99' cy='387.65' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='91.23' cy='399.31' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='83.47' cy='393.48' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='98.99' cy='375.99' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='83.47' cy='387.65' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='91.23' cy='375.99' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='83.47' cy='387.65' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='70.53' cy='416.80' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='83.47' cy='375.99' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='75.70' cy='364.33' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='80.88' cy='381.82' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='80.88' cy='381.82' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='86.05' cy='387.65' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='86.05' cy='393.48' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='73.12' cy='381.82' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='75.70' cy='381.82' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='91.23' cy='387.65' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='86.05' cy='387.65' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='93.82' cy='393.48' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='78.29' cy='387.65' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='80.88' cy='405.14' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='93.82' cy='399.31' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='78.29' cy='393.48' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='65.35' cy='399.31' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='83.47' cy='387.65' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='80.88' cy='399.31' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='67.94' cy='399.31' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='65.35' cy='399.31' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='80.88' cy='381.82' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='83.47' cy='364.33' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='75.70' cy='393.48' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='83.47' cy='381.82' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='70.53' cy='393.48' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='88.64' cy='387.65' r='1.78' style='stroke-width: 0.75;' />
+<circle cx='80.88' cy='393.48' r='1.78' style='stroke-width: 0.75;' />
+</g>
+<g clip-path='url(#cpMTg0LjEyfDI4NC43Mnw1OS4wNHw0MzAuNTY=)'>
+</g>
+<g clip-path='url(#cpMzA5LjIwfDQwOS44MHw1OS4wNHw0MzAuNTY=)'>
+</g>
+<g clip-path='url(#cpNTkuMDR8MTU5LjY0fDU5LjA0fDQzMC41Ng==)'>
+</g>
+<g clip-path='url(#cpMTg0LjEyfDI4NC43Mnw1OS4wNHw0MzAuNTY=)'>
+<circle cx='257.71' cy='201.07' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='242.18' cy='212.73' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='255.12' cy='189.41' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='218.90' cy='241.88' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='244.77' cy='206.90' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='224.07' cy='212.73' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='239.60' cy='201.07' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='203.37' cy='282.70' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='247.36' cy='206.90' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='211.13' cy='247.72' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='205.96' cy='271.04' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='229.25' cy='230.22' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='231.83' cy='241.88' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='234.42' cy='201.07' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='221.48' cy='265.21' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='249.95' cy='218.56' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='221.48' cy='212.73' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='226.66' cy='236.05' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='237.01' cy='212.73' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='221.48' cy='247.72' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='229.25' cy='195.24' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='234.42' cy='241.88' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='239.60' cy='189.41' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='234.42' cy='201.07' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='242.18' cy='224.39' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='247.36' cy='218.56' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='252.53' cy='195.24' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='249.95' cy='183.58' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='231.83' cy='212.73' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='224.07' cy='271.04' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='218.90' cy='253.55' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='218.90' cy='259.38' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='226.66' cy='247.72' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='231.83' cy='177.75' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='216.31' cy='212.73' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='231.83' cy='212.73' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='249.95' cy='201.07' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='239.60' cy='218.56' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='221.48' cy='236.05' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='218.90' cy='241.88' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='218.90' cy='218.56' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='234.42' cy='206.90' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='226.66' cy='241.88' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='205.96' cy='282.70' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='221.48' cy='230.22' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='224.07' cy='230.22' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='224.07' cy='230.22' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='237.01' cy='224.39' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='208.55' cy='300.19' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='224.07' cy='236.05' r='1.78' style='stroke-width: 0.75; stroke: #DF536B;' />
+</g>
+<g clip-path='url(#cpMzA5LjIwfDQwOS44MHw1OS4wNHw0MzAuNTY=)'>
+</g>
+<g clip-path='url(#cpNTkuMDR8MTU5LjY0fDU5LjA0fDQzMC41Ng==)'>
+</g>
+<g clip-path='url(#cpMTg0LjEyfDI4NC43Mnw1OS4wNHw0MzAuNTY=)'>
+</g>
+<g clip-path='url(#cpMzA5LjIwfDQwOS44MHw1OS4wNHw0MzAuNTY=)'>
+<circle cx='364.68' cy='125.27' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='351.74' cy='177.75' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='385.38' cy='131.11' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='364.68' cy='148.60' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='369.85' cy='136.94' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='398.31' cy='90.29' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='328.45' cy='212.73' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='390.55' cy='107.78' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='375.03' cy='136.94' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='387.96' cy='119.44' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='369.85' cy='177.75' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='367.26' cy='166.09' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='377.61' cy='154.43' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='349.15' cy='183.58' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='351.74' cy='177.75' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='367.26' cy='166.09' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='369.85' cy='154.43' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='400.90' cy='84.46' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='400.90' cy='72.80' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='356.91' cy='183.58' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='380.20' cy='142.77' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='346.56' cy='189.41' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='400.90' cy='84.46' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='364.68' cy='189.41' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='375.03' cy='142.77' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='387.96' cy='125.27' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='362.09' cy='195.24' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='359.50' cy='189.41' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='367.26' cy='148.60' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='387.96' cy='136.94' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='393.14' cy='119.44' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='406.08' cy='101.95' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='367.26' cy='148.60' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='364.68' cy='177.75' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='359.50' cy='148.60' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='400.90' cy='119.44' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='364.68' cy='148.60' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='367.26' cy='154.43' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='356.91' cy='195.24' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='380.20' cy='160.26' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='375.03' cy='148.60' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='380.20' cy='177.75' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='351.74' cy='177.75' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='377.61' cy='131.11' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='375.03' cy='142.77' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='375.03' cy='171.92' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='364.68' cy='183.58' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='369.85' cy='171.92' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='362.09' cy='160.26' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='354.33' cy='177.75' r='1.78' style='stroke-width: 0.75; stroke: #61D04F;' />
+</g>
+<defs>
+  <clipPath id='cpMTI5Ljk1fDM0OS41OHwxMDguMTN8MzM3Ljgz'>
+    <rect x='129.95' y='108.13' width='219.63' height='229.70' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMTI5Ljk1fDM0OS41OHwxMDguMTN8MzM3Ljgz)'>
+</g>
+</svg>
diff --git a/inst/tinytest/_tinysnapshot/flip_hist.svg b/inst/tinytest/_tinysnapshot/flip_hist.svg
new file mode 100644
index 00000000..5db4c7d6
--- /dev/null
+++ b/inst/tinytest/_tinysnapshot/flip_hist.svg
@@ -0,0 +1,124 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' class='svglite' width='504.00pt' height='504.00pt' viewBox='0 0 504.00 504.00'>
+<defs>
+  <style type='text/css'><![CDATA[
+    .svglite line, .svglite polyline, .svglite polygon, .svglite path, .svglite rect, .svglite circle {
+      fill: none;
+      stroke: #000000;
+      stroke-linecap: round;
+      stroke-linejoin: round;
+      stroke-miterlimit: 10.00;
+    }
+    .svglite text {
+      white-space: pre;
+    }
+  ]]></style>
+</defs>
+<rect width='100%' height='100%' style='stroke: none; fill: #FFFFFF;'/>
+<defs>
+  <clipPath id='cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='504.00' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<rect x='426.63' y='227.43' width='16.75' height='16.75' style='stroke-width: 0.75; fill: #000000; fill-opacity: 0.20;' />
+<rect x='426.63' y='245.43' width='16.75' height='16.75' style='stroke-width: 0.75; stroke: #DF536B; fill: #DF536B; fill-opacity: 0.20;' />
+<rect x='426.63' y='263.43' width='16.75' height='16.75' style='stroke-width: 0.75; stroke: #61D04F; fill: #61D04F; fill-opacity: 0.20;' />
+<text x='463.38' y='216.00' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='42.70px' lengthAdjust='spacingAndGlyphs'>Species</text>
+<text x='445.80' y='239.93' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='35.37px' lengthAdjust='spacingAndGlyphs'>setosa</text>
+<text x='445.80' y='257.93' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='51.36px' lengthAdjust='spacingAndGlyphs'>versicolor</text>
+<text x='445.80' y='275.93' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='44.02px' lengthAdjust='spacingAndGlyphs'>virginica</text>
+</g>
+<defs>
+  <clipPath id='cpMC4wMHw0MDkuODB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='409.80' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw0MDkuODB8MC4wMHw1MDQuMDA=)'>
+<text x='234.42' y='34.47' text-anchor='middle' style='font-size: 14.40px; font-weight: bold; font-family: "Liberation Sans";' textLength='124.73px' lengthAdjust='spacingAndGlyphs'>Flipped histogram</text>
+<text x='234.42' y='485.28' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='56.71px' lengthAdjust='spacingAndGlyphs'>Frequency</text>
+<text transform='translate(12.96,244.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='67.39px' lengthAdjust='spacingAndGlyphs'>Petal.Length</text>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='72.03' y1='430.56' x2='335.37' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='72.03' y1='430.56' x2='72.03' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='159.81' y1='430.56' x2='159.81' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='247.59' y1='430.56' x2='247.59' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='335.37' y1='430.56' x2='335.37' y2='437.76' style='stroke-width: 0.75;' />
+<text x='72.03' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>0</text>
+<text x='159.81' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='247.59' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>20</text>
+<text x='335.37' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>30</text>
+<line x1='59.04' y1='416.80' x2='59.04' y2='72.80' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='416.80' x2='51.84' y2='416.80' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='359.47' x2='51.84' y2='359.47' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='302.13' x2='51.84' y2='302.13' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='244.80' x2='51.84' y2='244.80' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='187.47' x2='51.84' y2='187.47' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='130.13' x2='51.84' y2='130.13' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='72.80' x2='51.84' y2='72.80' style='stroke-width: 0.75;' />
+<text transform='translate(41.76,416.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>1</text>
+<text transform='translate(41.76,359.47) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>2</text>
+<text transform='translate(41.76,302.13) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>3</text>
+<text transform='translate(41.76,244.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>4</text>
+<text transform='translate(41.76,187.47) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text transform='translate(41.76,130.13) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>6</text>
+<text transform='translate(41.76,72.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>7</text>
+<polygon points='59.04,430.56 409.80,430.56 409.80,59.04 59.04,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpNTkuMDR8NDA5LjgwfDU5LjA0fDQzMC41Ng=='>
+    <rect x='59.04' y='59.04' width='350.76' height='371.52' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpNTkuMDR8NDA5LjgwfDU5LjA0fDQzMC41Ng==)'>
+<line x1='72.03' y1='430.56' x2='72.03' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='159.81' y1='430.56' x2='159.81' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='247.59' y1='430.56' x2='247.59' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='335.37' y1='430.56' x2='335.37' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='423.14' y1='430.56' x2='423.14' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='416.80' x2='409.80' y2='416.80' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='359.47' x2='409.80' y2='359.47' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='302.13' x2='409.80' y2='302.13' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='244.80' x2='409.80' y2='244.80' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='187.47' x2='409.80' y2='187.47' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='130.13' x2='409.80' y2='130.13' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='72.80' x2='409.80' y2='72.80' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<rect x='72.03' y='388.13' width='324.78' height='28.67' style='stroke-width: 0.75; fill: #000000; fill-opacity: 0.20;' />
+<rect x='72.03' y='359.47' width='114.11' height='28.67' style='stroke-width: 0.75; fill: #000000; fill-opacity: 0.20;' />
+<rect x='72.03' y='330.80' width='0.00' height='28.67' style='stroke-width: 0.75; fill: #000000; fill-opacity: 0.20;' />
+<rect x='72.03' y='302.13' width='0.00' height='28.67' style='stroke-width: 0.75; fill: #000000; fill-opacity: 0.20;' />
+<rect x='72.03' y='273.47' width='0.00' height='28.67' style='stroke-width: 0.75; fill: #000000; fill-opacity: 0.20;' />
+<rect x='72.03' y='244.80' width='0.00' height='28.67' style='stroke-width: 0.75; fill: #000000; fill-opacity: 0.20;' />
+<rect x='72.03' y='216.13' width='0.00' height='28.67' style='stroke-width: 0.75; fill: #000000; fill-opacity: 0.20;' />
+<rect x='72.03' y='187.47' width='0.00' height='28.67' style='stroke-width: 0.75; fill: #000000; fill-opacity: 0.20;' />
+<rect x='72.03' y='158.80' width='0.00' height='28.67' style='stroke-width: 0.75; fill: #000000; fill-opacity: 0.20;' />
+<rect x='72.03' y='130.13' width='0.00' height='28.67' style='stroke-width: 0.75; fill: #000000; fill-opacity: 0.20;' />
+<rect x='72.03' y='101.47' width='0.00' height='28.67' style='stroke-width: 0.75; fill: #000000; fill-opacity: 0.20;' />
+<rect x='72.03' y='72.80' width='0.00' height='28.67' style='stroke-width: 0.75; fill: #000000; fill-opacity: 0.20;' />
+<rect x='72.03' y='388.13' width='0.00' height='28.67' style='stroke-width: 0.75; stroke: #DF536B; fill: #DF536B; fill-opacity: 0.20;' />
+<rect x='72.03' y='359.47' width='0.00' height='28.67' style='stroke-width: 0.75; stroke: #DF536B; fill: #DF536B; fill-opacity: 0.20;' />
+<rect x='72.03' y='330.80' width='0.00' height='28.67' style='stroke-width: 0.75; stroke: #DF536B; fill: #DF536B; fill-opacity: 0.20;' />
+<rect x='72.03' y='302.13' width='8.78' height='28.67' style='stroke-width: 0.75; stroke: #DF536B; fill: #DF536B; fill-opacity: 0.20;' />
+<rect x='72.03' y='273.47' width='35.11' height='28.67' style='stroke-width: 0.75; stroke: #DF536B; fill: #DF536B; fill-opacity: 0.20;' />
+<rect x='72.03' y='244.80' width='96.56' height='28.67' style='stroke-width: 0.75; stroke: #DF536B; fill: #DF536B; fill-opacity: 0.20;' />
+<rect x='72.03' y='216.13' width='175.56' height='28.67' style='stroke-width: 0.75; stroke: #DF536B; fill: #DF536B; fill-opacity: 0.20;' />
+<rect x='72.03' y='187.47' width='114.11' height='28.67' style='stroke-width: 0.75; stroke: #DF536B; fill: #DF536B; fill-opacity: 0.20;' />
+<rect x='72.03' y='158.80' width='8.78' height='28.67' style='stroke-width: 0.75; stroke: #DF536B; fill: #DF536B; fill-opacity: 0.20;' />
+<rect x='72.03' y='130.13' width='0.00' height='28.67' style='stroke-width: 0.75; stroke: #DF536B; fill: #DF536B; fill-opacity: 0.20;' />
+<rect x='72.03' y='101.47' width='0.00' height='28.67' style='stroke-width: 0.75; stroke: #DF536B; fill: #DF536B; fill-opacity: 0.20;' />
+<rect x='72.03' y='72.80' width='0.00' height='28.67' style='stroke-width: 0.75; stroke: #DF536B; fill: #DF536B; fill-opacity: 0.20;' />
+<rect x='72.03' y='388.13' width='0.00' height='28.67' style='stroke-width: 0.75; stroke: #61D04F; fill: #61D04F; fill-opacity: 0.20;' />
+<rect x='72.03' y='359.47' width='0.00' height='28.67' style='stroke-width: 0.75; stroke: #61D04F; fill: #61D04F; fill-opacity: 0.20;' />
+<rect x='72.03' y='330.80' width='0.00' height='28.67' style='stroke-width: 0.75; stroke: #61D04F; fill: #61D04F; fill-opacity: 0.20;' />
+<rect x='72.03' y='302.13' width='0.00' height='28.67' style='stroke-width: 0.75; stroke: #61D04F; fill: #61D04F; fill-opacity: 0.20;' />
+<rect x='72.03' y='273.47' width='0.00' height='28.67' style='stroke-width: 0.75; stroke: #61D04F; fill: #61D04F; fill-opacity: 0.20;' />
+<rect x='72.03' y='244.80' width='0.00' height='28.67' style='stroke-width: 0.75; stroke: #61D04F; fill: #61D04F; fill-opacity: 0.20;' />
+<rect x='72.03' y='216.13' width='8.78' height='28.67' style='stroke-width: 0.75; stroke: #61D04F; fill: #61D04F; fill-opacity: 0.20;' />
+<rect x='72.03' y='187.47' width='70.22' height='28.67' style='stroke-width: 0.75; stroke: #61D04F; fill: #61D04F; fill-opacity: 0.20;' />
+<rect x='72.03' y='158.80' width='140.45' height='28.67' style='stroke-width: 0.75; stroke: #61D04F; fill: #61D04F; fill-opacity: 0.20;' />
+<rect x='72.03' y='130.13' width='140.45' height='28.67' style='stroke-width: 0.75; stroke: #61D04F; fill: #61D04F; fill-opacity: 0.20;' />
+<rect x='72.03' y='101.47' width='43.89' height='28.67' style='stroke-width: 0.75; stroke: #61D04F; fill: #61D04F; fill-opacity: 0.20;' />
+<rect x='72.03' y='72.80' width='35.11' height='28.67' style='stroke-width: 0.75; stroke: #61D04F; fill: #61D04F; fill-opacity: 0.20;' />
+</g>
+</svg>
diff --git a/inst/tinytest/_tinysnapshot/flip_p.svg b/inst/tinytest/_tinysnapshot/flip_p.svg
new file mode 100644
index 00000000..24df48b8
--- /dev/null
+++ b/inst/tinytest/_tinysnapshot/flip_p.svg
@@ -0,0 +1,246 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' class='svglite' width='504.00pt' height='504.00pt' viewBox='0 0 504.00 504.00'>
+<defs>
+  <style type='text/css'><![CDATA[
+    .svglite line, .svglite polyline, .svglite polygon, .svglite path, .svglite rect, .svglite circle {
+      fill: none;
+      stroke: #000000;
+      stroke-linecap: round;
+      stroke-linejoin: round;
+      stroke-miterlimit: 10.00;
+    }
+    .svglite text {
+      white-space: pre;
+    }
+  ]]></style>
+</defs>
+<rect width='100%' height='100%' style='stroke: none; fill: #FFFFFF;'/>
+<defs>
+  <clipPath id='cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='504.00' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<circle cx='435.00' cy='237.60' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='435.00' cy='252.00' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='435.00' cy='266.40' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<text x='463.38' y='223.20' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='42.70px' lengthAdjust='spacingAndGlyphs'>Species</text>
+<text x='445.80' y='241.73' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='35.37px' lengthAdjust='spacingAndGlyphs'>setosa</text>
+<text x='445.80' y='256.13' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='51.36px' lengthAdjust='spacingAndGlyphs'>versicolor</text>
+<text x='445.80' y='270.53' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='44.02px' lengthAdjust='spacingAndGlyphs'>virginica</text>
+</g>
+<defs>
+  <clipPath id='cpMC4wMHw0MDkuODB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='409.80' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw0MDkuODB8MC4wMHw1MDQuMDA=)'>
+<text x='234.42' y='34.47' text-anchor='middle' style='font-size: 14.40px; font-weight: bold; font-family: "Liberation Sans";' textLength='128.75px' lengthAdjust='spacingAndGlyphs'>Flipped scatterplot</text>
+<text x='234.42' y='485.28' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='70.73px' lengthAdjust='spacingAndGlyphs'>Sepal.Length</text>
+<text transform='translate(12.96,244.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='67.39px' lengthAdjust='spacingAndGlyphs'>Petal.Length</text>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='90.07' y1='430.56' x2='405.83' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='90.07' y1='430.56' x2='90.07' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='135.18' y1='430.56' x2='135.18' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='180.29' y1='430.56' x2='180.29' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='225.40' y1='430.56' x2='225.40' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='270.51' y1='430.56' x2='270.51' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='315.62' y1='430.56' x2='315.62' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='360.72' y1='430.56' x2='360.72' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='405.83' y1='430.56' x2='405.83' y2='437.76' style='stroke-width: 0.75;' />
+<text x='90.07' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>4.5</text>
+<text x='135.18' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>5.0</text>
+<text x='180.29' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>5.5</text>
+<text x='225.40' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>6.0</text>
+<text x='270.51' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>6.5</text>
+<text x='315.62' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>7.0</text>
+<text x='360.72' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>7.5</text>
+<text x='405.83' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>8.0</text>
+<line x1='59.04' y1='416.80' x2='59.04' y2='66.97' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='416.80' x2='51.84' y2='416.80' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='358.49' x2='51.84' y2='358.49' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='300.19' x2='51.84' y2='300.19' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='241.88' x2='51.84' y2='241.88' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='183.58' x2='51.84' y2='183.58' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='125.27' x2='51.84' y2='125.27' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='66.97' x2='51.84' y2='66.97' style='stroke-width: 0.75;' />
+<text transform='translate(41.76,416.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>1</text>
+<text transform='translate(41.76,358.49) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>2</text>
+<text transform='translate(41.76,300.19) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>3</text>
+<text transform='translate(41.76,241.88) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>4</text>
+<text transform='translate(41.76,183.58) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text transform='translate(41.76,125.27) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>6</text>
+<text transform='translate(41.76,66.97) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>7</text>
+<polygon points='59.04,430.56 409.80,430.56 409.80,59.04 59.04,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpNTkuMDR8NDA5LjgwfDU5LjA0fDQzMC41Ng=='>
+    <rect x='59.04' y='59.04' width='350.76' height='371.52' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpNTkuMDR8NDA5LjgwfDU5LjA0fDQzMC41Ng==)'>
+<line x1='44.97' y1='430.56' x2='44.97' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='135.18' y1='430.56' x2='135.18' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='225.40' y1='430.56' x2='225.40' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='315.62' y1='430.56' x2='315.62' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='405.83' y1='430.56' x2='405.83' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='416.80' x2='409.80' y2='416.80' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='358.49' x2='409.80' y2='358.49' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='300.19' x2='409.80' y2='300.19' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='241.88' x2='409.80' y2='241.88' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='183.58' x2='409.80' y2='183.58' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='125.27' x2='409.80' y2='125.27' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='66.97' x2='409.80' y2='66.97' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<circle cx='144.20' cy='393.48' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='126.16' cy='393.48' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='108.12' cy='399.31' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='99.10' cy='387.65' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='135.18' cy='393.48' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='171.27' cy='375.99' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='99.10' cy='393.48' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='135.18' cy='387.65' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='81.05' cy='393.48' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='126.16' cy='387.65' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='171.27' cy='387.65' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='117.14' cy='381.82' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='117.14' cy='393.48' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='72.03' cy='410.97' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='207.36' cy='405.14' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='198.33' cy='387.65' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='171.27' cy='399.31' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='144.20' cy='393.48' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='198.33' cy='375.99' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='144.20' cy='387.65' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='171.27' cy='375.99' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='144.20' cy='387.65' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='99.10' cy='416.80' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='144.20' cy='375.99' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='117.14' cy='364.33' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='135.18' cy='381.82' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='135.18' cy='381.82' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='153.23' cy='387.65' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='153.23' cy='393.48' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='108.12' cy='381.82' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='117.14' cy='381.82' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='171.27' cy='387.65' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='153.23' cy='387.65' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='180.29' cy='393.48' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='126.16' cy='387.65' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='135.18' cy='405.14' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='180.29' cy='399.31' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='126.16' cy='393.48' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='81.05' cy='399.31' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='144.20' cy='387.65' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='135.18' cy='399.31' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='90.07' cy='399.31' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='81.05' cy='399.31' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='135.18' cy='381.82' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='144.20' cy='364.33' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='117.14' cy='393.48' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='144.20' cy='381.82' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='99.10' cy='393.48' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='162.25' cy='387.65' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='135.18' cy='393.48' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='315.62' cy='201.07' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='261.49' cy='212.73' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='306.59' cy='189.41' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='180.29' cy='241.88' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='270.51' cy='206.90' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='198.33' cy='212.73' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='252.46' cy='201.07' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='126.16' cy='282.70' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='279.53' cy='206.90' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='153.23' cy='247.72' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='135.18' cy='271.04' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='216.38' cy='230.22' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='225.40' cy='241.88' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='234.42' cy='201.07' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='189.31' cy='265.21' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='288.55' cy='218.56' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='189.31' cy='212.73' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='207.36' cy='236.05' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='243.44' cy='212.73' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='189.31' cy='247.72' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='216.38' cy='195.24' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='234.42' cy='241.88' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='252.46' cy='189.41' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='234.42' cy='201.07' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='261.49' cy='224.39' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='279.53' cy='218.56' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='297.57' cy='195.24' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='288.55' cy='183.58' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='225.40' cy='212.73' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='198.33' cy='271.04' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='180.29' cy='253.55' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='180.29' cy='259.38' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='207.36' cy='247.72' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='225.40' cy='177.75' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='171.27' cy='212.73' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='225.40' cy='212.73' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='288.55' cy='201.07' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='252.46' cy='218.56' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='189.31' cy='236.05' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='180.29' cy='241.88' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='180.29' cy='218.56' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='234.42' cy='206.90' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='207.36' cy='241.88' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='135.18' cy='282.70' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='189.31' cy='230.22' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='198.33' cy='230.22' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='198.33' cy='230.22' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='243.44' cy='224.39' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='144.20' cy='300.19' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='198.33' cy='236.05' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='252.46' cy='125.27' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='207.36' cy='177.75' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='324.64' cy='131.11' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='252.46' cy='148.60' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='270.51' cy='136.94' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='369.75' cy='90.29' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='126.16' cy='212.73' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='342.68' cy='107.78' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='288.55' cy='136.94' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='333.66' cy='119.44' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='270.51' cy='177.75' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='261.49' cy='166.09' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='297.57' cy='154.43' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='198.33' cy='183.58' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='207.36' cy='177.75' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='261.49' cy='166.09' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='270.51' cy='154.43' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='378.77' cy='84.46' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='378.77' cy='72.80' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='225.40' cy='183.58' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='306.59' cy='142.77' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='189.31' cy='189.41' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='378.77' cy='84.46' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='252.46' cy='189.41' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='288.55' cy='142.77' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='333.66' cy='125.27' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='243.44' cy='195.24' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='234.42' cy='189.41' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='261.49' cy='148.60' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='333.66' cy='136.94' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='351.70' cy='119.44' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='396.81' cy='101.95' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='261.49' cy='148.60' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='252.46' cy='177.75' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='234.42' cy='148.60' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='378.77' cy='119.44' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='252.46' cy='148.60' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='261.49' cy='154.43' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='225.40' cy='195.24' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='306.59' cy='160.26' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='288.55' cy='148.60' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='306.59' cy='177.75' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='207.36' cy='177.75' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='297.57' cy='131.11' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='288.55' cy='142.77' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='288.55' cy='171.92' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='252.46' cy='183.58' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='270.51' cy='171.92' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='243.44' cy='160.26' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='216.38' cy='177.75' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+</g>
+</svg>
diff --git a/inst/tinytest/_tinysnapshot/flip_p_logx.svg b/inst/tinytest/_tinysnapshot/flip_p_logx.svg
new file mode 100644
index 00000000..7dd32f5b
--- /dev/null
+++ b/inst/tinytest/_tinysnapshot/flip_p_logx.svg
@@ -0,0 +1,246 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' class='svglite' width='504.00pt' height='504.00pt' viewBox='0 0 504.00 504.00'>
+<defs>
+  <style type='text/css'><![CDATA[
+    .svglite line, .svglite polyline, .svglite polygon, .svglite path, .svglite rect, .svglite circle {
+      fill: none;
+      stroke: #000000;
+      stroke-linecap: round;
+      stroke-linejoin: round;
+      stroke-miterlimit: 10.00;
+    }
+    .svglite text {
+      white-space: pre;
+    }
+  ]]></style>
+</defs>
+<rect width='100%' height='100%' style='stroke: none; fill: #FFFFFF;'/>
+<defs>
+  <clipPath id='cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='504.00' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<circle cx='435.00' cy='237.60' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='435.00' cy='252.00' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='435.00' cy='266.40' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<text x='463.38' y='223.20' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='42.70px' lengthAdjust='spacingAndGlyphs'>Species</text>
+<text x='445.80' y='241.73' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='35.37px' lengthAdjust='spacingAndGlyphs'>setosa</text>
+<text x='445.80' y='256.13' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='51.36px' lengthAdjust='spacingAndGlyphs'>versicolor</text>
+<text x='445.80' y='270.53' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='44.02px' lengthAdjust='spacingAndGlyphs'>virginica</text>
+</g>
+<defs>
+  <clipPath id='cpMC4wMHw0MDkuODB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='409.80' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw0MDkuODB8MC4wMHw1MDQuMDA=)'>
+<text x='234.42' y='34.47' text-anchor='middle' style='font-size: 14.40px; font-weight: bold; font-family: "Liberation Sans";' textLength='175.92px' lengthAdjust='spacingAndGlyphs'>Flipped scatterplot (log x)</text>
+<text x='234.42' y='485.28' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='70.73px' lengthAdjust='spacingAndGlyphs'>Sepal.Length</text>
+<text transform='translate(12.96,244.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='67.39px' lengthAdjust='spacingAndGlyphs'>Petal.Length</text>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='90.07' y1='430.56' x2='405.83' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='90.07' y1='430.56' x2='90.07' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='135.18' y1='430.56' x2='135.18' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='180.29' y1='430.56' x2='180.29' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='225.40' y1='430.56' x2='225.40' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='270.51' y1='430.56' x2='270.51' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='315.62' y1='430.56' x2='315.62' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='360.72' y1='430.56' x2='360.72' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='405.83' y1='430.56' x2='405.83' y2='437.76' style='stroke-width: 0.75;' />
+<text x='90.07' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>4.5</text>
+<text x='135.18' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>5.0</text>
+<text x='180.29' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>5.5</text>
+<text x='225.40' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>6.0</text>
+<text x='270.51' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>6.5</text>
+<text x='315.62' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>7.0</text>
+<text x='360.72' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>7.5</text>
+<text x='405.83' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>8.0</text>
+<line x1='59.04' y1='416.80' x2='59.04' y2='70.24' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='416.80' x2='51.84' y2='416.80' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='293.35' x2='51.84' y2='293.35' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='221.14' x2='51.84' y2='221.14' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='169.90' x2='51.84' y2='169.90' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='130.16' x2='51.84' y2='130.16' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='97.69' x2='51.84' y2='97.69' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='70.24' x2='51.84' y2='70.24' style='stroke-width: 0.75;' />
+<text transform='translate(41.76,416.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>1</text>
+<text transform='translate(41.76,293.35) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>2</text>
+<text transform='translate(41.76,221.14) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>3</text>
+<text transform='translate(41.76,169.90) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>4</text>
+<text transform='translate(41.76,130.16) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text transform='translate(41.76,97.69) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>6</text>
+<text transform='translate(41.76,70.24) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>7</text>
+<polygon points='59.04,430.56 409.80,430.56 409.80,59.04 59.04,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpNTkuMDR8NDA5LjgwfDU5LjA0fDQzMC41Ng=='>
+    <rect x='59.04' y='59.04' width='350.76' height='371.52' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpNTkuMDR8NDA5LjgwfDU5LjA0fDQzMC41Ng==)'>
+<line x1='44.97' y1='430.56' x2='44.97' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='135.18' y1='430.56' x2='135.18' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='225.40' y1='430.56' x2='225.40' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='315.62' y1='430.56' x2='315.62' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='405.83' y1='430.56' x2='405.83' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='416.80' x2='409.80' y2='416.80' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='293.35' x2='409.80' y2='293.35' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='221.14' x2='409.80' y2='221.14' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='169.90' x2='409.80' y2='169.90' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='130.16' x2='409.80' y2='130.16' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='97.69' x2='409.80' y2='97.69' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='70.24' x2='409.80' y2='70.24' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<circle cx='144.20' cy='356.87' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='126.16' cy='356.87' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='108.12' cy='370.07' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='99.10' cy='344.59' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='135.18' cy='356.87' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='171.27' cy='322.30' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='99.10' cy='356.87' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='135.18' cy='344.59' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='81.05' cy='356.87' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='126.16' cy='344.59' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='171.27' cy='344.59' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='117.14' cy='333.09' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='117.14' cy='356.87' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='72.03' cy='399.83' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='207.36' cy='384.33' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='198.33' cy='344.59' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='171.27' cy='370.07' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='144.20' cy='356.87' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='198.33' cy='322.30' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='144.20' cy='344.59' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='171.27' cy='322.30' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='144.20' cy='344.59' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='99.10' cy='416.80' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='144.20' cy='322.30' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='117.14' cy='302.49' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='135.18' cy='333.09' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='135.18' cy='333.09' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='153.23' cy='344.59' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='153.23' cy='356.87' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='108.12' cy='333.09' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='117.14' cy='333.09' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='171.27' cy='344.59' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='153.23' cy='344.59' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='180.29' cy='356.87' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='126.16' cy='344.59' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='135.18' cy='384.33' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='180.29' cy='370.07' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='126.16' cy='356.87' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='81.05' cy='370.07' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='144.20' cy='344.59' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='135.18' cy='370.07' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='90.07' cy='370.07' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='81.05' cy='370.07' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='135.18' cy='333.09' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='144.20' cy='302.49' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='117.14' cy='356.87' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='144.20' cy='333.09' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='99.10' cy='356.87' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='162.25' cy='344.59' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='135.18' cy='356.87' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='315.62' cy='141.18' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='261.49' cy='148.93' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='306.59' cy='133.76' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='180.29' cy='169.90' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='270.51' cy='145.01' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='198.33' cy='148.93' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='252.46' cy='141.18' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='126.16' cy='204.16' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='279.53' cy='145.01' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='153.23' cy='174.41' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='135.18' cy='193.69' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='216.38' cy='161.21' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='225.40' cy='169.90' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='234.42' cy='141.18' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='189.31' cy='188.67' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='288.55' cy='152.93' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='189.31' cy='148.93' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='207.36' cy='165.51' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='243.44' cy='148.93' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='189.31' cy='174.41' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='216.38' cy='137.43' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='234.42' cy='169.90' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='252.46' cy='133.76' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='234.42' cy='141.18' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='261.49' cy='157.02' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='279.53' cy='152.93' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='297.57' cy='137.43' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='288.55' cy='130.16' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='225.40' cy='148.93' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='198.33' cy='193.69' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='180.29' cy='179.04' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='180.29' cy='183.79' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='207.36' cy='174.41' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='225.40' cy='126.64' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='171.27' cy='148.93' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='225.40' cy='148.93' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='288.55' cy='141.18' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='252.46' cy='152.93' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='189.31' cy='165.51' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='180.29' cy='169.90' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='180.29' cy='152.93' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='234.42' cy='145.01' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='207.36' cy='169.90' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='135.18' cy='204.16' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='189.31' cy='161.21' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='198.33' cy='161.21' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='198.33' cy='161.21' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='243.44' cy='157.02' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='144.20' cy='221.14' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='198.33' cy='165.51' r='2.70' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='252.46' cy='97.69' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='207.36' cy='126.64' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='324.64' cy='100.68' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='252.46' cy='109.98' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='270.51' cy='103.73' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='369.75' cy='80.72' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='126.16' cy='148.93' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='342.68' cy='89.00' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='288.55' cy='103.73' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='333.66' cy='94.75' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='270.51' cy='126.64' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='261.49' cy='119.78' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='297.57' cy='113.19' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='198.33' cy='130.16' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='207.36' cy='126.64' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='261.49' cy='119.78' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='270.51' cy='113.19' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='378.77' cy='78.04' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='378.77' cy='72.80' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='225.40' cy='130.16' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='306.59' cy='106.83' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='189.31' cy='133.76' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='378.77' cy='78.04' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='252.46' cy='133.76' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='288.55' cy='106.83' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='333.66' cy='97.69' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='243.44' cy='137.43' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='234.42' cy='133.76' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='261.49' cy='109.98' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='333.66' cy='103.73' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='351.70' cy='94.75' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='396.81' cy='86.20' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='261.49' cy='109.98' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='252.46' cy='126.64' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='234.42' cy='109.98' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='378.77' cy='94.75' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='252.46' cy='109.98' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='261.49' cy='113.19' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='225.40' cy='137.43' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='306.59' cy='116.46' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='288.55' cy='109.98' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='306.59' cy='126.64' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='207.36' cy='126.64' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='297.57' cy='100.68' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='288.55' cy='106.83' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='288.55' cy='123.18' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='252.46' cy='130.16' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='270.51' cy='123.18' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='243.44' cy='116.46' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='216.38' cy='126.64' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
+</g>
+</svg>
diff --git a/inst/tinytest/_tinysnapshot/flip_pointrange.svg b/inst/tinytest/_tinysnapshot/flip_pointrange.svg
new file mode 100644
index 00000000..118f9c78
--- /dev/null
+++ b/inst/tinytest/_tinysnapshot/flip_pointrange.svg
@@ -0,0 +1,70 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' class='svglite' width='504.00pt' height='504.00pt' viewBox='0 0 504.00 504.00'>
+<defs>
+  <style type='text/css'><![CDATA[
+    .svglite line, .svglite polyline, .svglite polygon, .svglite path, .svglite rect, .svglite circle {
+      fill: none;
+      stroke: #000000;
+      stroke-linecap: round;
+      stroke-linejoin: round;
+      stroke-miterlimit: 10.00;
+    }
+    .svglite text {
+      white-space: pre;
+    }
+  ]]></style>
+</defs>
+<rect width='100%' height='100%' style='stroke: none; fill: #FFFFFF;'/>
+<defs>
+  <clipPath id='cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='504.00' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<text x='266.40' y='34.47' text-anchor='middle' style='font-size: 14.40px; font-weight: bold; font-family: "Liberation Sans";' textLength='111.13px' lengthAdjust='spacingAndGlyphs'>Flipped coefplot</text>
+<text x='266.40' y='485.28' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='45.36px' lengthAdjust='spacingAndGlyphs'>estimate</text>
+<text x='60.79' y='456.48' text-anchor='middle' style='font-size: 9.00px; font-family: "Liberation Sans";' textLength='13.00px' lengthAdjust='spacingAndGlyphs'>-10</text>
+<text x='149.16' y='456.48' text-anchor='middle' style='font-size: 9.00px; font-family: "Liberation Sans";' textLength='5.00px' lengthAdjust='spacingAndGlyphs'>0</text>
+<text x='237.52' y='456.48' text-anchor='middle' style='font-size: 9.00px; font-family: "Liberation Sans";' textLength='10.01px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='325.88' y='456.48' text-anchor='middle' style='font-size: 9.00px; font-family: "Liberation Sans";' textLength='10.01px' lengthAdjust='spacingAndGlyphs'>20</text>
+<text x='414.24' y='456.48' text-anchor='middle' style='font-size: 9.00px; font-family: "Liberation Sans";' textLength='10.01px' lengthAdjust='spacingAndGlyphs'>30</text>
+<text x='44.64' y='419.90' text-anchor='end' style='font-size: 9.00px; font-family: "Liberation Sans";' textLength='41.00px' lengthAdjust='spacingAndGlyphs'>(Intercept)</text>
+<text x='44.64' y='351.10' text-anchor='end' style='font-size: 9.00px; font-family: "Liberation Sans";' textLength='9.00px' lengthAdjust='spacingAndGlyphs'>wt</text>
+<text x='44.64' y='282.30' text-anchor='end' style='font-size: 9.00px; font-family: "Liberation Sans";' textLength='23.01px' lengthAdjust='spacingAndGlyphs'>gear4</text>
+<text x='44.64' y='213.50' text-anchor='end' style='font-size: 9.00px; font-family: "Liberation Sans";' textLength='23.01px' lengthAdjust='spacingAndGlyphs'>gear5</text>
+<text x='44.64' y='144.70' text-anchor='end' style='font-size: 9.00px; font-family: "Liberation Sans";' textLength='34.51px' lengthAdjust='spacingAndGlyphs'>wt:gear4</text>
+<text x='44.64' y='75.90' text-anchor='end' style='font-size: 9.00px; font-family: "Liberation Sans";' textLength='34.51px' lengthAdjust='spacingAndGlyphs'>wt:gear5</text>
+</g>
+<defs>
+  <clipPath id='cpNTkuMDR8NDczLjc2fDU5LjA0fDQzMC41Ng=='>
+    <rect x='59.04' y='59.04' width='414.72' height='371.52' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpNTkuMDR8NDczLjc2fDU5LjA0fDQzMC41Ng==)'>
+<line x1='60.79' y1='430.56' x2='60.79' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='149.16' y1='430.56' x2='149.16' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='237.52' y1='430.56' x2='237.52' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='325.88' y1='430.56' x2='325.88' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='414.24' y1='430.56' x2='414.24' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='502.61' y1='430.56' x2='502.61' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='416.80' x2='473.76' y2='416.80' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='348.00' x2='473.76' y2='348.00' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='279.20' x2='473.76' y2='279.20' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='210.40' x2='473.76' y2='210.40' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='141.60' x2='473.76' y2='141.60' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='72.80' x2='473.76' y2='72.80' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='341.73' y1='416.80' x2='458.40' y2='416.80' style='stroke-width: 0.75;' />
+<line x1='106.58' y1='348.00' x2='135.94' y2='348.00' style='stroke-width: 0.75;' />
+<line x1='191.07' y1='279.20' x2='356.38' y2='279.20' style='stroke-width: 0.75;' />
+<line x1='178.29' y1='210.40' x2='370.41' y2='210.40' style='stroke-width: 0.75;' />
+<line x1='90.12' y1='141.60' x2='142.68' y2='141.60' style='stroke-width: 0.75;' />
+<line x1='74.40' y1='72.80' x2='137.50' y2='72.80' style='stroke-width: 0.75;' />
+<circle cx='400.06' cy='416.80' r='2.70' style='stroke-width: 0.75; fill: #000000;' />
+<circle cx='121.26' cy='348.00' r='2.70' style='stroke-width: 0.75; fill: #000000;' />
+<circle cx='273.73' cy='279.20' r='2.70' style='stroke-width: 0.75; fill: #000000;' />
+<circle cx='274.35' cy='210.40' r='2.70' style='stroke-width: 0.75; fill: #000000;' />
+<circle cx='116.40' cy='141.60' r='2.70' style='stroke-width: 0.75; fill: #000000;' />
+<circle cx='105.95' cy='72.80' r='2.70' style='stroke-width: 0.75; fill: #000000;' />
+<line x1='149.16' y1='430.56' x2='149.16' y2='59.04' style='stroke-width: 0.75; stroke: #FF69B4; stroke-dasharray: 1.00,3.00,4.00,3.00;' />
+</g>
+</svg>
diff --git a/inst/tinytest/_tinysnapshot/flip_ribbon_pred.svg b/inst/tinytest/_tinysnapshot/flip_ribbon_pred.svg
new file mode 100644
index 00000000..b614d709
--- /dev/null
+++ b/inst/tinytest/_tinysnapshot/flip_ribbon_pred.svg
@@ -0,0 +1,126 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' class='svglite' width='504.00pt' height='504.00pt' viewBox='0 0 504.00 504.00'>
+<defs>
+  <style type='text/css'><![CDATA[
+    .svglite line, .svglite polyline, .svglite polygon, .svglite path, .svglite rect, .svglite circle {
+      fill: none;
+      stroke: #000000;
+      stroke-linecap: round;
+      stroke-linejoin: round;
+      stroke-miterlimit: 10.00;
+    }
+    .svglite text {
+      white-space: pre;
+    }
+  ]]></style>
+</defs>
+<rect width='100%' height='100%' style='stroke: none; fill: #FFFFFF;'/>
+<defs>
+  <clipPath id='cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='504.00' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='466.19' y1='235.80' x2='479.69' y2='235.80' style='stroke-width: 0.75;' />
+<line x1='466.19' y1='253.80' x2='479.69' y2='253.80' style='stroke-width: 0.75; stroke: #DF536B;' />
+<line x1='466.19' y1='271.80' x2='479.69' y2='271.80' style='stroke-width: 0.75; stroke: #61D04F;' />
+<rect x='464.56' y='227.43' width='16.75' height='16.75' style='stroke-width: 0.00; fill: #000000; fill-opacity: 0.20;' />
+<rect x='464.56' y='245.43' width='16.75' height='16.75' style='stroke-width: 0.00; stroke: #DF536B; fill: #DF536B; fill-opacity: 0.20;' />
+<rect x='464.56' y='263.43' width='16.75' height='16.75' style='stroke-width: 0.00; stroke: #61D04F; fill: #61D04F; fill-opacity: 0.20;' />
+<text x='482.75' y='216.00' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='14.67px' lengthAdjust='spacingAndGlyphs'>cyl</text>
+<text x='490.49' y='239.93' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>4</text>
+<text x='490.49' y='257.93' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>6</text>
+<text x='490.49' y='275.93' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>8</text>
+</g>
+<defs>
+  <clipPath id='cpMC4wMHw0NDguNTV8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='448.55' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw0NDguNTV8MC4wMHw1MDQuMDA=)'>
+<text x='253.79' y='34.47' text-anchor='middle' style='font-size: 14.40px; font-weight: bold; font-family: "Liberation Sans";' textLength='155.10px' lengthAdjust='spacingAndGlyphs'>Flipped prediction plot</text>
+<text x='253.79' y='485.28' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='9.33px' lengthAdjust='spacingAndGlyphs'>fit</text>
+<text transform='translate(12.96,244.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='12.00px' lengthAdjust='spacingAndGlyphs'>wt</text>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='105.73' y1='430.56' x2='416.70' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='105.73' y1='430.56' x2='105.73' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='183.47' y1='430.56' x2='183.47' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='261.22' y1='430.56' x2='261.22' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='338.96' y1='430.56' x2='338.96' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='416.70' y1='430.56' x2='416.70' y2='437.76' style='stroke-width: 0.75;' />
+<text x='105.73' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='183.47' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='261.22' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>20</text>
+<text x='338.96' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>25</text>
+<text x='416.70' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>30</text>
+<line x1='59.04' y1='373.96' x2='59.04' y2='110.09' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='373.96' x2='51.84' y2='373.96' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='286.01' x2='51.84' y2='286.01' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='198.05' x2='51.84' y2='198.05' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='110.09' x2='51.84' y2='110.09' style='stroke-width: 0.75;' />
+<text transform='translate(41.76,373.96) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>2</text>
+<text transform='translate(41.76,286.01) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>3</text>
+<text transform='translate(41.76,198.05) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>4</text>
+<text transform='translate(41.76,110.09) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>5</text>
+<polygon points='59.04,430.56 448.55,430.56 448.55,59.04 59.04,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpNTkuMDR8NDQ4LjU1fDU5LjA0fDQzMC41Ng=='>
+    <rect x='59.04' y='59.04' width='389.51' height='371.52' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpNTkuMDR8NDQ4LjU1fDU5LjA0fDQzMC41Ng==)'>
+<line x1='27.99' y1='430.56' x2='27.99' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='105.73' y1='430.56' x2='105.73' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='183.47' y1='430.56' x2='183.47' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='261.22' y1='430.56' x2='261.22' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='338.96' y1='430.56' x2='338.96' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='416.70' y1='430.56' x2='416.70' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='494.45' y1='430.56' x2='494.45' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='461.92' x2='448.55' y2='461.92' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='373.96' x2='448.55' y2='373.96' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='286.01' x2='448.55' y2='286.01' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='198.05' x2='448.55' y2='198.05' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='110.09' x2='448.55' y2='110.09' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='22.14' x2='448.55' y2='22.14' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<polygon points='372.57,416.80 368.89,407.83 360.46,388.48 356.35,379.68 347.29,361.65 344.46,356.37 338.55,345.82 330.96,333.06 312.92,305.36 289.60,272.81 286.98,269.30 352.53,269.30 353.90,272.81 367.46,305.36 380.82,333.06 387.69,345.82 393.74,356.37 396.89,361.65 408.27,379.68 414.13,388.48 427.62,407.83 434.12,416.80 ' style='stroke-width: 0.75; stroke: none; fill: #000000; fill-opacity: 0.20;' />
+<polyline points='403.34,416.80 398.26,407.83 387.29,388.48 382.31,379.68 372.09,361.65 369.10,356.37 363.12,345.82 355.89,333.06 340.19,305.36 321.75,272.81 319.76,269.30 ' style='stroke-width: 0.75;' />
+<polygon points='248.98,319.43 242.63,306.24 237.96,297.00 221.47,267.10 209.39,247.31 209.39,247.31 208.27,245.55 271.99,245.55 272.87,247.31 272.87,247.31 283.21,267.10 300.61,297.00 306.41,306.24 315.01,319.43 ' style='stroke-width: 0.75; stroke: none; fill: #DF536B; fill-opacity: 0.20;' />
+<polyline points='282.00,319.43 274.52,306.24 269.29,297.00 252.34,267.10 241.13,247.31 241.13,247.31 240.13,245.55 ' style='stroke-width: 0.75; stroke: #DF536B;' />
+<polygon points='196.86,271.06 187.51,247.75 187.33,247.31 184.30,240.27 182.34,235.87 182.34,235.87 175.74,221.80 173.56,217.40 170.87,212.12 170.64,211.68 159.67,191.89 85.60,88.10 78.99,79.75 73.47,72.80 154.56,72.80 156.91,79.75 159.78,88.10 203.33,191.89 214.79,211.68 215.06,212.12 218.35,217.40 221.15,221.80 230.50,235.87 230.50,235.87 233.53,240.27 238.48,247.31 238.79,247.75 255.86,271.06 ' style='stroke-width: 0.75; stroke: none; fill: #61D04F; fill-opacity: 0.20;' />
+<polyline points='226.36,271.06 213.15,247.75 212.90,247.31 208.91,240.27 206.42,235.87 206.42,235.87 198.45,221.80 195.96,217.40 192.97,212.12 192.72,211.68 181.50,191.89 122.69,88.10 117.95,79.75 114.01,72.80 ' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='304.75' cy='345.82' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #000000;' />
+<circle cx='329.63' cy='269.30' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #000000;' />
+<circle cx='304.75' cy='272.81' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #000000;' />
+<circle cx='454.02' cy='356.37' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #000000;' />
+<circle cx='422.92' cy='407.83' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #000000;' />
+<circle cx='477.34' cy='388.48' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #000000;' />
+<circle cx='284.54' cy='333.06' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #000000;' />
+<circle cx='374.72' cy='379.68' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #000000;' />
+<circle cx='354.51' cy='361.65' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #000000;' />
+<circle cx='422.92' cy='416.80' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #000000;' />
+<circle cx='282.99' cy='305.36' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #000000;' />
+<circle cx='276.77' cy='319.43' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #DF536B;' />
+<circle cx='276.77' cy='297.00' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #DF536B;' />
+<circle cx='282.99' cy='267.10' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #DF536B;' />
+<circle cx='231.68' cy='245.55' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #DF536B;' />
+<circle cx='248.78' cy='247.31' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #DF536B;' />
+<circle cx='227.01' cy='247.31' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #DF536B;' />
+<circle cx='256.55' cy='306.24' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #DF536B;' />
+<circle cx='241.00' cy='247.31' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #61D04F;' />
+<circle cx='172.59' cy='235.87' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #61D04F;' />
+<circle cx='205.24' cy='191.89' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #61D04F;' />
+<circle cx='219.24' cy='221.80' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #61D04F;' />
+<circle cx='186.58' cy='217.40' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #61D04F;' />
+<circle cx='111.95' cy='88.10' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #61D04F;' />
+<circle cx='111.95' cy='72.80' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #61D04F;' />
+<circle cx='178.81' cy='79.75' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #61D04F;' />
+<circle cx='191.25' cy='240.27' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #61D04F;' />
+<circle cx='186.58' cy='247.75' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #61D04F;' />
+<circle cx='157.04' cy='212.12' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #61D04F;' />
+<circle cx='248.78' cy='211.68' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #61D04F;' />
+<circle cx='195.91' cy='271.06' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #61D04F;' />
+<circle cx='183.47' cy='235.87' r='2.70' style='stroke-width: 0.75; stroke: none; fill: #61D04F;' />
+</g>
+</svg>
diff --git a/inst/tinytest/test-flip.R b/inst/tinytest/test-flip.R
new file mode 100644
index 00000000..367a903b
--- /dev/null
+++ b/inst/tinytest/test-flip.R
@@ -0,0 +1,108 @@
+source("helpers.R")
+using("tinysnapshot")
+
+# selection of flipped plot types
+
+f = function () {
+  tinyplot(
+    Sepal.Length ~ Petal.Length | Species, data = iris,
+    grid = TRUE,
+    flip = TRUE,
+    main = "Flipped scatterplot"
+  )
+}
+expect_snapshot_plot(f, label = "flip_p")
+
+f = function () {
+  tinyplot(
+    Sepal.Length ~ Petal.Length | Species, data = iris,
+    grid = TRUE,
+    flip = TRUE,
+    log = "x",
+    main = "Flipped scatterplot (log x)"
+  )
+}
+expect_snapshot_plot(f, label = "flip_p_logx")
+
+f = function () {
+  tinyplot(
+    Sepal.Length ~ Petal.Length | Species, data = iris,
+    facet = "by",
+    grid = TRUE,
+    flip = TRUE,
+    main = "Flipped + facetted scatterplot"
+  )
+}
+expect_snapshot_plot(f, label = "flip_facet_by")
+
+f = function () {
+  tinyplot(
+    ~ Petal.Length | Species, data = iris,
+    type = "histogram",
+    grid = TRUE,
+    flip = TRUE,
+    main = "Flipped histogram"
+  )
+}
+expect_snapshot_plot(f, label = "flip_hist")
+
+f = function () {
+  tinyplot(
+    ~ Petal.Length | Species, data = iris,
+    type = "density", fill = 0.5,
+    grid = TRUE,
+    flip = TRUE,
+    main = "Flipped histogram"
+  )
+}
+expect_snapshot_plot(f, label = "flip_density")
+
+# flipped boxplot (equivalent to horizontal = TRUE)
+f = function() {
+  plt(count ~ spray, data = InsectSprays, type = "boxplot", flip = TRUE)
+}
+expect_snapshot_plot(f, label = "flip_boxplot")
+
+f = function() {
+  m = transform(mtcars, gear = factor(gear))
+  mod = lm(mpg ~ wt*gear, m)
+  coefs = data.frame(names(coef(mod)), coef(mod), confint(mod))
+  coefs = setNames(coefs, c("term", "estimate", "lwr", "upr"))
+  op = tpar(las = 1, cex.axis = 0.75)
+  with(
+    coefs,
+    tinyplot(
+      term, estimate, ymin = lwr, ymax = upr,
+      type = "pointrange",
+      pch = 19,
+      flip = TRUE,
+      grid = TRUE, axes = "l", xlab = NA,
+      main = "Flipped coefplot"
+    )
+  )
+  abline(v = 0, lty  = 4, col = "hotpink")
+  tpar(op)
+}
+expect_snapshot_plot(f, label = "flip_pointrange")
+
+f = function() {
+  m = transform(mtcars, cyl = factor(cyl))
+  pred = predict(lm(mpg ~ wt + cyl, m), interval = "confidence")
+  m = cbind(m, pred)
+  with(
+    m,
+    tinyplot(
+      wt, fit, ymin = lwr, ymax = upr, by = cyl,
+      type = "ribbon",
+      flip = TRUE,
+      grid = TRUE,
+      main = "Flipped prediction plot"
+    )
+  )
+  with(
+    m,
+    tinyplot(wt, mpg, by = cyl, pch = 16, flip = TRUE, add = TRUE)
+  )
+}
+expect_snapshot_plot(f, label = "flip_ribbon_pred")
+

From 843a70a9a2fd2237afa1d43b13356d2ebe94a500 Mon Sep 17 00:00:00 2001
From: Grant McDermott <grant.mcdermott@gmail.com>
Date: Fri, 4 Oct 2024 13:22:41 -0700
Subject: [PATCH 05/72] rm unused args

---
 R/draw_elements.R | 2 --
 R/tinyplot.R      | 3 +--
 2 files changed, 1 insertion(+), 4 deletions(-)

diff --git a/R/draw_elements.R b/R/draw_elements.R
index 46d104e2..a79a8628 100644
--- a/R/draw_elements.R
+++ b/R/draw_elements.R
@@ -22,8 +22,6 @@ draw_elements = function(
     facet_by,
     split_data,
     i = 1,
-    xlvls,     # do we still need this?
-    lgnd_labs, # ditto?
     x_by = FALSE,
     flip = FALSE
     ) {
diff --git a/R/tinyplot.R b/R/tinyplot.R
index f5c8dbce..1b589fb0 100644
--- a/R/tinyplot.R
+++ b/R/tinyplot.R
@@ -640,6 +640,7 @@ tinyplot.default = function(
       if (is.null(ylab)) ylab = "Frequency"
     }
   }
+  
 
   if (is.null(xlab)) xlab = x_dep
   if (is.null(ylab)) ylab = y_dep
@@ -1070,8 +1071,6 @@ tinyplot.default = function(
         facet_by = facet_by,
         split_data = split_data,
         i = i,
-        xlvls = xlvls,
-        lgnd_labs = lgnd_labs,
         x_by = x_by,
         flip = flip
       )

From e3fe93ea9e9a3fcaa3ab3b0aaa6ad401aab156a0 Mon Sep 17 00:00:00 2001
From: Grant McDermott <grant.mcdermott@gmail.com>
Date: Fri, 4 Oct 2024 13:23:32 -0700
Subject: [PATCH 06/72] better grid logic re-using xlim

- exception for date-alike classes
---
 R/facet.R | 31 ++++++++++++++++++++-----------
 1 file changed, 20 insertions(+), 11 deletions(-)

diff --git a/R/facet.R b/R/facet.R
index d37c1459..93283b26 100644
--- a/R/facet.R
+++ b/R/facet.R
@@ -413,24 +413,33 @@ draw_facet_window = function(grid, ...) {
           if (isTRUE(grid)) {
             gnx = gny = NULL
             if (!par("xlog")) {
-              # abline(v = pretty(extendrange(x)), col = "lightgray", lty = "dotted", lwd = par("lwd"))
-              if (isFALSE(flip)) {
-                # would be nice to use xlim but fails for date types
-                abline(v = pretty(extendrange(x)), col = "lightgray", lty = "dotted", lwd = par("lwd"))
-                # abline(v = pretty(xlim), col = "lightgray", lty = "dotted", lwd = par("lwd"))
+              if (!inherits(x, c("POSIXt", "Date"))) {
+                xg = pretty(xlim)
               } else {
-                abline(v = pretty(xlim), col = "lightgray", lty = "dotted", lwd = par("lwd"))
+                # Catch for datetime (since xlim has been coerced to numeric)
+                tz = attributes(x)[["tzone"]]
+                if (inherits(x, "POSIXt")) {
+                  xg = pretty(as.POSIXct(extendrange(xlim), tz = tz))
+                } else {
+                  xg = pretty(as.Date(round(extendrange(xlim)), tz = tz))
+                }
               }
+              abline(v = xg, col = "lightgray", lty = "dotted", lwd = par("lwd"))
               gnx = NA
             }
             if (!par("ylog")) {
-              # abline(h = pretty(extendrange(c(y, ymin, ymax))), col = "lightgray", lty = "dotted", lwd = par("lwd"))
-              if (isFALSE(flip)) {
-                abline(h = pretty(extendrange(c(y, ymin, ymax))), col = "lightgray", lty = "dotted", lwd = par("lwd"))
-                # abline(h = pretty(ylim), col = "lightgray", lty = "dotted", lwd = par("lwd"))
+              if (!inherits(y, c("POSIXt", "Date"))) {
+                yg = pretty(ylim)
               } else {
-                abline(h = pretty(ylim), col = "lightgray", lty = "dotted", lwd = par("lwd"))
+                # Catch for datetime (since xlim has been coerced to numeric)
+                tz = attributes(y)[["tzone"]]
+                if (inherits(x, "POSIXt")) {
+                  yg = pretty(as.POSIXct(extendrange(ylim), tz = tz))
+                } else {
+                  yg = pretty(as.Date(extendrange(ylim), tz = tz))
+                }
               }
+              abline(h = yg, col = "lightgray", lty = "dotted", lwd = par("lwd"))
               gny = NA
             }
             grid(nx = gnx, ny = gny)

From bec1f883bdba45bc58c6f5dafd8213520ff47ac9 Mon Sep 17 00:00:00 2001
From: Grant McDermott <grant.mcdermott@gmail.com>
Date: Fri, 4 Oct 2024 16:13:51 -0700
Subject: [PATCH 07/72] use datapoints x and y instead

- fixes labelling issue for dates etc. when flipped
---
 R/tinyplot.R | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/R/tinyplot.R b/R/tinyplot.R
index 1b589fb0..2e1cac65 100644
--- a/R/tinyplot.R
+++ b/R/tinyplot.R
@@ -968,9 +968,13 @@ tinyplot.default = function(
     frame.plot = frame.plot, grid = grid,
     has_legend = has_legend, log = log,
     oxaxis = oxaxis, oyaxis = oyaxis, type = type,
-    x = x, xaxt = xaxt, xlabs = xlabs, xlim = xlim,
+    # x = x,
+    x = datapoints$x,
+    xaxt = xaxt, xlabs = xlabs, xlim = xlim,
     xmax = datapoints$xmax, xmin = datapoints$xmin,
-    y = y, yaxt = yaxt, ylabs = ylabs ,ylim = ylim,
+    # y = y,
+    y = datapoints$y,
+    yaxt = yaxt, ylabs = ylabs ,ylim = ylim,
     ymax = datapoints$ymax, ymin = datapoints$ymin,
     flip = flip
   )

From 9e18dd803206f479550c2b0e851cff7a74615608 Mon Sep 17 00:00:00 2001
From: Grant McDermott <grant.mcdermott@gmail.com>
Date: Fri, 4 Oct 2024 16:22:12 -0700
Subject: [PATCH 08/72] add flipped datetime snapshot

---
 .../tinytest/_tinysnapshot/flip_date_time.svg | 79 +++++++++++++++++++
 inst/tinytest/test-flip.R                     |  7 ++
 2 files changed, 86 insertions(+)
 create mode 100644 inst/tinytest/_tinysnapshot/flip_date_time.svg

diff --git a/inst/tinytest/_tinysnapshot/flip_date_time.svg b/inst/tinytest/_tinysnapshot/flip_date_time.svg
new file mode 100644
index 00000000..38449100
--- /dev/null
+++ b/inst/tinytest/_tinysnapshot/flip_date_time.svg
@@ -0,0 +1,79 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' class='svglite' width='504.00pt' height='504.00pt' viewBox='0 0 504.00 504.00'>
+<defs>
+  <style type='text/css'><![CDATA[
+    .svglite line, .svglite polyline, .svglite polygon, .svglite path, .svglite rect, .svglite circle {
+      fill: none;
+      stroke: #000000;
+      stroke-linecap: round;
+      stroke-linejoin: round;
+      stroke-miterlimit: 10.00;
+    }
+    .svglite text {
+      white-space: pre;
+    }
+  ]]></style>
+</defs>
+<rect width='100%' height='100%' style='stroke: none; fill: #FFFFFF;'/>
+<defs>
+  <clipPath id='cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='504.00' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<text x='266.40' y='485.28' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.00px' lengthAdjust='spacingAndGlyphs'>y</text>
+<text transform='translate(12.96,244.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='26.02px' lengthAdjust='spacingAndGlyphs'>x_dtt</text>
+<line x1='117.07' y1='430.56' x2='458.40' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='117.07' y1='430.56' x2='117.07' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='202.40' y1='430.56' x2='202.40' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='287.73' y1='430.56' x2='287.73' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='373.07' y1='430.56' x2='373.07' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='458.40' y1='430.56' x2='458.40' y2='437.76' style='stroke-width: 0.75;' />
+<text x='117.07' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>2</text>
+<text x='202.40' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>4</text>
+<text x='287.73' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>6</text>
+<text x='373.07' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>8</text>
+<text x='458.40' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>10</text>
+<line x1='59.04' y1='378.58' x2='59.04' y2='72.80' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='378.58' x2='51.84' y2='378.58' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='302.13' x2='51.84' y2='302.13' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='225.69' x2='51.84' y2='225.69' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='149.24' x2='51.84' y2='149.24' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='72.80' x2='51.84' y2='72.80' style='stroke-width: 0.75;' />
+<text transform='translate(41.76,378.58) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='36.04px' lengthAdjust='spacingAndGlyphs'>Jan 02</text>
+<text transform='translate(41.76,302.13) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='36.04px' lengthAdjust='spacingAndGlyphs'>Jan 04</text>
+<text transform='translate(41.76,225.69) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='36.04px' lengthAdjust='spacingAndGlyphs'>Jan 06</text>
+<text transform='translate(41.76,149.24) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='36.04px' lengthAdjust='spacingAndGlyphs'>Jan 08</text>
+<text transform='translate(41.76,72.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='36.04px' lengthAdjust='spacingAndGlyphs'>Jan 10</text>
+<polygon points='59.04,430.56 473.76,430.56 473.76,59.04 59.04,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpNTkuMDR8NDczLjc2fDU5LjA0fDQzMC41Ng=='>
+    <rect x='59.04' y='59.04' width='414.72' height='371.52' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpNTkuMDR8NDczLjc2fDU5LjA0fDQzMC41Ng==)'>
+<line x1='31.73' y1='430.56' x2='31.73' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='117.07' y1='430.56' x2='117.07' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='202.40' y1='430.56' x2='202.40' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='287.73' y1='430.56' x2='287.73' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='373.07' y1='430.56' x2='373.07' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='458.40' y1='430.56' x2='458.40' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='446.55' x2='473.76' y2='446.55' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='365.76' x2='473.76' y2='365.76' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='284.97' x2='473.76' y2='284.97' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='204.18' x2='473.76' y2='204.18' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='123.40' x2='473.76' y2='123.40' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='42.61' x2='473.76' y2='42.61' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<circle cx='74.40' cy='416.80' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='117.07' cy='378.58' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='159.73' cy='340.36' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='202.40' cy='302.13' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='245.07' cy='263.91' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='287.73' cy='225.69' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='330.40' cy='187.47' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='373.07' cy='149.24' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='415.73' cy='111.02' r='2.70' style='stroke-width: 0.75;' />
+<circle cx='458.40' cy='72.80' r='2.70' style='stroke-width: 0.75;' />
+</g>
+</svg>
diff --git a/inst/tinytest/test-flip.R b/inst/tinytest/test-flip.R
index 367a903b..bc61b65d 100644
--- a/inst/tinytest/test-flip.R
+++ b/inst/tinytest/test-flip.R
@@ -106,3 +106,10 @@ f = function() {
 }
 expect_snapshot_plot(f, label = "flip_ribbon_pred")
 
+
+f = function() {
+  x_dtt = strptime(20010101:20010110, format="%Y%m%d", tz = "UTC")
+  y = 1:10
+  tinyplot(x_dtt, y, grid = TRUE, flip = TRUE)
+}
+expect_snapshot_plot(f, label = "flip_date_time")

From 8171516ab1fc3fc1586648b909799dcc38a593a9 Mon Sep 17 00:00:00 2001
From: Grant McDermott <grant.mcdermott@gmail.com>
Date: Fri, 4 Oct 2024 16:23:57 -0700
Subject: [PATCH 09/72] clean up

---
 R/tinyplot.R | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/R/tinyplot.R b/R/tinyplot.R
index 2e1cac65..1ed8b940 100644
--- a/R/tinyplot.R
+++ b/R/tinyplot.R
@@ -968,14 +968,12 @@ tinyplot.default = function(
     frame.plot = frame.plot, grid = grid,
     has_legend = has_legend, log = log,
     oxaxis = oxaxis, oyaxis = oyaxis, type = type,
-    # x = x,
     x = datapoints$x,
-    xaxt = xaxt, xlabs = xlabs, xlim = xlim,
-    xmax = datapoints$xmax, xmin = datapoints$xmin,
-    # y = y,
     y = datapoints$y,
-    yaxt = yaxt, ylabs = ylabs ,ylim = ylim,
+    xmax = datapoints$xmax, xmin = datapoints$xmin,
     ymax = datapoints$ymax, ymin = datapoints$ymin,
+    xaxt = xaxt, xlabs = xlabs, xlim = xlim,
+    yaxt = yaxt, ylabs = ylabs, ylim = ylim,
     flip = flip
   )
   list2env(facet_window_args, environment())

From 1ad50d07d943ecd2e964dd3b5afaaa72857ba89c Mon Sep 17 00:00:00 2001
From: Grant McDermott <grant.mcdermott@gmail.com>
Date: Fri, 4 Oct 2024 17:29:27 -0700
Subject: [PATCH 10/72] simplify downstream pointrange-alike plot

- add xmin and xmax columns to upstream datapoints objects
---
 R/draw_elements.R   | 67 ++++++++++++++-------------------------------
 R/type_pointrange.R |  2 ++
 2 files changed, 22 insertions(+), 47 deletions(-)

diff --git a/R/draw_elements.R b/R/draw_elements.R
index a79a8628..f529884c 100644
--- a/R/draw_elements.R
+++ b/R/draw_elements.R
@@ -48,55 +48,28 @@ draw_elements = function(
         }
         
       } else if (type == "pointrange") {
-        if (isFALSE(flip)) {
-          segments(
-            x0 = xx,
-            y0 = yymin,
-            x1 = xx,
-            y1 = yymax,
-            col = icol,
-            # lty = ilty,
-            lwd = ilwd
-          )
-        } else (
-          segments(
-            x0 = xxmin,
-            y0 = yy,
-            x1 = xxmax,
-            y1 = yy,
-            col = icol,
-            # lty = ilty,
-            lwd = ilwd
-          )
+        segments(
+          x0 = xxmin,
+          y0 = yymin,
+          x1 = xxmax,
+          y1 = yymax,
+          col = icol,
+          # lty = ilty,
+          lwd = ilwd
         )
       } else if (type == "errorbar") {
-        if (isFALSE(flip)) {
-          arrows(
-            x0 = xx,
-            y0 = yymin,
-            x1 = xx,
-            y1 = yymax,
-            col = icol,
-            # lty = ilty,
-            lwd = ilwd,
-            length = 0.05,
-            angle = 90,
-            code = 3
-          )
-        } else {
-          arrows(
-            x0 = xxmin,
-            y0 = yy,
-            x1 = xxmax,
-            y1 = yy,
-            col = icol,
-            # lty = ilty,
-            lwd = ilwd,
-            length = 0.05,
-            angle = 90,
-            code = 3
-          )
-        }
+        arrows(
+          x0 = xxmin,
+          y0 = yymin,
+          x1 = xxmax,
+          y1 = yymax,
+          col = icol,
+          # lty = ilty,
+          lwd = ilwd,
+          length = 0.05,
+          angle = 90,
+          code = 3
+        )
       }
 
       ## now draw the points/lines/polygons/etc
diff --git a/R/type_pointrange.R b/R/type_pointrange.R
index 6947757e..7703f2ea 100644
--- a/R/type_pointrange.R
+++ b/R/type_pointrange.R
@@ -8,6 +8,8 @@ type_pointrange = function(datapoints, xlabs, ...) {
      names(xlabs) = xlvls
      datapoints$x = as.integer(datapoints$x)
  }
+ datapoints$xmin = datapoints$x
+ datapoints$xmax = datapoints$x
   out = list(
     x = datapoints$x,
     xlabs = xlabs,

From c6ebd1a1a4f5fa4faf676f1d0aa5d1bab8340399 Mon Sep 17 00:00:00 2001
From: Grant McDermott <grant.mcdermott@gmail.com>
Date: Fri, 4 Oct 2024 18:35:21 -0700
Subject: [PATCH 11/72] R v4.1.1 snapshot updates

---
 .../tinytest/_tinysnapshot/flip_date_time.svg | 12 +++---
 inst/tinytest/_tinysnapshot/flip_density.svg  | 40 +++++++++----------
 inst/tinytest/test-flip.R                     |  2 +-
 3 files changed, 27 insertions(+), 27 deletions(-)

diff --git a/inst/tinytest/_tinysnapshot/flip_date_time.svg b/inst/tinytest/_tinysnapshot/flip_date_time.svg
index 38449100..cf7869a5 100644
--- a/inst/tinytest/_tinysnapshot/flip_date_time.svg
+++ b/inst/tinytest/_tinysnapshot/flip_date_time.svg
@@ -59,12 +59,12 @@
 <line x1='287.73' y1='430.56' x2='287.73' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
 <line x1='373.07' y1='430.56' x2='373.07' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
 <line x1='458.40' y1='430.56' x2='458.40' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
-<line x1='59.04' y1='446.55' x2='473.76' y2='446.55' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
-<line x1='59.04' y1='365.76' x2='473.76' y2='365.76' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
-<line x1='59.04' y1='284.97' x2='473.76' y2='284.97' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
-<line x1='59.04' y1='204.18' x2='473.76' y2='204.18' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
-<line x1='59.04' y1='123.40' x2='473.76' y2='123.40' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
-<line x1='59.04' y1='42.61' x2='473.76' y2='42.61' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='433202.01' x2='473.76' y2='433202.01' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='433202.01' x2='473.76' y2='433202.01' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='433202.01' x2='473.76' y2='433202.01' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='433202.01' x2='473.76' y2='433202.01' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='433202.01' x2='473.76' y2='433202.01' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='433202.01' x2='473.76' y2='433202.01' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
 <circle cx='74.40' cy='416.80' r='2.70' style='stroke-width: 0.75;' />
 <circle cx='117.07' cy='378.58' r='2.70' style='stroke-width: 0.75;' />
 <circle cx='159.73' cy='340.36' r='2.70' style='stroke-width: 0.75;' />
diff --git a/inst/tinytest/_tinysnapshot/flip_density.svg b/inst/tinytest/_tinysnapshot/flip_density.svg
index 83ca9308..2caba47d 100644
--- a/inst/tinytest/_tinysnapshot/flip_density.svg
+++ b/inst/tinytest/_tinysnapshot/flip_density.svg
@@ -40,15 +40,15 @@
 <text transform='translate(12.96,244.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='227.51px' lengthAdjust='spacingAndGlyphs'>N = [50, 50, 50]   Joint Bandwidth = 0.1551</text>
 </g>
 <g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
-<line x1='71.93' y1='430.56' x2='338.69' y2='430.56' style='stroke-width: 0.75;' />
-<line x1='71.93' y1='430.56' x2='71.93' y2='437.76' style='stroke-width: 0.75;' />
-<line x1='160.85' y1='430.56' x2='160.85' y2='437.76' style='stroke-width: 0.75;' />
-<line x1='249.77' y1='430.56' x2='249.77' y2='437.76' style='stroke-width: 0.75;' />
-<line x1='338.69' y1='430.56' x2='338.69' y2='437.76' style='stroke-width: 0.75;' />
-<text x='71.93' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.0</text>
-<text x='160.85' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.5</text>
-<text x='249.77' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>1.0</text>
-<text x='338.69' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>1.5</text>
+<line x1='71.83' y1='430.56' x2='338.67' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='71.83' y1='430.56' x2='71.83' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='160.78' y1='430.56' x2='160.78' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='249.73' y1='430.56' x2='249.73' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='338.67' y1='430.56' x2='338.67' y2='437.76' style='stroke-width: 0.75;' />
+<text x='71.83' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.0</text>
+<text x='160.78' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.5</text>
+<text x='249.73' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>1.0</text>
+<text x='338.67' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>1.5</text>
 <line x1='59.04' y1='393.37' x2='59.04' y2='91.19' style='stroke-width: 0.75;' />
 <line x1='59.04' y1='393.37' x2='51.84' y2='393.37' style='stroke-width: 0.75;' />
 <line x1='59.04' y1='343.01' x2='51.84' y2='343.01' style='stroke-width: 0.75;' />
@@ -72,11 +72,11 @@
   </clipPath>
 </defs>
 <g clip-path='url(#cpNTkuMDR8NDA3LjEwfDU5LjA0fDQzMC41Ng==)'>
-<line x1='71.93' y1='430.56' x2='71.93' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
-<line x1='160.85' y1='430.56' x2='160.85' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
-<line x1='249.77' y1='430.56' x2='249.77' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
-<line x1='338.69' y1='430.56' x2='338.69' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
-<line x1='427.61' y1='430.56' x2='427.61' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='71.83' y1='430.56' x2='71.83' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='160.78' y1='430.56' x2='160.78' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='249.73' y1='430.56' x2='249.73' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='338.67' y1='430.56' x2='338.67' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='427.62' y1='430.56' x2='427.62' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
 <line x1='59.04' y1='443.74' x2='407.10' y2='443.74' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
 <line x1='59.04' y1='393.37' x2='407.10' y2='393.37' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
 <line x1='59.04' y1='343.01' x2='407.10' y2='343.01' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
@@ -86,11 +86,11 @@
 <line x1='59.04' y1='141.56' x2='407.10' y2='141.56' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
 <line x1='59.04' y1='91.19' x2='407.10' y2='91.19' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
 <line x1='59.04' y1='40.83' x2='407.10' y2='40.83' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
-<polygon points='71.93,416.80 71.93,416.62 71.93,416.44 71.93,416.26 71.93,416.08 71.93,415.90 71.93,415.72 71.93,415.54 71.93,415.36 71.93,415.18 71.93,415.00 71.93,414.82 71.93,414.64 71.93,414.45 71.93,414.27 71.93,414.09 71.93,413.91 71.93,413.73 71.93,413.55 71.93,413.37 71.93,413.19 71.93,413.01 71.93,412.83 71.93,412.65 71.93,412.47 71.93,412.29 71.93,412.11 71.93,411.93 71.93,411.75 71.93,411.57 71.93,411.39 71.93,411.21 71.93,411.03 71.93,410.85 71.93,410.67 71.93,410.49 71.93,410.31 71.93,410.13 71.93,409.94 71.93,409.76 71.93,409.58 71.93,409.40 71.93,409.22 71.93,409.04 71.93,408.86 71.93,408.68 71.93,408.50 71.93,408.32 71.93,408.14 71.93,407.96 71.93,407.78 71.93,407.60 71.93,407.42 71.93,407.24 71.93,407.06 71.93,406.88 71.93,406.70 71.93,406.52 71.93,406.34 71.93,406.16 71.93,405.98 71.93,405.80 71.93,405.62 71.93,405.43 71.93,405.25 71.93,405.07 71.93,404.89 71.93,404.71 71.93,404.53 71.93,404.35 71.93,404.17 71.93,403.99 71.93,403.81 71.93,403.63 71.93,403.45 71.93,403.27 71.93,403.09 71.93,402.91 71.93,402.73 71.93,402.55 71.93,402.37 71.93,402.19 71.93,402.01 71.93,401.83 71.93,401.65 71.93,401.47 71.93,401.29 71.93,401.11 71.93,400.92 71.93,400.74 71.93,400.56 71.93,400.38 71.93,400.20 71.93,400.02 71.93,399.84 71.93,399.66 71.93,399.48 71.93,399.30 71.93,399.12 71.93,398.94 71.93,398.76 71.93,398.58 71.93,398.40 71.93,398.22 71.93,398.04 71.93,397.86 71.93,397.68 71.93,397.50 71.93,397.32 71.93,397.14 71.93,396.96 71.93,396.78 71.93,396.60 71.93,396.42 71.93,396.23 71.93,396.05 71.93,395.87 71.93,395.69 71.93,395.51 71.93,395.33 71.93,395.15 71.93,394.97 71.93,394.79 71.93,394.61 71.93,394.43 71.93,394.25 71.93,394.07 71.93,393.89 71.93,393.71 71.93,393.53 71.93,393.35 71.93,393.17 71.93,392.99 71.93,392.81 71.93,392.63 71.93,392.45 71.93,392.27 71.93,392.09 71.93,391.91 71.93,391.72 71.93,391.54 71.93,391.36 71.93,391.18 71.93,391.00 71.93,390.82 71.93,390.64 71.93,390.46 71.93,390.28 71.93,390.10 71.93,389.92 71.93,389.74 71.93,389.56 71.93,389.38 71.93,389.20 71.93,389.02 71.93,388.84 71.93,388.66 71.93,388.48 71.93,388.30 71.93,388.12 71.93,387.94 71.93,387.76 71.93,387.58 71.93,387.40 71.93,387.21 71.93,387.03 71.93,386.85 71.93,386.67 71.93,386.49 71.93,386.31 71.93,386.13 71.93,385.95 71.93,385.77 71.93,385.59 71.93,385.41 71.93,385.23 71.93,385.05 71.93,384.87 71.93,384.69 71.93,384.51 71.93,384.33 71.93,384.15 71.93,383.97 71.93,383.79 71.93,383.61 71.93,383.43 71.93,383.25 71.93,383.07 71.93,382.89 71.93,382.70 71.93,382.52 71.93,382.34 71.93,382.16 71.93,381.98 71.93,381.80 71.93,381.62 71.93,381.44 71.93,381.26 71.93,381.08 71.93,380.90 71.93,380.72 71.93,380.54 71.93,380.36 71.93,380.18 71.93,380.00 71.93,379.82 71.93,379.64 71.93,379.46 71.93,379.28 71.93,379.10 71.93,378.92 71.93,378.74 71.93,378.56 71.93,378.38 71.93,378.19 71.93,378.01 71.93,377.83 71.93,377.65 71.93,377.47 71.93,377.29 71.93,377.11 71.93,376.93 71.93,376.75 71.93,376.57 71.93,376.39 71.93,376.21 71.93,376.03 71.93,375.85 71.93,375.67 71.93,375.49 71.93,375.31 71.93,375.13 71.93,374.95 71.93,374.77 71.93,374.59 71.93,374.41 71.93,374.23 71.93,374.05 71.93,373.87 71.93,373.68 71.93,373.50 71.93,373.32 71.93,373.14 71.93,372.96 71.93,372.78 71.93,372.60 71.93,372.42 71.93,372.24 71.93,372.06 71.93,371.88 71.93,371.70 71.93,371.52 71.93,371.34 71.93,371.16 71.93,370.98 71.93,370.80 71.93,370.62 71.93,370.44 71.93,370.26 71.93,370.08 71.93,369.90 71.93,369.72 71.93,369.54 71.93,369.36 71.93,369.17 71.93,368.99 71.93,368.81 71.93,368.63 71.93,368.45 71.93,368.27 71.93,368.09 71.93,367.91 71.93,367.73 71.93,367.55 71.93,367.37 71.93,367.19 71.93,367.01 71.93,366.83 71.93,366.65 71.93,366.47 71.93,366.29 71.93,366.11 71.93,365.93 71.93,365.75 71.93,365.57 71.93,365.39 71.93,365.21 71.93,365.03 71.93,364.85 71.93,364.66 71.93,364.48 71.93,364.30 71.93,364.12 71.93,363.94 71.93,363.76 71.93,363.58 71.93,363.40 71.93,363.22 71.93,363.04 71.93,362.86 71.93,362.68 71.93,362.50 71.93,362.32 71.93,362.14 71.93,361.96 71.93,361.78 71.93,361.60 71.93,361.42 71.93,361.24 71.93,361.06 71.93,360.88 71.93,360.70 71.93,360.52 71.93,360.34 71.93,360.16 71.93,359.97 71.93,359.79 71.93,359.61 71.93,359.43 71.93,359.25 71.93,359.07 71.93,358.89 71.93,358.71 71.93,358.53 71.93,358.35 71.93,358.17 71.93,357.99 71.93,357.81 71.93,357.63 71.93,357.45 71.93,357.27 71.93,357.09 71.93,356.91 71.93,356.73 71.93,356.55 71.93,356.37 71.93,356.19 71.93,356.01 71.93,355.83 71.93,355.65 71.93,355.46 71.93,355.28 71.93,355.10 71.93,354.92 71.93,354.74 71.93,354.56 71.93,354.38 71.93,354.20 71.93,354.02 71.93,353.84 71.93,353.66 71.93,353.48 71.93,353.30 71.93,353.12 71.93,352.94 71.93,352.76 71.93,352.58 71.93,352.40 71.93,352.22 71.93,352.04 71.93,351.86 71.93,351.68 71.93,351.50 71.93,351.32 71.93,351.14 71.93,350.95 71.93,350.77 71.93,350.59 71.93,350.41 71.93,350.23 71.93,350.05 71.93,349.87 71.93,349.69 71.93,349.51 71.93,349.33 71.93,349.15 71.93,348.97 71.93,348.79 71.93,348.61 71.93,348.43 71.93,348.25 71.93,348.07 71.93,347.89 71.93,347.71 71.93,347.53 71.93,347.35 71.93,347.17 71.93,346.99 71.93,346.81 71.93,346.63 71.93,346.44 71.93,346.26 71.93,346.08 71.93,345.90 71.93,345.72 71.93,345.54 71.93,345.36 71.93,345.18 71.93,345.00 71.93,344.82 71.93,344.64 71.93,344.46 71.93,344.28 71.93,344.10 71.93,343.92 71.93,343.74 71.93,343.56 71.93,343.38 71.93,343.20 71.93,343.02 71.93,342.84 71.93,342.66 71.93,342.48 71.93,342.30 71.93,342.12 71.93,341.93 71.93,341.75 71.93,341.57 71.93,341.39 71.93,341.21 71.93,341.03 71.93,340.85 71.93,340.67 71.93,340.49 71.93,340.31 71.93,340.13 71.93,339.95 71.93,339.77 71.93,339.59 71.93,339.41 71.93,339.23 71.93,339.05 71.93,338.87 71.93,338.69 71.93,338.51 71.93,338.33 71.93,338.15 71.93,337.97 71.93,337.79 71.93,337.61 71.93,337.42 71.93,337.24 71.93,337.06 71.93,336.88 71.93,336.70 71.93,336.52 71.93,336.34 71.93,336.16 71.93,335.98 71.93,335.80 71.93,335.62 71.93,335.44 71.93,335.26 71.93,335.08 71.93,334.90 71.93,334.72 71.93,334.54 71.93,334.36 71.93,334.18 71.93,334.00 71.93,333.82 71.93,333.64 71.93,333.46 71.93,333.28 71.93,333.10 71.93,332.91 71.93,332.73 71.93,332.55 71.93,332.37 71.93,332.19 71.93,332.01 71.93,331.83 71.93,331.65 71.93,331.47 71.93,331.29 71.93,331.11 71.93,330.93 71.93,330.75 71.93,330.57 71.93,330.39 71.93,330.21 71.93,330.03 71.93,329.85 71.93,329.67 71.93,329.49 71.93,329.31 71.93,329.13 71.93,328.95 71.93,328.77 71.93,328.59 71.93,328.40 71.93,328.22 71.93,328.04 71.93,327.86 71.93,327.68 71.93,327.50 71.93,327.32 71.93,327.14 71.93,326.96 71.93,326.78 71.93,326.60 71.93,326.42 71.93,326.24 71.93,326.06 71.93,325.88 71.93,325.70 71.93,325.52 71.93,325.34 71.93,325.16 71.93,324.98 71.93,324.80 71.93,324.62 72.14,324.62 72.15,324.80 72.17,324.98 72.19,325.16 72.21,325.34 72.22,325.52 72.24,325.70 72.27,325.88 72.29,326.06 72.31,326.24 72.34,326.42 72.37,326.60 72.39,326.78 72.42,326.96 72.46,327.14 72.49,327.32 72.53,327.50 72.56,327.68 72.60,327.86 72.65,328.04 72.69,328.22 72.74,328.40 72.79,328.59 72.84,328.77 72.89,328.95 72.95,329.13 73.01,329.31 73.07,329.49 73.14,329.67 73.21,329.85 73.28,330.03 73.35,330.21 73.43,330.39 73.51,330.57 73.60,330.75 73.69,330.93 73.79,331.11 73.88,331.29 73.99,331.47 74.09,331.65 74.20,331.83 74.32,332.01 74.44,332.19 74.57,332.37 74.70,332.55 74.83,332.73 74.98,332.91 75.12,333.10 75.28,333.28 75.43,333.46 75.60,333.64 75.77,333.82 75.94,334.00 76.13,334.18 76.32,334.36 76.51,334.54 76.71,334.72 76.92,334.90 77.14,335.08 77.36,335.26 77.59,335.44 77.83,335.62 78.07,335.80 78.32,335.98 78.58,336.16 78.85,336.34 79.12,336.52 79.41,336.70 79.70,336.88 80.00,337.06 80.31,337.24 80.63,337.42 80.95,337.61 81.29,337.79 81.63,337.97 81.98,338.15 82.34,338.33 82.71,338.51 83.10,338.69 83.49,338.87 83.89,339.05 84.30,339.23 84.72,339.41 85.15,339.59 85.59,339.77 86.04,339.95 86.50,340.13 86.97,340.31 87.46,340.49 87.95,340.67 88.46,340.85 88.98,341.03 89.50,341.21 90.05,341.39 90.60,341.57 91.17,341.75 91.75,341.93 92.33,342.12 92.94,342.30 93.56,342.48 94.19,342.66 94.84,342.84 95.49,343.02 96.17,343.20 96.85,343.38 97.56,343.56 98.28,343.74 99.01,343.92 99.76,344.10 100.53,344.28 101.31,344.46 102.11,344.64 102.92,344.82 103.77,345.00 104.62,345.18 105.49,345.36 106.38,345.54 107.29,345.72 108.23,345.90 109.18,346.08 110.15,346.26 111.15,346.44 112.16,346.63 113.21,346.81 114.27,346.99 115.35,347.17 116.47,347.35 117.60,347.53 118.76,347.71 119.94,347.89 121.16,348.07 122.40,348.25 123.66,348.43 124.96,348.61 126.28,348.79 127.64,348.97 129.02,349.15 130.42,349.33 131.87,349.51 133.34,349.69 134.85,349.87 136.38,350.05 137.95,350.23 139.56,350.41 141.19,350.59 142.87,350.77 144.57,350.95 146.31,351.14 148.09,351.32 149.88,351.50 151.74,351.68 153.62,351.86 155.54,352.04 157.50,352.22 159.48,352.40 161.52,352.58 163.58,352.76 165.69,352.94 167.83,353.12 170.00,353.30 172.23,353.48 174.47,353.66 176.77,353.84 179.10,354.02 181.45,354.20 183.87,354.38 186.30,354.56 188.78,354.74 191.29,354.92 193.83,355.10 196.42,355.28 199.03,355.46 201.69,355.65 204.37,355.83 207.08,356.01 209.84,356.19 212.61,356.37 215.43,356.55 218.27,356.73 221.13,356.91 224.03,357.09 226.95,357.27 229.90,357.45 232.88,357.63 235.87,357.81 238.89,357.99 241.93,358.17 244.99,358.35 248.06,358.53 251.15,358.71 254.26,358.89 257.38,359.07 260.52,359.25 263.66,359.43 266.81,359.61 269.97,359.79 273.13,359.97 276.29,360.16 279.46,360.34 282.62,360.52 285.78,360.70 288.94,360.88 292.09,361.06 295.23,361.24 298.36,361.42 301.48,361.60 304.59,361.78 307.66,361.96 310.73,362.14 313.77,362.32 316.79,362.50 319.79,362.68 322.75,362.86 325.68,363.04 328.58,363.22 331.45,363.40 334.28,363.58 337.06,363.76 339.81,363.94 342.51,364.12 345.16,364.30 347.78,364.48 350.32,364.66 352.84,364.85 355.28,365.03 357.67,365.21 360.01,365.39 362.26,365.57 364.48,365.75 366.61,365.93 368.69,366.11 370.70,366.29 372.62,366.47 374.50,366.65 376.27,366.83 377.98,367.01 379.62,367.19 381.16,367.37 382.65,367.55 384.02,367.73 385.33,367.91 386.56,368.09 387.68,368.27 388.75,368.45 389.68,368.63 390.55,368.81 391.34,368.99 392.01,369.17 392.63,369.36 393.11,369.54 393.53,369.72 393.84,369.90 394.05,370.08 394.21,370.26 394.21,370.44 394.16,370.62 394.00,370.80 393.74,370.98 393.42,371.16 392.95,371.34 392.43,371.52 391.80,371.70 391.07,371.88 390.28,372.06 389.34,372.24 388.36,372.42 387.27,372.60 386.09,372.78 384.84,372.96 383.47,373.14 382.05,373.32 380.52,373.50 378.91,373.68 377.24,373.87 375.45,374.05 373.62,374.23 371.69,374.41 369.69,374.59 367.63,374.77 365.47,374.95 363.27,375.13 360.98,375.31 358.63,375.49 356.23,375.67 353.74,375.85 351.22,376.03 348.62,376.21 345.98,376.39 343.28,376.57 340.52,376.75 337.74,376.93 334.88,377.11 332.00,377.29 329.07,377.47 326.10,377.65 323.10,377.83 320.05,378.01 316.98,378.19 313.88,378.38 310.75,378.56 307.60,378.74 304.42,378.92 301.23,379.10 298.01,379.28 294.78,379.46 291.55,379.64 288.29,379.82 285.03,380.00 281.76,380.18 278.49,380.36 275.22,380.54 271.94,380.72 268.67,380.90 265.40,381.08 262.14,381.26 258.88,381.44 255.64,381.62 252.41,381.80 249.19,381.98 245.99,382.16 242.80,382.34 239.64,382.52 236.49,382.70 233.36,382.89 230.26,383.07 227.18,383.25 224.13,383.43 221.10,383.61 218.11,383.79 215.14,383.97 212.20,384.15 209.30,384.33 206.42,384.51 203.58,384.69 200.78,384.87 198.00,385.05 195.27,385.23 192.56,385.41 189.91,385.59 187.29,385.77 184.69,385.95 182.15,386.13 179.63,386.31 177.17,386.49 174.74,386.67 172.35,386.85 170.00,387.03 167.68,387.21 165.42,387.40 163.19,387.58 161.00,387.76 158.85,387.94 156.73,388.12 154.67,388.30 152.64,388.48 150.64,388.66 148.70,388.84 146.77,389.02 144.91,389.20 143.07,389.38 141.27,389.56 139.51,389.74 137.78,389.92 136.10,390.10 134.45,390.28 132.83,390.46 131.26,390.64 129.70,390.82 128.21,391.00 126.72,391.18 125.28,391.36 123.88,391.54 122.49,391.72 121.15,391.91 119.83,392.09 118.55,392.27 117.30,392.45 116.07,392.63 114.88,392.81 113.71,392.99 112.57,393.17 111.46,393.35 110.37,393.53 109.32,393.71 108.28,393.89 107.27,394.07 106.28,394.25 105.32,394.43 104.39,394.61 103.47,394.79 102.58,394.97 101.71,395.15 100.85,395.33 100.03,395.51 99.21,395.69 98.43,395.87 97.66,396.05 96.91,396.23 96.18,396.42 95.46,396.60 94.77,396.78 94.08,396.96 93.42,397.14 92.78,397.32 92.14,397.50 91.53,397.68 90.93,397.86 90.35,398.04 89.78,398.22 89.22,398.40 88.68,398.58 88.15,398.76 87.64,398.94 87.14,399.12 86.65,399.30 86.17,399.48 85.71,399.66 85.26,399.84 84.82,400.02 84.39,400.20 83.97,400.38 83.57,400.56 83.17,400.74 82.79,400.92 82.41,401.11 82.05,401.29 81.69,401.47 81.35,401.65 81.02,401.83 80.69,402.01 80.37,402.19 80.06,402.37 79.77,402.55 79.48,402.73 79.19,402.91 78.92,403.09 78.66,403.27 78.40,403.45 78.15,403.63 77.91,403.81 77.67,403.99 77.45,404.17 77.23,404.35 77.01,404.53 76.81,404.71 76.61,404.89 76.41,405.07 76.23,405.25 76.05,405.43 75.87,405.62 75.71,405.80 75.54,405.98 75.39,406.16 75.23,406.34 75.09,406.52 74.95,406.70 74.81,406.88 74.68,407.06 74.56,407.24 74.43,407.42 74.32,407.60 74.21,407.78 74.10,407.96 74.00,408.14 73.90,408.32 73.80,408.50 73.71,408.68 73.62,408.86 73.54,409.04 73.46,409.22 73.38,409.40 73.31,409.58 73.24,409.76 73.17,409.94 73.10,410.13 73.04,410.31 72.98,410.49 72.93,410.67 72.87,410.85 72.82,411.03 72.77,411.21 72.73,411.39 72.68,411.57 72.64,411.75 72.60,411.93 72.56,412.11 72.53,412.29 72.49,412.47 72.46,412.65 72.43,412.83 72.40,413.01 72.37,413.19 72.34,413.37 72.32,413.55 72.30,413.73 72.27,413.91 72.25,414.09 72.23,414.27 72.21,414.45 72.20,414.64 72.18,414.82 72.16,415.00 72.15,415.18 72.13,415.36 72.12,415.54 72.11,415.72 72.10,415.90 72.09,416.08 72.07,416.26 72.07,416.44 72.06,416.62 72.05,416.80 ' style='stroke-width: 0.75; stroke: none; fill: #000000; fill-opacity: 0.10;' />
-<polyline points='72.05,416.80 72.06,416.62 72.07,416.44 72.07,416.26 72.09,416.08 72.10,415.90 72.11,415.72 72.12,415.54 72.13,415.36 72.15,415.18 72.16,415.00 72.18,414.82 72.20,414.64 72.21,414.45 72.23,414.27 72.25,414.09 72.27,413.91 72.30,413.73 72.32,413.55 72.34,413.37 72.37,413.19 72.40,413.01 72.43,412.83 72.46,412.65 72.49,412.47 72.53,412.29 72.56,412.11 72.60,411.93 72.64,411.75 72.68,411.57 72.73,411.39 72.77,411.21 72.82,411.03 72.87,410.85 72.93,410.67 72.98,410.49 73.04,410.31 73.10,410.13 73.17,409.94 73.24,409.76 73.31,409.58 73.38,409.40 73.46,409.22 73.54,409.04 73.62,408.86 73.71,408.68 73.80,408.50 73.90,408.32 74.00,408.14 74.10,407.96 74.21,407.78 74.32,407.60 74.43,407.42 74.56,407.24 74.68,407.06 74.81,406.88 74.95,406.70 75.09,406.52 75.23,406.34 75.39,406.16 75.54,405.98 75.71,405.80 75.87,405.62 76.05,405.43 76.23,405.25 76.41,405.07 76.61,404.89 76.81,404.71 77.01,404.53 77.23,404.35 77.45,404.17 77.67,403.99 77.91,403.81 78.15,403.63 78.40,403.45 78.66,403.27 78.92,403.09 79.19,402.91 79.48,402.73 79.77,402.55 80.06,402.37 80.37,402.19 80.69,402.01 81.02,401.83 81.35,401.65 81.69,401.47 82.05,401.29 82.41,401.11 82.79,400.92 83.17,400.74 83.57,400.56 83.97,400.38 84.39,400.20 84.82,400.02 85.26,399.84 85.71,399.66 86.17,399.48 86.65,399.30 87.14,399.12 87.64,398.94 88.15,398.76 88.68,398.58 89.22,398.40 89.78,398.22 90.35,398.04 90.93,397.86 91.53,397.68 92.14,397.50 92.78,397.32 93.42,397.14 94.08,396.96 94.77,396.78 95.46,396.60 96.18,396.42 96.91,396.23 97.66,396.05 98.43,395.87 99.21,395.69 100.03,395.51 100.85,395.33 101.71,395.15 102.58,394.97 103.47,394.79 104.39,394.61 105.32,394.43 106.28,394.25 107.27,394.07 108.28,393.89 109.32,393.71 110.37,393.53 111.46,393.35 112.57,393.17 113.71,392.99 114.88,392.81 116.07,392.63 117.30,392.45 118.55,392.27 119.83,392.09 121.15,391.91 122.49,391.72 123.88,391.54 125.28,391.36 126.72,391.18 128.21,391.00 129.70,390.82 131.26,390.64 132.83,390.46 134.45,390.28 136.10,390.10 137.78,389.92 139.51,389.74 141.27,389.56 143.07,389.38 144.91,389.20 146.77,389.02 148.70,388.84 150.64,388.66 152.64,388.48 154.67,388.30 156.73,388.12 158.85,387.94 161.00,387.76 163.19,387.58 165.42,387.40 167.68,387.21 170.00,387.03 172.35,386.85 174.74,386.67 177.17,386.49 179.63,386.31 182.15,386.13 184.69,385.95 187.29,385.77 189.91,385.59 192.56,385.41 195.27,385.23 198.00,385.05 200.78,384.87 203.58,384.69 206.42,384.51 209.30,384.33 212.20,384.15 215.14,383.97 218.11,383.79 221.10,383.61 224.13,383.43 227.18,383.25 230.26,383.07 233.36,382.89 236.49,382.70 239.64,382.52 242.80,382.34 245.99,382.16 249.19,381.98 252.41,381.80 255.64,381.62 258.88,381.44 262.14,381.26 265.40,381.08 268.67,380.90 271.94,380.72 275.22,380.54 278.49,380.36 281.76,380.18 285.03,380.00 288.29,379.82 291.55,379.64 294.78,379.46 298.01,379.28 301.23,379.10 304.42,378.92 307.60,378.74 310.75,378.56 313.88,378.38 316.98,378.19 320.05,378.01 323.10,377.83 326.10,377.65 329.07,377.47 332.00,377.29 334.88,377.11 337.74,376.93 340.52,376.75 343.28,376.57 345.98,376.39 348.62,376.21 351.22,376.03 353.74,375.85 356.23,375.67 358.63,375.49 360.98,375.31 363.27,375.13 365.47,374.95 367.63,374.77 369.69,374.59 371.69,374.41 373.62,374.23 375.45,374.05 377.24,373.87 378.91,373.68 380.52,373.50 382.05,373.32 383.47,373.14 384.84,372.96 386.09,372.78 387.27,372.60 388.36,372.42 389.34,372.24 390.28,372.06 391.07,371.88 391.80,371.70 392.43,371.52 392.95,371.34 393.42,371.16 393.74,370.98 394.00,370.80 394.16,370.62 394.21,370.44 394.21,370.26 394.05,370.08 393.84,369.90 393.53,369.72 393.11,369.54 392.63,369.36 392.01,369.17 391.34,368.99 390.55,368.81 389.68,368.63 388.75,368.45 387.68,368.27 386.56,368.09 385.33,367.91 384.02,367.73 382.65,367.55 381.16,367.37 379.62,367.19 377.98,367.01 376.27,366.83 374.50,366.65 372.62,366.47 370.70,366.29 368.69,366.11 366.61,365.93 364.48,365.75 362.26,365.57 360.01,365.39 357.67,365.21 355.28,365.03 352.84,364.85 350.32,364.66 347.78,364.48 345.16,364.30 342.51,364.12 339.81,363.94 337.06,363.76 334.28,363.58 331.45,363.40 328.58,363.22 325.68,363.04 322.75,362.86 319.79,362.68 316.79,362.50 313.77,362.32 310.73,362.14 307.66,361.96 304.59,361.78 301.48,361.60 298.36,361.42 295.23,361.24 292.09,361.06 288.94,360.88 285.78,360.70 282.62,360.52 279.46,360.34 276.29,360.16 273.13,359.97 269.97,359.79 266.81,359.61 263.66,359.43 260.52,359.25 257.38,359.07 254.26,358.89 251.15,358.71 248.06,358.53 244.99,358.35 241.93,358.17 238.89,357.99 235.87,357.81 232.88,357.63 229.90,357.45 226.95,357.27 224.03,357.09 221.13,356.91 218.27,356.73 215.43,356.55 212.61,356.37 209.84,356.19 207.08,356.01 204.37,355.83 201.69,355.65 199.03,355.46 196.42,355.28 193.83,355.10 191.29,354.92 188.78,354.74 186.30,354.56 183.87,354.38 181.45,354.20 179.10,354.02 176.77,353.84 174.47,353.66 172.23,353.48 170.00,353.30 167.83,353.12 165.69,352.94 163.58,352.76 161.52,352.58 159.48,352.40 157.50,352.22 155.54,352.04 153.62,351.86 151.74,351.68 149.88,351.50 148.09,351.32 146.31,351.14 144.57,350.95 142.87,350.77 141.19,350.59 139.56,350.41 137.95,350.23 136.38,350.05 134.85,349.87 133.34,349.69 131.87,349.51 130.42,349.33 129.02,349.15 127.64,348.97 126.28,348.79 124.96,348.61 123.66,348.43 122.40,348.25 121.16,348.07 119.94,347.89 118.76,347.71 117.60,347.53 116.47,347.35 115.35,347.17 114.27,346.99 113.21,346.81 112.16,346.63 111.15,346.44 110.15,346.26 109.18,346.08 108.23,345.90 107.29,345.72 106.38,345.54 105.49,345.36 104.62,345.18 103.77,345.00 102.92,344.82 102.11,344.64 101.31,344.46 100.53,344.28 99.76,344.10 99.01,343.92 98.28,343.74 97.56,343.56 96.85,343.38 96.17,343.20 95.49,343.02 94.84,342.84 94.19,342.66 93.56,342.48 92.94,342.30 92.33,342.12 91.75,341.93 91.17,341.75 90.60,341.57 90.05,341.39 89.50,341.21 88.98,341.03 88.46,340.85 87.95,340.67 87.46,340.49 86.97,340.31 86.50,340.13 86.04,339.95 85.59,339.77 85.15,339.59 84.72,339.41 84.30,339.23 83.89,339.05 83.49,338.87 83.10,338.69 82.71,338.51 82.34,338.33 81.98,338.15 81.63,337.97 81.29,337.79 80.95,337.61 80.63,337.42 80.31,337.24 80.00,337.06 79.70,336.88 79.41,336.70 79.12,336.52 78.85,336.34 78.58,336.16 78.32,335.98 78.07,335.80 77.83,335.62 77.59,335.44 77.36,335.26 77.14,335.08 76.92,334.90 76.71,334.72 76.51,334.54 76.32,334.36 76.13,334.18 75.94,334.00 75.77,333.82 75.60,333.64 75.43,333.46 75.28,333.28 75.12,333.10 74.98,332.91 74.83,332.73 74.70,332.55 74.57,332.37 74.44,332.19 74.32,332.01 74.20,331.83 74.09,331.65 73.99,331.47 73.88,331.29 73.79,331.11 73.69,330.93 73.60,330.75 73.51,330.57 73.43,330.39 73.35,330.21 73.28,330.03 73.21,329.85 73.14,329.67 73.07,329.49 73.01,329.31 72.95,329.13 72.89,328.95 72.84,328.77 72.79,328.59 72.74,328.40 72.69,328.22 72.65,328.04 72.60,327.86 72.56,327.68 72.53,327.50 72.49,327.32 72.46,327.14 72.42,326.96 72.39,326.78 72.37,326.60 72.34,326.42 72.31,326.24 72.29,326.06 72.27,325.88 72.24,325.70 72.22,325.52 72.21,325.34 72.19,325.16 72.17,324.98 72.15,324.80 72.14,324.62 ' style='stroke-width: 0.75;' />
-<polygon points='71.93,316.07 71.93,315.77 71.93,315.48 71.93,315.18 71.93,314.88 71.93,314.58 71.93,314.28 71.93,313.98 71.93,313.68 71.93,313.39 71.93,313.09 71.93,312.79 71.93,312.49 71.93,312.19 71.93,311.89 71.93,311.59 71.93,311.29 71.93,311.00 71.93,310.70 71.93,310.40 71.93,310.10 71.93,309.80 71.93,309.50 71.93,309.20 71.93,308.91 71.93,308.61 71.93,308.31 71.93,308.01 71.93,307.71 71.93,307.41 71.93,307.11 71.93,306.81 71.93,306.52 71.93,306.22 71.93,305.92 71.93,305.62 71.93,305.32 71.93,305.02 71.93,304.72 71.93,304.43 71.93,304.13 71.93,303.83 71.93,303.53 71.93,303.23 71.93,302.93 71.93,302.63 71.93,302.33 71.93,302.04 71.93,301.74 71.93,301.44 71.93,301.14 71.93,300.84 71.93,300.54 71.93,300.24 71.93,299.95 71.93,299.65 71.93,299.35 71.93,299.05 71.93,298.75 71.93,298.45 71.93,298.15 71.93,297.85 71.93,297.56 71.93,297.26 71.93,296.96 71.93,296.66 71.93,296.36 71.93,296.06 71.93,295.76 71.93,295.47 71.93,295.17 71.93,294.87 71.93,294.57 71.93,294.27 71.93,293.97 71.93,293.67 71.93,293.37 71.93,293.08 71.93,292.78 71.93,292.48 71.93,292.18 71.93,291.88 71.93,291.58 71.93,291.28 71.93,290.99 71.93,290.69 71.93,290.39 71.93,290.09 71.93,289.79 71.93,289.49 71.93,289.19 71.93,288.89 71.93,288.60 71.93,288.30 71.93,288.00 71.93,287.70 71.93,287.40 71.93,287.10 71.93,286.80 71.93,286.51 71.93,286.21 71.93,285.91 71.93,285.61 71.93,285.31 71.93,285.01 71.93,284.71 71.93,284.41 71.93,284.12 71.93,283.82 71.93,283.52 71.93,283.22 71.93,282.92 71.93,282.62 71.93,282.32 71.93,282.03 71.93,281.73 71.93,281.43 71.93,281.13 71.93,280.83 71.93,280.53 71.93,280.23 71.93,279.93 71.93,279.64 71.93,279.34 71.93,279.04 71.93,278.74 71.93,278.44 71.93,278.14 71.93,277.84 71.93,277.55 71.93,277.25 71.93,276.95 71.93,276.65 71.93,276.35 71.93,276.05 71.93,275.75 71.93,275.45 71.93,275.16 71.93,274.86 71.93,274.56 71.93,274.26 71.93,273.96 71.93,273.66 71.93,273.36 71.93,273.07 71.93,272.77 71.93,272.47 71.93,272.17 71.93,271.87 71.93,271.57 71.93,271.27 71.93,270.97 71.93,270.68 71.93,270.38 71.93,270.08 71.93,269.78 71.93,269.48 71.93,269.18 71.93,268.88 71.93,268.59 71.93,268.29 71.93,267.99 71.93,267.69 71.93,267.39 71.93,267.09 71.93,266.79 71.93,266.49 71.93,266.20 71.93,265.90 71.93,265.60 71.93,265.30 71.93,265.00 71.93,264.70 71.93,264.40 71.93,264.11 71.93,263.81 71.93,263.51 71.93,263.21 71.93,262.91 71.93,262.61 71.93,262.31 71.93,262.01 71.93,261.72 71.93,261.42 71.93,261.12 71.93,260.82 71.93,260.52 71.93,260.22 71.93,259.92 71.93,259.63 71.93,259.33 71.93,259.03 71.93,258.73 71.93,258.43 71.93,258.13 71.93,257.83 71.93,257.53 71.93,257.24 71.93,256.94 71.93,256.64 71.93,256.34 71.93,256.04 71.93,255.74 71.93,255.44 71.93,255.15 71.93,254.85 71.93,254.55 71.93,254.25 71.93,253.95 71.93,253.65 71.93,253.35 71.93,253.05 71.93,252.76 71.93,252.46 71.93,252.16 71.93,251.86 71.93,251.56 71.93,251.26 71.93,250.96 71.93,250.67 71.93,250.37 71.93,250.07 71.93,249.77 71.93,249.47 71.93,249.17 71.93,248.87 71.93,248.57 71.93,248.28 71.93,247.98 71.93,247.68 71.93,247.38 71.93,247.08 71.93,246.78 71.93,246.48 71.93,246.19 71.93,245.89 71.93,245.59 71.93,245.29 71.93,244.99 71.93,244.69 71.93,244.39 71.93,244.09 71.93,243.80 71.93,243.50 71.93,243.20 71.93,242.90 71.93,242.60 71.93,242.30 71.93,242.00 71.93,241.71 71.93,241.41 71.93,241.11 71.93,240.81 71.93,240.51 71.93,240.21 71.93,239.91 71.93,239.61 71.93,239.32 71.93,239.02 71.93,238.72 71.93,238.42 71.93,238.12 71.93,237.82 71.93,237.52 71.93,237.22 71.93,236.93 71.93,236.63 71.93,236.33 71.93,236.03 71.93,235.73 71.93,235.43 71.93,235.13 71.93,234.84 71.93,234.54 71.93,234.24 71.93,233.94 71.93,233.64 71.93,233.34 71.93,233.04 71.93,232.74 71.93,232.45 71.93,232.15 71.93,231.85 71.93,231.55 71.93,231.25 71.93,230.95 71.93,230.65 71.93,230.36 71.93,230.06 71.93,229.76 71.93,229.46 71.93,229.16 71.93,228.86 71.93,228.56 71.93,228.26 71.93,227.97 71.93,227.67 71.93,227.37 71.93,227.07 71.93,226.77 71.93,226.47 71.93,226.17 71.93,225.88 71.93,225.58 71.93,225.28 71.93,224.98 71.93,224.68 71.93,224.38 71.93,224.08 71.93,223.78 71.93,223.49 71.93,223.19 71.93,222.89 71.93,222.59 71.93,222.29 71.93,221.99 71.93,221.69 71.93,221.40 71.93,221.10 71.93,220.80 71.93,220.50 71.93,220.20 71.93,219.90 71.93,219.60 71.93,219.30 71.93,219.01 71.93,218.71 71.93,218.41 71.93,218.11 71.93,217.81 71.93,217.51 71.93,217.21 71.93,216.92 71.93,216.62 71.93,216.32 71.93,216.02 71.93,215.72 71.93,215.42 71.93,215.12 71.93,214.82 71.93,214.53 71.93,214.23 71.93,213.93 71.93,213.63 71.93,213.33 71.93,213.03 71.93,212.73 71.93,212.44 71.93,212.14 71.93,211.84 71.93,211.54 71.93,211.24 71.93,210.94 71.93,210.64 71.93,210.34 71.93,210.05 71.93,209.75 71.93,209.45 71.93,209.15 71.93,208.85 71.93,208.55 71.93,208.25 71.93,207.96 71.93,207.66 71.93,207.36 71.93,207.06 71.93,206.76 71.93,206.46 71.93,206.16 71.93,205.86 71.93,205.57 71.93,205.27 71.93,204.97 71.93,204.67 71.93,204.37 71.93,204.07 71.93,203.77 71.93,203.48 71.93,203.18 71.93,202.88 71.93,202.58 71.93,202.28 71.93,201.98 71.93,201.68 71.93,201.38 71.93,201.09 71.93,200.79 71.93,200.49 71.93,200.19 71.93,199.89 71.93,199.59 71.93,199.29 71.93,199.00 71.93,198.70 71.93,198.40 71.93,198.10 71.93,197.80 71.93,197.50 71.93,197.20 71.93,196.90 71.93,196.61 71.93,196.31 71.93,196.01 71.93,195.71 71.93,195.41 71.93,195.11 71.93,194.81 71.93,194.52 71.93,194.22 71.93,193.92 71.93,193.62 71.93,193.32 71.93,193.02 71.93,192.72 71.93,192.42 71.93,192.13 71.93,191.83 71.93,191.53 71.93,191.23 71.93,190.93 71.93,190.63 71.93,190.33 71.93,190.04 71.93,189.74 71.93,189.44 71.93,189.14 71.93,188.84 71.93,188.54 71.93,188.24 71.93,187.94 71.93,187.65 71.93,187.35 71.93,187.05 71.93,186.75 71.93,186.45 71.93,186.15 71.93,185.85 71.93,185.56 71.93,185.26 71.93,184.96 71.93,184.66 71.93,184.36 71.93,184.06 71.93,183.76 71.93,183.46 71.93,183.17 71.93,182.87 71.93,182.57 71.93,182.27 71.93,181.97 71.93,181.67 71.93,181.37 71.93,181.08 71.93,180.78 71.93,180.48 71.93,180.18 71.93,179.88 71.93,179.58 71.93,179.28 71.93,178.98 71.93,178.69 71.93,178.39 71.93,178.09 71.93,177.79 71.93,177.49 71.93,177.19 71.93,176.89 71.93,176.60 71.93,176.30 71.93,176.00 71.93,175.70 71.93,175.40 71.93,175.10 71.93,174.80 71.93,174.50 71.93,174.21 71.93,173.91 71.93,173.61 71.93,173.31 71.93,173.01 71.93,172.71 71.93,172.41 71.93,172.12 71.93,171.82 71.93,171.52 71.93,171.22 71.93,170.92 71.93,170.62 71.93,170.32 71.93,170.02 71.93,169.73 71.93,169.43 71.93,169.13 71.93,168.83 71.93,168.53 71.93,168.23 71.93,167.93 71.93,167.64 71.93,167.34 71.93,167.04 71.93,166.74 71.93,166.44 71.93,166.14 71.93,165.84 71.93,165.54 71.93,165.25 71.93,164.95 71.93,164.65 71.93,164.35 71.93,164.05 71.93,163.75 71.93,163.45 72.05,163.45 72.06,163.75 72.08,164.05 72.10,164.35 72.11,164.65 72.14,164.95 72.16,165.25 72.19,165.54 72.22,165.84 72.25,166.14 72.28,166.44 72.32,166.74 72.36,167.04 72.41,167.34 72.46,167.64 72.52,167.93 72.58,168.23 72.64,168.53 72.71,168.83 72.79,169.13 72.87,169.43 72.96,169.73 73.06,170.02 73.16,170.32 73.27,170.62 73.39,170.92 73.52,171.22 73.66,171.52 73.81,171.82 73.96,172.12 74.13,172.41 74.31,172.71 74.50,173.01 74.70,173.31 74.92,173.61 75.15,173.91 75.39,174.21 75.64,174.50 75.91,174.80 76.19,175.10 76.49,175.40 76.81,175.70 77.13,176.00 77.48,176.30 77.84,176.60 78.22,176.89 78.62,177.19 79.03,177.49 79.46,177.79 79.90,178.09 80.37,178.39 80.86,178.69 81.36,178.98 81.88,179.28 82.42,179.58 82.97,179.88 83.55,180.18 84.14,180.48 84.76,180.78 85.38,181.08 86.03,181.37 86.70,181.67 87.39,181.97 88.09,182.27 88.81,182.57 89.55,182.87 90.31,183.17 91.08,183.46 91.88,183.76 92.68,184.06 93.51,184.36 94.35,184.66 95.21,184.96 96.08,185.26 96.98,185.56 97.89,185.85 98.81,186.15 99.75,186.45 100.71,186.75 101.68,187.05 102.66,187.35 103.67,187.65 104.69,187.94 105.72,188.24 106.77,188.54 107.84,188.84 108.92,189.14 110.02,189.44 111.13,189.74 112.26,190.04 113.40,190.33 114.57,190.63 115.75,190.93 116.94,191.23 118.15,191.53 119.38,191.83 120.62,192.13 121.88,192.42 123.16,192.72 124.46,193.02 125.77,193.32 127.10,193.62 128.46,193.92 129.82,194.22 131.20,194.52 132.61,194.81 134.03,195.11 135.47,195.41 136.92,195.71 138.40,196.01 139.89,196.31 141.39,196.61 142.92,196.90 144.46,197.20 146.01,197.50 147.59,197.80 149.18,198.10 150.78,198.40 152.39,198.70 154.02,199.00 155.66,199.29 157.31,199.59 158.98,199.89 160.65,200.19 162.34,200.49 164.03,200.79 165.73,201.09 167.43,201.38 169.14,201.68 170.85,201.98 172.56,202.28 174.28,202.58 175.99,202.88 177.70,203.18 179.41,203.48 181.12,203.77 182.81,204.07 184.50,204.37 186.19,204.67 187.86,204.97 189.51,205.27 191.16,205.57 192.79,205.86 194.39,206.16 195.98,206.46 197.55,206.76 199.10,207.06 200.62,207.36 202.12,207.66 203.59,207.96 205.02,208.25 206.43,208.55 207.81,208.85 209.14,209.15 210.44,209.45 211.70,209.75 212.92,210.05 214.09,210.34 215.23,210.64 216.32,210.94 217.36,211.24 218.34,211.54 219.29,211.84 220.17,212.14 221.00,212.44 221.78,212.73 222.51,213.03 223.16,213.33 223.76,213.63 224.32,213.93 224.80,214.23 225.21,214.53 225.58,214.82 225.88,215.12 226.11,215.42 226.28,215.72 226.40,216.02 226.45,216.32 226.43,216.62 226.36,216.92 226.24,217.21 226.04,217.51 225.79,217.81 225.50,218.11 225.14,218.41 224.73,218.71 224.27,219.01 223.77,219.30 223.21,219.60 222.62,219.90 221.99,220.20 221.32,220.50 220.61,220.80 219.88,221.10 219.12,221.40 218.33,221.69 217.53,221.99 216.71,222.29 215.86,222.59 215.02,222.89 214.16,223.19 213.30,223.49 212.44,223.78 211.59,224.08 210.74,224.38 209.90,224.68 209.07,224.98 208.25,225.28 207.46,225.58 206.68,225.88 205.93,226.17 205.20,226.47 204.50,226.77 203.82,227.07 203.17,227.37 202.57,227.67 201.99,227.97 201.44,228.26 200.92,228.56 200.45,228.86 200.00,229.16 199.58,229.46 199.21,229.76 198.87,230.06 198.55,230.36 198.27,230.65 198.02,230.95 197.80,231.25 197.60,231.55 197.44,231.85 197.30,232.15 197.17,232.45 197.07,232.74 196.99,233.04 196.92,233.34 196.86,233.64 196.81,233.94 196.77,234.24 196.73,234.54 196.69,234.84 196.65,235.13 196.61,235.43 196.56,235.73 196.50,236.03 196.43,236.33 196.34,236.63 196.23,236.93 196.10,237.22 195.95,237.52 195.77,237.82 195.55,238.12 195.31,238.42 195.04,238.72 194.72,239.02 194.37,239.32 193.99,239.61 193.56,239.91 193.08,240.21 192.56,240.51 192.00,240.81 191.38,241.11 190.72,241.41 190.02,241.71 189.26,242.00 188.46,242.30 187.61,242.60 186.71,242.90 185.76,243.20 184.76,243.50 183.73,243.80 182.64,244.09 181.51,244.39 180.34,244.69 179.13,244.99 177.87,245.29 176.58,245.59 175.26,245.89 173.90,246.19 172.52,246.48 171.11,246.78 169.67,247.08 168.20,247.38 166.73,247.68 165.23,247.98 163.72,248.28 162.20,248.57 160.67,248.87 159.14,249.17 157.61,249.47 156.08,249.77 154.55,250.07 153.03,250.37 151.52,250.67 150.02,250.96 148.54,251.26 147.08,251.56 145.64,251.86 144.22,252.16 142.83,252.46 141.46,252.76 140.12,253.05 138.82,253.35 137.55,253.65 136.31,253.95 135.10,254.25 133.94,254.55 132.81,254.85 131.72,255.15 130.67,255.44 129.66,255.74 128.68,256.04 127.75,256.34 126.86,256.64 126.00,256.94 125.18,257.24 124.41,257.53 123.67,257.83 122.96,258.13 122.30,258.43 121.67,258.73 121.07,259.03 120.50,259.33 119.97,259.63 119.47,259.92 118.99,260.22 118.54,260.52 118.12,260.82 117.73,261.12 117.35,261.42 117.00,261.72 116.66,262.01 116.35,262.31 116.05,262.61 115.77,262.91 115.49,263.21 115.23,263.51 114.99,263.81 114.75,264.11 114.51,264.40 114.29,264.70 114.07,265.00 113.86,265.30 113.64,265.60 113.43,265.90 113.22,266.20 113.02,266.49 112.81,266.79 112.59,267.09 112.38,267.39 112.16,267.69 111.94,267.99 111.72,268.29 111.49,268.59 111.25,268.88 111.01,269.18 110.77,269.48 110.52,269.78 110.26,270.08 109.99,270.38 109.72,270.68 109.44,270.97 109.15,271.27 108.85,271.57 108.55,271.87 108.24,272.17 107.92,272.47 107.60,272.77 107.26,273.07 106.92,273.36 106.57,273.66 106.21,273.96 105.85,274.26 105.47,274.56 105.10,274.86 104.71,275.16 104.32,275.45 103.92,275.75 103.51,276.05 103.10,276.35 102.68,276.65 102.26,276.95 101.83,277.25 101.40,277.55 100.96,277.84 100.52,278.14 100.08,278.44 99.64,278.74 99.19,279.04 98.74,279.34 98.29,279.64 97.84,279.93 97.40,280.23 96.95,280.53 96.50,280.83 96.06,281.13 95.62,281.43 95.19,281.73 94.76,282.03 94.33,282.32 93.91,282.62 93.50,282.92 93.09,283.22 92.69,283.52 92.30,283.82 91.91,284.12 91.54,284.41 91.17,284.71 90.81,285.01 90.46,285.31 90.12,285.61 89.78,285.91 89.46,286.21 89.14,286.51 88.83,286.80 88.53,287.10 88.24,287.40 87.96,287.70 87.68,288.00 87.42,288.30 87.16,288.60 86.90,288.89 86.65,289.19 86.41,289.49 86.17,289.79 85.93,290.09 85.70,290.39 85.47,290.69 85.24,290.99 85.02,291.28 84.79,291.58 84.57,291.88 84.35,292.18 84.13,292.48 83.91,292.78 83.69,293.08 83.46,293.37 83.24,293.67 83.01,293.97 82.78,294.27 82.55,294.57 82.32,294.87 82.08,295.17 81.85,295.47 81.61,295.76 81.37,296.06 81.12,296.36 80.88,296.66 80.63,296.96 80.39,297.26 80.14,297.56 79.89,297.85 79.64,298.15 79.39,298.45 79.14,298.75 78.89,299.05 78.64,299.35 78.39,299.65 78.15,299.95 77.90,300.24 77.66,300.54 77.42,300.84 77.19,301.14 76.96,301.44 76.73,301.74 76.51,302.04 76.29,302.33 76.08,302.63 75.87,302.93 75.67,303.23 75.47,303.53 75.28,303.83 75.09,304.13 74.91,304.43 74.74,304.72 74.58,305.02 74.42,305.32 74.26,305.62 74.12,305.92 73.98,306.22 73.84,306.52 73.71,306.81 73.59,307.11 73.48,307.41 73.37,307.71 73.26,308.01 73.17,308.31 73.07,308.61 72.99,308.91 72.90,309.20 72.83,309.50 72.76,309.80 72.69,310.10 72.63,310.40 72.57,310.70 72.51,311.00 72.46,311.29 72.42,311.59 72.37,311.89 72.33,312.19 72.30,312.49 72.26,312.79 72.23,313.09 72.20,313.39 72.17,313.68 72.15,313.98 72.13,314.28 72.11,314.58 72.09,314.88 72.07,315.18 72.06,315.48 72.05,315.77 72.03,316.07 ' style='stroke-width: 0.75; stroke: none; fill: #DF536B; fill-opacity: 0.10;' />
-<polyline points='72.03,316.07 72.05,315.77 72.06,315.48 72.07,315.18 72.09,314.88 72.11,314.58 72.13,314.28 72.15,313.98 72.17,313.68 72.20,313.39 72.23,313.09 72.26,312.79 72.30,312.49 72.33,312.19 72.37,311.89 72.42,311.59 72.46,311.29 72.51,311.00 72.57,310.70 72.63,310.40 72.69,310.10 72.76,309.80 72.83,309.50 72.90,309.20 72.99,308.91 73.07,308.61 73.17,308.31 73.26,308.01 73.37,307.71 73.48,307.41 73.59,307.11 73.71,306.81 73.84,306.52 73.98,306.22 74.12,305.92 74.26,305.62 74.42,305.32 74.58,305.02 74.74,304.72 74.91,304.43 75.09,304.13 75.28,303.83 75.47,303.53 75.67,303.23 75.87,302.93 76.08,302.63 76.29,302.33 76.51,302.04 76.73,301.74 76.96,301.44 77.19,301.14 77.42,300.84 77.66,300.54 77.90,300.24 78.15,299.95 78.39,299.65 78.64,299.35 78.89,299.05 79.14,298.75 79.39,298.45 79.64,298.15 79.89,297.85 80.14,297.56 80.39,297.26 80.63,296.96 80.88,296.66 81.12,296.36 81.37,296.06 81.61,295.76 81.85,295.47 82.08,295.17 82.32,294.87 82.55,294.57 82.78,294.27 83.01,293.97 83.24,293.67 83.46,293.37 83.69,293.08 83.91,292.78 84.13,292.48 84.35,292.18 84.57,291.88 84.79,291.58 85.02,291.28 85.24,290.99 85.47,290.69 85.70,290.39 85.93,290.09 86.17,289.79 86.41,289.49 86.65,289.19 86.90,288.89 87.16,288.60 87.42,288.30 87.68,288.00 87.96,287.70 88.24,287.40 88.53,287.10 88.83,286.80 89.14,286.51 89.46,286.21 89.78,285.91 90.12,285.61 90.46,285.31 90.81,285.01 91.17,284.71 91.54,284.41 91.91,284.12 92.30,283.82 92.69,283.52 93.09,283.22 93.50,282.92 93.91,282.62 94.33,282.32 94.76,282.03 95.19,281.73 95.62,281.43 96.06,281.13 96.50,280.83 96.95,280.53 97.40,280.23 97.84,279.93 98.29,279.64 98.74,279.34 99.19,279.04 99.64,278.74 100.08,278.44 100.52,278.14 100.96,277.84 101.40,277.55 101.83,277.25 102.26,276.95 102.68,276.65 103.10,276.35 103.51,276.05 103.92,275.75 104.32,275.45 104.71,275.16 105.10,274.86 105.47,274.56 105.85,274.26 106.21,273.96 106.57,273.66 106.92,273.36 107.26,273.07 107.60,272.77 107.92,272.47 108.24,272.17 108.55,271.87 108.85,271.57 109.15,271.27 109.44,270.97 109.72,270.68 109.99,270.38 110.26,270.08 110.52,269.78 110.77,269.48 111.01,269.18 111.25,268.88 111.49,268.59 111.72,268.29 111.94,267.99 112.16,267.69 112.38,267.39 112.59,267.09 112.81,266.79 113.02,266.49 113.22,266.20 113.43,265.90 113.64,265.60 113.86,265.30 114.07,265.00 114.29,264.70 114.51,264.40 114.75,264.11 114.99,263.81 115.23,263.51 115.49,263.21 115.77,262.91 116.05,262.61 116.35,262.31 116.66,262.01 117.00,261.72 117.35,261.42 117.73,261.12 118.12,260.82 118.54,260.52 118.99,260.22 119.47,259.92 119.97,259.63 120.50,259.33 121.07,259.03 121.67,258.73 122.30,258.43 122.96,258.13 123.67,257.83 124.41,257.53 125.18,257.24 126.00,256.94 126.86,256.64 127.75,256.34 128.68,256.04 129.66,255.74 130.67,255.44 131.72,255.15 132.81,254.85 133.94,254.55 135.10,254.25 136.31,253.95 137.55,253.65 138.82,253.35 140.12,253.05 141.46,252.76 142.83,252.46 144.22,252.16 145.64,251.86 147.08,251.56 148.54,251.26 150.02,250.96 151.52,250.67 153.03,250.37 154.55,250.07 156.08,249.77 157.61,249.47 159.14,249.17 160.67,248.87 162.20,248.57 163.72,248.28 165.23,247.98 166.73,247.68 168.20,247.38 169.67,247.08 171.11,246.78 172.52,246.48 173.90,246.19 175.26,245.89 176.58,245.59 177.87,245.29 179.13,244.99 180.34,244.69 181.51,244.39 182.64,244.09 183.73,243.80 184.76,243.50 185.76,243.20 186.71,242.90 187.61,242.60 188.46,242.30 189.26,242.00 190.02,241.71 190.72,241.41 191.38,241.11 192.00,240.81 192.56,240.51 193.08,240.21 193.56,239.91 193.99,239.61 194.37,239.32 194.72,239.02 195.04,238.72 195.31,238.42 195.55,238.12 195.77,237.82 195.95,237.52 196.10,237.22 196.23,236.93 196.34,236.63 196.43,236.33 196.50,236.03 196.56,235.73 196.61,235.43 196.65,235.13 196.69,234.84 196.73,234.54 196.77,234.24 196.81,233.94 196.86,233.64 196.92,233.34 196.99,233.04 197.07,232.74 197.17,232.45 197.30,232.15 197.44,231.85 197.60,231.55 197.80,231.25 198.02,230.95 198.27,230.65 198.55,230.36 198.87,230.06 199.21,229.76 199.58,229.46 200.00,229.16 200.45,228.86 200.92,228.56 201.44,228.26 201.99,227.97 202.57,227.67 203.17,227.37 203.82,227.07 204.50,226.77 205.20,226.47 205.93,226.17 206.68,225.88 207.46,225.58 208.25,225.28 209.07,224.98 209.90,224.68 210.74,224.38 211.59,224.08 212.44,223.78 213.30,223.49 214.16,223.19 215.02,222.89 215.86,222.59 216.71,222.29 217.53,221.99 218.33,221.69 219.12,221.40 219.88,221.10 220.61,220.80 221.32,220.50 221.99,220.20 222.62,219.90 223.21,219.60 223.77,219.30 224.27,219.01 224.73,218.71 225.14,218.41 225.50,218.11 225.79,217.81 226.04,217.51 226.24,217.21 226.36,216.92 226.43,216.62 226.45,216.32 226.40,216.02 226.28,215.72 226.11,215.42 225.88,215.12 225.58,214.82 225.21,214.53 224.80,214.23 224.32,213.93 223.76,213.63 223.16,213.33 222.51,213.03 221.78,212.73 221.00,212.44 220.17,212.14 219.29,211.84 218.34,211.54 217.36,211.24 216.32,210.94 215.23,210.64 214.09,210.34 212.92,210.05 211.70,209.75 210.44,209.45 209.14,209.15 207.81,208.85 206.43,208.55 205.02,208.25 203.59,207.96 202.12,207.66 200.62,207.36 199.10,207.06 197.55,206.76 195.98,206.46 194.39,206.16 192.79,205.86 191.16,205.57 189.51,205.27 187.86,204.97 186.19,204.67 184.50,204.37 182.81,204.07 181.12,203.77 179.41,203.48 177.70,203.18 175.99,202.88 174.28,202.58 172.56,202.28 170.85,201.98 169.14,201.68 167.43,201.38 165.73,201.09 164.03,200.79 162.34,200.49 160.65,200.19 158.98,199.89 157.31,199.59 155.66,199.29 154.02,199.00 152.39,198.70 150.78,198.40 149.18,198.10 147.59,197.80 146.01,197.50 144.46,197.20 142.92,196.90 141.39,196.61 139.89,196.31 138.40,196.01 136.92,195.71 135.47,195.41 134.03,195.11 132.61,194.81 131.20,194.52 129.82,194.22 128.46,193.92 127.10,193.62 125.77,193.32 124.46,193.02 123.16,192.72 121.88,192.42 120.62,192.13 119.38,191.83 118.15,191.53 116.94,191.23 115.75,190.93 114.57,190.63 113.40,190.33 112.26,190.04 111.13,189.74 110.02,189.44 108.92,189.14 107.84,188.84 106.77,188.54 105.72,188.24 104.69,187.94 103.67,187.65 102.66,187.35 101.68,187.05 100.71,186.75 99.75,186.45 98.81,186.15 97.89,185.85 96.98,185.56 96.08,185.26 95.21,184.96 94.35,184.66 93.51,184.36 92.68,184.06 91.88,183.76 91.08,183.46 90.31,183.17 89.55,182.87 88.81,182.57 88.09,182.27 87.39,181.97 86.70,181.67 86.03,181.37 85.38,181.08 84.76,180.78 84.14,180.48 83.55,180.18 82.97,179.88 82.42,179.58 81.88,179.28 81.36,178.98 80.86,178.69 80.37,178.39 79.90,178.09 79.46,177.79 79.03,177.49 78.62,177.19 78.22,176.89 77.84,176.60 77.48,176.30 77.13,176.00 76.81,175.70 76.49,175.40 76.19,175.10 75.91,174.80 75.64,174.50 75.39,174.21 75.15,173.91 74.92,173.61 74.70,173.31 74.50,173.01 74.31,172.71 74.13,172.41 73.96,172.12 73.81,171.82 73.66,171.52 73.52,171.22 73.39,170.92 73.27,170.62 73.16,170.32 73.06,170.02 72.96,169.73 72.87,169.43 72.79,169.13 72.71,168.83 72.64,168.53 72.58,168.23 72.52,167.93 72.46,167.64 72.41,167.34 72.36,167.04 72.32,166.74 72.28,166.44 72.25,166.14 72.22,165.84 72.19,165.54 72.16,165.25 72.14,164.95 72.11,164.65 72.10,164.35 72.08,164.05 72.06,163.75 72.05,163.45 ' style='stroke-width: 0.75; stroke: #DF536B;' />
-<polygon points='71.93,240.53 71.93,240.20 71.93,239.87 71.93,239.54 71.93,239.22 71.93,238.89 71.93,238.56 71.93,238.23 71.93,237.90 71.93,237.57 71.93,237.25 71.93,236.92 71.93,236.59 71.93,236.26 71.93,235.93 71.93,235.60 71.93,235.28 71.93,234.95 71.93,234.62 71.93,234.29 71.93,233.96 71.93,233.64 71.93,233.31 71.93,232.98 71.93,232.65 71.93,232.32 71.93,231.99 71.93,231.67 71.93,231.34 71.93,231.01 71.93,230.68 71.93,230.35 71.93,230.02 71.93,229.70 71.93,229.37 71.93,229.04 71.93,228.71 71.93,228.38 71.93,228.06 71.93,227.73 71.93,227.40 71.93,227.07 71.93,226.74 71.93,226.41 71.93,226.09 71.93,225.76 71.93,225.43 71.93,225.10 71.93,224.77 71.93,224.44 71.93,224.12 71.93,223.79 71.93,223.46 71.93,223.13 71.93,222.80 71.93,222.48 71.93,222.15 71.93,221.82 71.93,221.49 71.93,221.16 71.93,220.83 71.93,220.51 71.93,220.18 71.93,219.85 71.93,219.52 71.93,219.19 71.93,218.86 71.93,218.54 71.93,218.21 71.93,217.88 71.93,217.55 71.93,217.22 71.93,216.90 71.93,216.57 71.93,216.24 71.93,215.91 71.93,215.58 71.93,215.25 71.93,214.93 71.93,214.60 71.93,214.27 71.93,213.94 71.93,213.61 71.93,213.28 71.93,212.96 71.93,212.63 71.93,212.30 71.93,211.97 71.93,211.64 71.93,211.32 71.93,210.99 71.93,210.66 71.93,210.33 71.93,210.00 71.93,209.67 71.93,209.35 71.93,209.02 71.93,208.69 71.93,208.36 71.93,208.03 71.93,207.70 71.93,207.38 71.93,207.05 71.93,206.72 71.93,206.39 71.93,206.06 71.93,205.74 71.93,205.41 71.93,205.08 71.93,204.75 71.93,204.42 71.93,204.09 71.93,203.77 71.93,203.44 71.93,203.11 71.93,202.78 71.93,202.45 71.93,202.12 71.93,201.80 71.93,201.47 71.93,201.14 71.93,200.81 71.93,200.48 71.93,200.16 71.93,199.83 71.93,199.50 71.93,199.17 71.93,198.84 71.93,198.51 71.93,198.19 71.93,197.86 71.93,197.53 71.93,197.20 71.93,196.87 71.93,196.54 71.93,196.22 71.93,195.89 71.93,195.56 71.93,195.23 71.93,194.90 71.93,194.58 71.93,194.25 71.93,193.92 71.93,193.59 71.93,193.26 71.93,192.93 71.93,192.61 71.93,192.28 71.93,191.95 71.93,191.62 71.93,191.29 71.93,190.96 71.93,190.64 71.93,190.31 71.93,189.98 71.93,189.65 71.93,189.32 71.93,189.00 71.93,188.67 71.93,188.34 71.93,188.01 71.93,187.68 71.93,187.35 71.93,187.03 71.93,186.70 71.93,186.37 71.93,186.04 71.93,185.71 71.93,185.38 71.93,185.06 71.93,184.73 71.93,184.40 71.93,184.07 71.93,183.74 71.93,183.42 71.93,183.09 71.93,182.76 71.93,182.43 71.93,182.10 71.93,181.77 71.93,181.45 71.93,181.12 71.93,180.79 71.93,180.46 71.93,180.13 71.93,179.80 71.93,179.48 71.93,179.15 71.93,178.82 71.93,178.49 71.93,178.16 71.93,177.84 71.93,177.51 71.93,177.18 71.93,176.85 71.93,176.52 71.93,176.19 71.93,175.87 71.93,175.54 71.93,175.21 71.93,174.88 71.93,174.55 71.93,174.22 71.93,173.90 71.93,173.57 71.93,173.24 71.93,172.91 71.93,172.58 71.93,172.26 71.93,171.93 71.93,171.60 71.93,171.27 71.93,170.94 71.93,170.61 71.93,170.29 71.93,169.96 71.93,169.63 71.93,169.30 71.93,168.97 71.93,168.64 71.93,168.32 71.93,167.99 71.93,167.66 71.93,167.33 71.93,167.00 71.93,166.68 71.93,166.35 71.93,166.02 71.93,165.69 71.93,165.36 71.93,165.03 71.93,164.71 71.93,164.38 71.93,164.05 71.93,163.72 71.93,163.39 71.93,163.06 71.93,162.74 71.93,162.41 71.93,162.08 71.93,161.75 71.93,161.42 71.93,161.10 71.93,160.77 71.93,160.44 71.93,160.11 71.93,159.78 71.93,159.45 71.93,159.13 71.93,158.80 71.93,158.47 71.93,158.14 71.93,157.81 71.93,157.48 71.93,157.16 71.93,156.83 71.93,156.50 71.93,156.17 71.93,155.84 71.93,155.52 71.93,155.19 71.93,154.86 71.93,154.53 71.93,154.20 71.93,153.87 71.93,153.55 71.93,153.22 71.93,152.89 71.93,152.56 71.93,152.23 71.93,151.90 71.93,151.58 71.93,151.25 71.93,150.92 71.93,150.59 71.93,150.26 71.93,149.94 71.93,149.61 71.93,149.28 71.93,148.95 71.93,148.62 71.93,148.29 71.93,147.97 71.93,147.64 71.93,147.31 71.93,146.98 71.93,146.65 71.93,146.32 71.93,146.00 71.93,145.67 71.93,145.34 71.93,145.01 71.93,144.68 71.93,144.36 71.93,144.03 71.93,143.70 71.93,143.37 71.93,143.04 71.93,142.71 71.93,142.39 71.93,142.06 71.93,141.73 71.93,141.40 71.93,141.07 71.93,140.74 71.93,140.42 71.93,140.09 71.93,139.76 71.93,139.43 71.93,139.10 71.93,138.78 71.93,138.45 71.93,138.12 71.93,137.79 71.93,137.46 71.93,137.13 71.93,136.81 71.93,136.48 71.93,136.15 71.93,135.82 71.93,135.49 71.93,135.16 71.93,134.84 71.93,134.51 71.93,134.18 71.93,133.85 71.93,133.52 71.93,133.20 71.93,132.87 71.93,132.54 71.93,132.21 71.93,131.88 71.93,131.55 71.93,131.23 71.93,130.90 71.93,130.57 71.93,130.24 71.93,129.91 71.93,129.58 71.93,129.26 71.93,128.93 71.93,128.60 71.93,128.27 71.93,127.94 71.93,127.62 71.93,127.29 71.93,126.96 71.93,126.63 71.93,126.30 71.93,125.97 71.93,125.65 71.93,125.32 71.93,124.99 71.93,124.66 71.93,124.33 71.93,124.00 71.93,123.68 71.93,123.35 71.93,123.02 71.93,122.69 71.93,122.36 71.93,122.04 71.93,121.71 71.93,121.38 71.93,121.05 71.93,120.72 71.93,120.39 71.93,120.07 71.93,119.74 71.93,119.41 71.93,119.08 71.93,118.75 71.93,118.42 71.93,118.10 71.93,117.77 71.93,117.44 71.93,117.11 71.93,116.78 71.93,116.46 71.93,116.13 71.93,115.80 71.93,115.47 71.93,115.14 71.93,114.81 71.93,114.49 71.93,114.16 71.93,113.83 71.93,113.50 71.93,113.17 71.93,112.84 71.93,112.52 71.93,112.19 71.93,111.86 71.93,111.53 71.93,111.20 71.93,110.88 71.93,110.55 71.93,110.22 71.93,109.89 71.93,109.56 71.93,109.23 71.93,108.91 71.93,108.58 71.93,108.25 71.93,107.92 71.93,107.59 71.93,107.26 71.93,106.94 71.93,106.61 71.93,106.28 71.93,105.95 71.93,105.62 71.93,105.30 71.93,104.97 71.93,104.64 71.93,104.31 71.93,103.98 71.93,103.65 71.93,103.33 71.93,103.00 71.93,102.67 71.93,102.34 71.93,102.01 71.93,101.68 71.93,101.36 71.93,101.03 71.93,100.70 71.93,100.37 71.93,100.04 71.93,99.72 71.93,99.39 71.93,99.06 71.93,98.73 71.93,98.40 71.93,98.07 71.93,97.75 71.93,97.42 71.93,97.09 71.93,96.76 71.93,96.43 71.93,96.10 71.93,95.78 71.93,95.45 71.93,95.12 71.93,94.79 71.93,94.46 71.93,94.14 71.93,93.81 71.93,93.48 71.93,93.15 71.93,92.82 71.93,92.49 71.93,92.17 71.93,91.84 71.93,91.51 71.93,91.18 71.93,90.85 71.93,90.52 71.93,90.20 71.93,89.87 71.93,89.54 71.93,89.21 71.93,88.88 71.93,88.56 71.93,88.23 71.93,87.90 71.93,87.57 71.93,87.24 71.93,86.91 71.93,86.59 71.93,86.26 71.93,85.93 71.93,85.60 71.93,85.27 71.93,84.94 71.93,84.62 71.93,84.29 71.93,83.96 71.93,83.63 71.93,83.30 71.93,82.98 71.93,82.65 71.93,82.32 71.93,81.99 71.93,81.66 71.93,81.33 71.93,81.01 71.93,80.68 71.93,80.35 71.93,80.02 71.93,79.69 71.93,79.36 71.93,79.04 71.93,78.71 71.93,78.38 71.93,78.05 71.93,77.72 71.93,77.40 71.93,77.07 71.93,76.74 71.93,76.41 71.93,76.08 71.93,75.75 71.93,75.43 71.93,75.10 71.93,74.77 71.93,74.44 71.93,74.11 71.93,73.78 71.93,73.46 71.93,73.13 71.93,72.80 72.04,72.80 72.05,73.13 72.06,73.46 72.08,73.78 72.10,74.11 72.12,74.44 72.15,74.77 72.17,75.10 72.20,75.43 72.24,75.75 72.27,76.08 72.31,76.41 72.35,76.74 72.40,77.07 72.45,77.40 72.51,77.72 72.57,78.05 72.64,78.38 72.71,78.71 72.79,79.04 72.87,79.36 72.96,79.69 73.06,80.02 73.17,80.35 73.28,80.68 73.41,81.01 73.54,81.33 73.67,81.66 73.82,81.99 73.98,82.32 74.15,82.65 74.33,82.98 74.52,83.30 74.72,83.63 74.92,83.96 75.15,84.29 75.38,84.62 75.62,84.94 75.88,85.27 76.15,85.60 76.43,85.93 76.72,86.26 77.02,86.59 77.34,86.91 77.67,87.24 78.01,87.57 78.36,87.90 78.72,88.23 79.10,88.56 79.48,88.88 79.88,89.21 80.29,89.54 80.71,89.87 81.15,90.20 81.59,90.52 82.04,90.85 82.50,91.18 82.97,91.51 83.45,91.84 83.94,92.17 84.44,92.49 84.94,92.82 85.46,93.15 85.97,93.48 86.50,93.81 87.03,94.14 87.57,94.46 88.11,94.79 88.65,95.12 89.20,95.45 89.75,95.78 90.30,96.10 90.86,96.43 91.41,96.76 91.97,97.09 92.52,97.42 93.07,97.75 93.62,98.07 94.16,98.40 94.70,98.73 95.23,99.06 95.76,99.39 96.28,99.72 96.79,100.04 97.29,100.37 97.78,100.70 98.25,101.03 98.71,101.36 99.16,101.68 99.60,102.01 100.01,102.34 100.41,102.67 100.79,103.00 101.15,103.33 101.49,103.65 101.81,103.98 102.10,104.31 102.38,104.64 102.63,104.97 102.85,105.30 103.06,105.62 103.23,105.95 103.38,106.28 103.51,106.61 103.62,106.94 103.69,107.26 103.75,107.59 103.78,107.92 103.79,108.25 103.77,108.58 103.73,108.91 103.68,109.23 103.60,109.56 103.51,109.89 103.40,110.22 103.27,110.55 103.13,110.88 102.97,111.20 102.81,111.53 102.64,111.86 102.45,112.19 102.26,112.52 102.07,112.84 101.88,113.17 101.68,113.50 101.49,113.83 101.29,114.16 101.10,114.49 100.92,114.81 100.75,115.14 100.58,115.47 100.42,115.80 100.28,116.13 100.15,116.46 100.03,116.78 99.93,117.11 99.84,117.44 99.77,117.77 99.72,118.10 99.69,118.42 99.67,118.75 99.68,119.08 99.71,119.41 99.76,119.74 99.83,120.07 99.92,120.39 100.05,120.72 100.19,121.05 100.35,121.38 100.54,121.71 100.76,122.04 101.00,122.36 101.26,122.69 101.56,123.02 101.88,123.35 102.22,123.68 102.58,124.00 102.99,124.33 103.41,124.66 103.86,124.99 104.33,125.32 104.84,125.65 105.37,125.97 105.93,126.30 106.51,126.63 107.13,126.96 107.76,127.29 108.42,127.62 109.12,127.94 109.84,128.27 110.58,128.60 111.34,128.93 112.13,129.26 112.94,129.58 113.77,129.91 114.63,130.24 115.50,130.57 116.40,130.90 117.30,131.23 118.23,131.55 119.18,131.88 120.13,132.21 121.09,132.54 122.07,132.87 123.06,133.20 124.05,133.52 125.05,133.85 126.05,134.18 127.06,134.51 128.07,134.84 129.07,135.16 130.08,135.49 131.08,135.82 132.08,136.15 133.07,136.48 134.06,136.81 135.04,137.13 136.02,137.46 136.98,137.79 137.94,138.12 138.89,138.45 139.82,138.78 140.75,139.10 141.68,139.43 142.59,139.76 143.49,140.09 144.39,140.42 145.28,140.74 146.16,141.07 147.04,141.40 147.92,141.73 148.79,142.06 149.66,142.39 150.53,142.71 151.40,143.04 152.28,143.37 153.15,143.70 154.03,144.03 154.92,144.36 155.82,144.68 156.72,145.01 157.64,145.34 158.56,145.67 159.50,146.00 160.45,146.32 161.41,146.65 162.39,146.98 163.38,147.31 164.39,147.64 165.41,147.97 166.45,148.29 167.50,148.62 168.57,148.95 169.65,149.28 170.74,149.61 171.85,149.94 172.97,150.26 174.09,150.59 175.22,150.92 176.36,151.25 177.50,151.58 178.65,151.90 179.79,152.23 180.93,152.56 182.06,152.89 183.18,153.22 184.29,153.55 185.39,153.87 186.47,154.20 187.52,154.53 188.54,154.86 189.54,155.19 190.51,155.52 191.44,155.84 192.33,156.17 193.18,156.50 193.98,156.83 194.73,157.16 195.43,157.48 196.09,157.81 196.67,158.14 197.19,158.47 197.66,158.80 198.07,159.13 198.39,159.45 198.65,159.78 198.85,160.11 198.98,160.44 199.02,160.77 199.01,161.10 198.93,161.42 198.76,161.75 198.52,162.08 198.23,162.41 197.87,162.74 197.43,163.06 196.93,163.39 196.38,163.72 195.77,164.05 195.09,164.38 194.37,164.71 193.61,165.03 192.80,165.36 191.95,165.69 191.07,166.02 190.16,166.35 189.22,166.68 188.27,167.00 187.30,167.33 186.32,167.66 185.35,167.99 184.37,168.32 183.40,168.64 182.45,168.97 181.52,169.30 180.61,169.63 179.72,169.96 178.88,170.29 178.08,170.61 177.32,170.94 176.60,171.27 175.95,171.60 175.35,171.93 174.80,172.26 174.33,172.58 173.92,172.91 173.58,173.24 173.30,173.57 173.12,173.90 173.01,174.22 172.96,174.55 172.99,174.88 173.11,175.21 173.30,175.54 173.55,175.87 173.89,176.19 174.32,176.52 174.80,176.85 175.34,177.18 175.97,177.51 176.65,177.84 177.39,178.16 178.17,178.49 179.03,178.82 179.92,179.15 180.85,179.48 181.81,179.80 182.82,180.13 183.84,180.46 184.87,180.79 185.93,181.12 186.99,181.45 188.05,181.77 189.10,182.10 190.14,182.43 191.16,182.76 192.15,183.09 193.12,183.42 194.04,183.74 194.92,184.07 195.76,184.40 196.54,184.73 197.25,185.06 197.91,185.38 198.51,185.71 199.01,186.04 199.44,186.37 199.81,186.70 200.08,187.03 200.26,187.35 200.36,187.68 200.38,188.01 200.28,188.34 200.10,188.67 199.83,189.00 199.48,189.32 199.00,189.65 198.44,189.98 197.80,190.31 197.07,190.64 196.22,190.96 195.31,191.29 194.31,191.62 193.22,191.95 192.04,192.28 190.79,192.61 189.48,192.93 188.07,193.26 186.59,193.59 185.06,193.92 183.47,194.25 181.80,194.58 180.09,194.90 178.33,195.23 176.51,195.56 174.65,195.89 172.75,196.22 170.82,196.54 168.84,196.87 166.84,197.20 164.82,197.53 162.78,197.86 160.71,198.19 158.63,198.51 156.53,198.84 154.43,199.17 152.33,199.50 150.22,199.83 148.12,200.16 146.02,200.48 143.93,200.81 141.85,201.14 139.78,201.47 137.74,201.80 135.71,202.12 133.70,202.45 131.72,202.78 129.78,203.11 127.85,203.44 125.96,203.77 124.11,204.09 122.30,204.42 120.52,204.75 118.77,205.08 117.09,205.41 115.44,205.74 113.83,206.06 112.26,206.39 110.76,206.72 109.29,207.05 107.87,207.38 106.51,207.70 105.19,208.03 103.92,208.36 102.70,208.69 101.54,209.02 100.42,209.35 99.34,209.67 98.32,210.00 97.35,210.33 96.42,210.66 95.52,210.99 94.68,211.32 93.89,211.64 93.12,211.97 92.39,212.30 91.71,212.63 91.06,212.96 90.44,213.28 89.85,213.61 89.30,213.94 88.77,214.27 88.26,214.60 87.79,214.93 87.33,215.25 86.89,215.58 86.47,215.91 86.07,216.24 85.68,216.57 85.30,216.90 84.94,217.22 84.58,217.55 84.24,217.88 83.90,218.21 83.57,218.54 83.25,218.86 82.93,219.19 82.61,219.52 82.30,219.85 81.99,220.18 81.68,220.51 81.38,220.83 81.08,221.16 80.78,221.49 80.48,221.82 80.18,222.15 79.89,222.48 79.59,222.80 79.30,223.13 79.01,223.46 78.73,223.79 78.45,224.12 78.17,224.44 77.89,224.77 77.62,225.10 77.35,225.43 77.09,225.76 76.84,226.09 76.59,226.41 76.34,226.74 76.11,227.07 75.88,227.40 75.65,227.73 75.43,228.06 75.23,228.38 75.02,228.71 74.83,229.04 74.64,229.37 74.46,229.70 74.29,230.02 74.13,230.35 73.98,230.68 73.83,231.01 73.69,231.34 73.55,231.67 73.43,231.99 73.31,232.32 73.20,232.65 73.10,232.98 73.00,233.31 72.91,233.64 72.83,233.96 72.75,234.29 72.68,234.62 72.61,234.95 72.54,235.28 72.49,235.60 72.43,235.93 72.38,236.26 72.34,236.59 72.30,236.92 72.26,237.25 72.23,237.57 72.20,237.90 72.17,238.23 72.14,238.56 72.12,238.89 72.10,239.22 72.08,239.54 72.06,239.87 72.05,240.20 72.03,240.53 ' style='stroke-width: 0.75; stroke: none; fill: #61D04F; fill-opacity: 0.10;' />
-<polyline points='72.03,240.53 72.05,240.20 72.06,239.87 72.08,239.54 72.10,239.22 72.12,238.89 72.14,238.56 72.17,238.23 72.20,237.90 72.23,237.57 72.26,237.25 72.30,236.92 72.34,236.59 72.38,236.26 72.43,235.93 72.49,235.60 72.54,235.28 72.61,234.95 72.68,234.62 72.75,234.29 72.83,233.96 72.91,233.64 73.00,233.31 73.10,232.98 73.20,232.65 73.31,232.32 73.43,231.99 73.55,231.67 73.69,231.34 73.83,231.01 73.98,230.68 74.13,230.35 74.29,230.02 74.46,229.70 74.64,229.37 74.83,229.04 75.02,228.71 75.23,228.38 75.43,228.06 75.65,227.73 75.88,227.40 76.11,227.07 76.34,226.74 76.59,226.41 76.84,226.09 77.09,225.76 77.35,225.43 77.62,225.10 77.89,224.77 78.17,224.44 78.45,224.12 78.73,223.79 79.01,223.46 79.30,223.13 79.59,222.80 79.89,222.48 80.18,222.15 80.48,221.82 80.78,221.49 81.08,221.16 81.38,220.83 81.68,220.51 81.99,220.18 82.30,219.85 82.61,219.52 82.93,219.19 83.25,218.86 83.57,218.54 83.90,218.21 84.24,217.88 84.58,217.55 84.94,217.22 85.30,216.90 85.68,216.57 86.07,216.24 86.47,215.91 86.89,215.58 87.33,215.25 87.79,214.93 88.26,214.60 88.77,214.27 89.30,213.94 89.85,213.61 90.44,213.28 91.06,212.96 91.71,212.63 92.39,212.30 93.12,211.97 93.89,211.64 94.68,211.32 95.52,210.99 96.42,210.66 97.35,210.33 98.32,210.00 99.34,209.67 100.42,209.35 101.54,209.02 102.70,208.69 103.92,208.36 105.19,208.03 106.51,207.70 107.87,207.38 109.29,207.05 110.76,206.72 112.26,206.39 113.83,206.06 115.44,205.74 117.09,205.41 118.77,205.08 120.52,204.75 122.30,204.42 124.11,204.09 125.96,203.77 127.85,203.44 129.78,203.11 131.72,202.78 133.70,202.45 135.71,202.12 137.74,201.80 139.78,201.47 141.85,201.14 143.93,200.81 146.02,200.48 148.12,200.16 150.22,199.83 152.33,199.50 154.43,199.17 156.53,198.84 158.63,198.51 160.71,198.19 162.78,197.86 164.82,197.53 166.84,197.20 168.84,196.87 170.82,196.54 172.75,196.22 174.65,195.89 176.51,195.56 178.33,195.23 180.09,194.90 181.80,194.58 183.47,194.25 185.06,193.92 186.59,193.59 188.07,193.26 189.48,192.93 190.79,192.61 192.04,192.28 193.22,191.95 194.31,191.62 195.31,191.29 196.22,190.96 197.07,190.64 197.80,190.31 198.44,189.98 199.00,189.65 199.48,189.32 199.83,189.00 200.10,188.67 200.28,188.34 200.38,188.01 200.36,187.68 200.26,187.35 200.08,187.03 199.81,186.70 199.44,186.37 199.01,186.04 198.51,185.71 197.91,185.38 197.25,185.06 196.54,184.73 195.76,184.40 194.92,184.07 194.04,183.74 193.12,183.42 192.15,183.09 191.16,182.76 190.14,182.43 189.10,182.10 188.05,181.77 186.99,181.45 185.93,181.12 184.87,180.79 183.84,180.46 182.82,180.13 181.81,179.80 180.85,179.48 179.92,179.15 179.03,178.82 178.17,178.49 177.39,178.16 176.65,177.84 175.97,177.51 175.34,177.18 174.80,176.85 174.32,176.52 173.89,176.19 173.55,175.87 173.30,175.54 173.11,175.21 172.99,174.88 172.96,174.55 173.01,174.22 173.12,173.90 173.30,173.57 173.58,173.24 173.92,172.91 174.33,172.58 174.80,172.26 175.35,171.93 175.95,171.60 176.60,171.27 177.32,170.94 178.08,170.61 178.88,170.29 179.72,169.96 180.61,169.63 181.52,169.30 182.45,168.97 183.40,168.64 184.37,168.32 185.35,167.99 186.32,167.66 187.30,167.33 188.27,167.00 189.22,166.68 190.16,166.35 191.07,166.02 191.95,165.69 192.80,165.36 193.61,165.03 194.37,164.71 195.09,164.38 195.77,164.05 196.38,163.72 196.93,163.39 197.43,163.06 197.87,162.74 198.23,162.41 198.52,162.08 198.76,161.75 198.93,161.42 199.01,161.10 199.02,160.77 198.98,160.44 198.85,160.11 198.65,159.78 198.39,159.45 198.07,159.13 197.66,158.80 197.19,158.47 196.67,158.14 196.09,157.81 195.43,157.48 194.73,157.16 193.98,156.83 193.18,156.50 192.33,156.17 191.44,155.84 190.51,155.52 189.54,155.19 188.54,154.86 187.52,154.53 186.47,154.20 185.39,153.87 184.29,153.55 183.18,153.22 182.06,152.89 180.93,152.56 179.79,152.23 178.65,151.90 177.50,151.58 176.36,151.25 175.22,150.92 174.09,150.59 172.97,150.26 171.85,149.94 170.74,149.61 169.65,149.28 168.57,148.95 167.50,148.62 166.45,148.29 165.41,147.97 164.39,147.64 163.38,147.31 162.39,146.98 161.41,146.65 160.45,146.32 159.50,146.00 158.56,145.67 157.64,145.34 156.72,145.01 155.82,144.68 154.92,144.36 154.03,144.03 153.15,143.70 152.28,143.37 151.40,143.04 150.53,142.71 149.66,142.39 148.79,142.06 147.92,141.73 147.04,141.40 146.16,141.07 145.28,140.74 144.39,140.42 143.49,140.09 142.59,139.76 141.68,139.43 140.75,139.10 139.82,138.78 138.89,138.45 137.94,138.12 136.98,137.79 136.02,137.46 135.04,137.13 134.06,136.81 133.07,136.48 132.08,136.15 131.08,135.82 130.08,135.49 129.07,135.16 128.07,134.84 127.06,134.51 126.05,134.18 125.05,133.85 124.05,133.52 123.06,133.20 122.07,132.87 121.09,132.54 120.13,132.21 119.18,131.88 118.23,131.55 117.30,131.23 116.40,130.90 115.50,130.57 114.63,130.24 113.77,129.91 112.94,129.58 112.13,129.26 111.34,128.93 110.58,128.60 109.84,128.27 109.12,127.94 108.42,127.62 107.76,127.29 107.13,126.96 106.51,126.63 105.93,126.30 105.37,125.97 104.84,125.65 104.33,125.32 103.86,124.99 103.41,124.66 102.99,124.33 102.58,124.00 102.22,123.68 101.88,123.35 101.56,123.02 101.26,122.69 101.00,122.36 100.76,122.04 100.54,121.71 100.35,121.38 100.19,121.05 100.05,120.72 99.92,120.39 99.83,120.07 99.76,119.74 99.71,119.41 99.68,119.08 99.67,118.75 99.69,118.42 99.72,118.10 99.77,117.77 99.84,117.44 99.93,117.11 100.03,116.78 100.15,116.46 100.28,116.13 100.42,115.80 100.58,115.47 100.75,115.14 100.92,114.81 101.10,114.49 101.29,114.16 101.49,113.83 101.68,113.50 101.88,113.17 102.07,112.84 102.26,112.52 102.45,112.19 102.64,111.86 102.81,111.53 102.97,111.20 103.13,110.88 103.27,110.55 103.40,110.22 103.51,109.89 103.60,109.56 103.68,109.23 103.73,108.91 103.77,108.58 103.79,108.25 103.78,107.92 103.75,107.59 103.69,107.26 103.62,106.94 103.51,106.61 103.38,106.28 103.23,105.95 103.06,105.62 102.85,105.30 102.63,104.97 102.38,104.64 102.10,104.31 101.81,103.98 101.49,103.65 101.15,103.33 100.79,103.00 100.41,102.67 100.01,102.34 99.60,102.01 99.16,101.68 98.71,101.36 98.25,101.03 97.78,100.70 97.29,100.37 96.79,100.04 96.28,99.72 95.76,99.39 95.23,99.06 94.70,98.73 94.16,98.40 93.62,98.07 93.07,97.75 92.52,97.42 91.97,97.09 91.41,96.76 90.86,96.43 90.30,96.10 89.75,95.78 89.20,95.45 88.65,95.12 88.11,94.79 87.57,94.46 87.03,94.14 86.50,93.81 85.97,93.48 85.46,93.15 84.94,92.82 84.44,92.49 83.94,92.17 83.45,91.84 82.97,91.51 82.50,91.18 82.04,90.85 81.59,90.52 81.15,90.20 80.71,89.87 80.29,89.54 79.88,89.21 79.48,88.88 79.10,88.56 78.72,88.23 78.36,87.90 78.01,87.57 77.67,87.24 77.34,86.91 77.02,86.59 76.72,86.26 76.43,85.93 76.15,85.60 75.88,85.27 75.62,84.94 75.38,84.62 75.15,84.29 74.92,83.96 74.72,83.63 74.52,83.30 74.33,82.98 74.15,82.65 73.98,82.32 73.82,81.99 73.67,81.66 73.54,81.33 73.41,81.01 73.28,80.68 73.17,80.35 73.06,80.02 72.96,79.69 72.87,79.36 72.79,79.04 72.71,78.71 72.64,78.38 72.57,78.05 72.51,77.72 72.45,77.40 72.40,77.07 72.35,76.74 72.31,76.41 72.27,76.08 72.24,75.75 72.20,75.43 72.17,75.10 72.15,74.77 72.12,74.44 72.10,74.11 72.08,73.78 72.06,73.46 72.05,73.13 72.04,72.80 ' style='stroke-width: 0.75; stroke: #61D04F;' />
+<polygon points='71.83,416.80 71.83,416.62 71.83,416.44 71.83,416.26 71.83,416.08 71.83,415.90 71.83,415.72 71.83,415.54 71.83,415.36 71.83,415.18 71.83,415.00 71.83,414.82 71.83,414.64 71.83,414.45 71.83,414.27 71.83,414.09 71.83,413.91 71.83,413.73 71.83,413.55 71.83,413.37 71.83,413.19 71.83,413.01 71.83,412.83 71.83,412.65 71.83,412.47 71.83,412.29 71.83,412.11 71.83,411.93 71.83,411.75 71.83,411.57 71.83,411.39 71.83,411.21 71.83,411.03 71.83,410.85 71.83,410.67 71.83,410.49 71.83,410.31 71.83,410.13 71.83,409.94 71.83,409.76 71.83,409.58 71.83,409.40 71.83,409.22 71.83,409.04 71.83,408.86 71.83,408.68 71.83,408.50 71.83,408.32 71.83,408.14 71.83,407.96 71.83,407.78 71.83,407.60 71.83,407.42 71.83,407.24 71.83,407.06 71.83,406.88 71.83,406.70 71.83,406.52 71.83,406.34 71.83,406.16 71.83,405.98 71.83,405.80 71.83,405.62 71.83,405.43 71.83,405.25 71.83,405.07 71.83,404.89 71.83,404.71 71.83,404.53 71.83,404.35 71.83,404.17 71.83,403.99 71.83,403.81 71.83,403.63 71.83,403.45 71.83,403.27 71.83,403.09 71.83,402.91 71.83,402.73 71.83,402.55 71.83,402.37 71.83,402.19 71.83,402.01 71.83,401.83 71.83,401.65 71.83,401.47 71.83,401.29 71.83,401.11 71.83,400.92 71.83,400.74 71.83,400.56 71.83,400.38 71.83,400.20 71.83,400.02 71.83,399.84 71.83,399.66 71.83,399.48 71.83,399.30 71.83,399.12 71.83,398.94 71.83,398.76 71.83,398.58 71.83,398.40 71.83,398.22 71.83,398.04 71.83,397.86 71.83,397.68 71.83,397.50 71.83,397.32 71.83,397.14 71.83,396.96 71.83,396.78 71.83,396.60 71.83,396.42 71.83,396.23 71.83,396.05 71.83,395.87 71.83,395.69 71.83,395.51 71.83,395.33 71.83,395.15 71.83,394.97 71.83,394.79 71.83,394.61 71.83,394.43 71.83,394.25 71.83,394.07 71.83,393.89 71.83,393.71 71.83,393.53 71.83,393.35 71.83,393.17 71.83,392.99 71.83,392.81 71.83,392.63 71.83,392.45 71.83,392.27 71.83,392.09 71.83,391.91 71.83,391.72 71.83,391.54 71.83,391.36 71.83,391.18 71.83,391.00 71.83,390.82 71.83,390.64 71.83,390.46 71.83,390.28 71.83,390.10 71.83,389.92 71.83,389.74 71.83,389.56 71.83,389.38 71.83,389.20 71.83,389.02 71.83,388.84 71.83,388.66 71.83,388.48 71.83,388.30 71.83,388.12 71.83,387.94 71.83,387.76 71.83,387.58 71.83,387.40 71.83,387.21 71.83,387.03 71.83,386.85 71.83,386.67 71.83,386.49 71.83,386.31 71.83,386.13 71.83,385.95 71.83,385.77 71.83,385.59 71.83,385.41 71.83,385.23 71.83,385.05 71.83,384.87 71.83,384.69 71.83,384.51 71.83,384.33 71.83,384.15 71.83,383.97 71.83,383.79 71.83,383.61 71.83,383.43 71.83,383.25 71.83,383.07 71.83,382.89 71.83,382.70 71.83,382.52 71.83,382.34 71.83,382.16 71.83,381.98 71.83,381.80 71.83,381.62 71.83,381.44 71.83,381.26 71.83,381.08 71.83,380.90 71.83,380.72 71.83,380.54 71.83,380.36 71.83,380.18 71.83,380.00 71.83,379.82 71.83,379.64 71.83,379.46 71.83,379.28 71.83,379.10 71.83,378.92 71.83,378.74 71.83,378.56 71.83,378.38 71.83,378.19 71.83,378.01 71.83,377.83 71.83,377.65 71.83,377.47 71.83,377.29 71.83,377.11 71.83,376.93 71.83,376.75 71.83,376.57 71.83,376.39 71.83,376.21 71.83,376.03 71.83,375.85 71.83,375.67 71.83,375.49 71.83,375.31 71.83,375.13 71.83,374.95 71.83,374.77 71.83,374.59 71.83,374.41 71.83,374.23 71.83,374.05 71.83,373.87 71.83,373.68 71.83,373.50 71.83,373.32 71.83,373.14 71.83,372.96 71.83,372.78 71.83,372.60 71.83,372.42 71.83,372.24 71.83,372.06 71.83,371.88 71.83,371.70 71.83,371.52 71.83,371.34 71.83,371.16 71.83,370.98 71.83,370.80 71.83,370.62 71.83,370.44 71.83,370.26 71.83,370.08 71.83,369.90 71.83,369.72 71.83,369.54 71.83,369.36 71.83,369.17 71.83,368.99 71.83,368.81 71.83,368.63 71.83,368.45 71.83,368.27 71.83,368.09 71.83,367.91 71.83,367.73 71.83,367.55 71.83,367.37 71.83,367.19 71.83,367.01 71.83,366.83 71.83,366.65 71.83,366.47 71.83,366.29 71.83,366.11 71.83,365.93 71.83,365.75 71.83,365.57 71.83,365.39 71.83,365.21 71.83,365.03 71.83,364.85 71.83,364.66 71.83,364.48 71.83,364.30 71.83,364.12 71.83,363.94 71.83,363.76 71.83,363.58 71.83,363.40 71.83,363.22 71.83,363.04 71.83,362.86 71.83,362.68 71.83,362.50 71.83,362.32 71.83,362.14 71.83,361.96 71.83,361.78 71.83,361.60 71.83,361.42 71.83,361.24 71.83,361.06 71.83,360.88 71.83,360.70 71.83,360.52 71.83,360.34 71.83,360.16 71.83,359.97 71.83,359.79 71.83,359.61 71.83,359.43 71.83,359.25 71.83,359.07 71.83,358.89 71.83,358.71 71.83,358.53 71.83,358.35 71.83,358.17 71.83,357.99 71.83,357.81 71.83,357.63 71.83,357.45 71.83,357.27 71.83,357.09 71.83,356.91 71.83,356.73 71.83,356.55 71.83,356.37 71.83,356.19 71.83,356.01 71.83,355.83 71.83,355.65 71.83,355.46 71.83,355.28 71.83,355.10 71.83,354.92 71.83,354.74 71.83,354.56 71.83,354.38 71.83,354.20 71.83,354.02 71.83,353.84 71.83,353.66 71.83,353.48 71.83,353.30 71.83,353.12 71.83,352.94 71.83,352.76 71.83,352.58 71.83,352.40 71.83,352.22 71.83,352.04 71.83,351.86 71.83,351.68 71.83,351.50 71.83,351.32 71.83,351.14 71.83,350.95 71.83,350.77 71.83,350.59 71.83,350.41 71.83,350.23 71.83,350.05 71.83,349.87 71.83,349.69 71.83,349.51 71.83,349.33 71.83,349.15 71.83,348.97 71.83,348.79 71.83,348.61 71.83,348.43 71.83,348.25 71.83,348.07 71.83,347.89 71.83,347.71 71.83,347.53 71.83,347.35 71.83,347.17 71.83,346.99 71.83,346.81 71.83,346.63 71.83,346.44 71.83,346.26 71.83,346.08 71.83,345.90 71.83,345.72 71.83,345.54 71.83,345.36 71.83,345.18 71.83,345.00 71.83,344.82 71.83,344.64 71.83,344.46 71.83,344.28 71.83,344.10 71.83,343.92 71.83,343.74 71.83,343.56 71.83,343.38 71.83,343.20 71.83,343.02 71.83,342.84 71.83,342.66 71.83,342.48 71.83,342.30 71.83,342.12 71.83,341.93 71.83,341.75 71.83,341.57 71.83,341.39 71.83,341.21 71.83,341.03 71.83,340.85 71.83,340.67 71.83,340.49 71.83,340.31 71.83,340.13 71.83,339.95 71.83,339.77 71.83,339.59 71.83,339.41 71.83,339.23 71.83,339.05 71.83,338.87 71.83,338.69 71.83,338.51 71.83,338.33 71.83,338.15 71.83,337.97 71.83,337.79 71.83,337.61 71.83,337.42 71.83,337.24 71.83,337.06 71.83,336.88 71.83,336.70 71.83,336.52 71.83,336.34 71.83,336.16 71.83,335.98 71.83,335.80 71.83,335.62 71.83,335.44 71.83,335.26 71.83,335.08 71.83,334.90 71.83,334.72 71.83,334.54 71.83,334.36 71.83,334.18 71.83,334.00 71.83,333.82 71.83,333.64 71.83,333.46 71.83,333.28 71.83,333.10 71.83,332.91 71.83,332.73 71.83,332.55 71.83,332.37 71.83,332.19 71.83,332.01 71.83,331.83 71.83,331.65 71.83,331.47 71.83,331.29 71.83,331.11 71.83,330.93 71.83,330.75 71.83,330.57 71.83,330.39 71.83,330.21 71.83,330.03 71.83,329.85 71.83,329.67 71.83,329.49 71.83,329.31 71.83,329.13 71.83,328.95 71.83,328.77 71.83,328.59 71.83,328.40 71.83,328.22 71.83,328.04 71.83,327.86 71.83,327.68 71.83,327.50 71.83,327.32 71.83,327.14 71.83,326.96 71.83,326.78 71.83,326.60 71.83,326.42 71.83,326.24 71.83,326.06 71.83,325.88 71.83,325.70 71.83,325.52 71.83,325.34 71.83,325.16 71.83,324.98 71.83,324.80 71.83,324.62 72.04,324.62 72.05,324.80 72.07,324.98 72.08,325.16 72.10,325.34 72.12,325.52 72.14,325.70 72.16,325.88 72.19,326.06 72.21,326.24 72.24,326.42 72.26,326.60 72.29,326.78 72.32,326.96 72.36,327.14 72.39,327.32 72.42,327.50 72.46,327.68 72.50,327.86 72.54,328.04 72.59,328.22 72.64,328.40 72.68,328.59 72.74,328.77 72.79,328.95 72.85,329.13 72.91,329.31 72.97,329.49 73.03,329.67 73.10,329.85 73.18,330.03 73.25,330.21 73.33,330.39 73.41,330.57 73.50,330.75 73.59,330.93 73.68,331.11 73.78,331.29 73.88,331.47 73.99,331.65 74.10,331.83 74.22,332.01 74.34,332.19 74.47,332.37 74.60,332.55 74.73,332.73 74.88,332.91 75.02,333.10 75.17,333.28 75.33,333.46 75.50,333.64 75.67,333.82 75.84,334.00 76.02,334.18 76.21,334.36 76.41,334.54 76.61,334.72 76.82,334.90 77.03,335.08 77.26,335.26 77.49,335.44 77.73,335.62 77.97,335.80 78.22,335.98 78.48,336.16 78.75,336.34 79.02,336.52 79.31,336.70 79.60,336.88 79.90,337.06 80.21,337.24 80.53,337.42 80.85,337.61 81.19,337.79 81.53,337.97 81.88,338.15 82.25,338.33 82.62,338.51 83.00,338.69 83.39,338.87 83.79,339.05 84.20,339.23 84.62,339.41 85.05,339.59 85.49,339.77 85.94,339.95 86.40,340.13 86.87,340.31 87.36,340.49 87.86,340.67 88.36,340.85 88.88,341.03 89.41,341.21 89.95,341.39 90.50,341.57 91.07,341.75 91.65,341.93 92.24,342.12 92.85,342.30 93.46,342.48 94.09,342.66 94.74,342.84 95.40,343.02 96.07,343.20 96.76,343.38 97.46,343.56 98.18,343.74 98.91,343.92 99.67,344.10 100.43,344.28 101.22,344.46 102.02,344.64 102.83,344.82 103.67,345.00 104.53,345.18 105.40,345.36 106.29,345.54 107.20,345.72 108.14,345.90 109.09,346.08 110.06,346.26 111.06,346.44 112.07,346.63 113.12,346.81 114.18,346.99 115.27,347.17 116.38,347.35 117.51,347.53 118.68,347.71 119.86,347.89 121.07,348.07 122.31,348.25 123.58,348.43 124.88,348.61 126.19,348.79 127.55,348.97 128.93,349.15 130.34,349.33 131.79,349.51 133.25,349.69 134.77,349.87 136.30,350.05 137.87,350.23 139.48,350.41 141.11,350.59 142.79,350.77 144.49,350.95 146.23,351.14 148.01,351.32 149.81,351.50 151.66,351.68 153.54,351.86 155.46,352.04 157.42,352.22 159.40,352.40 161.45,352.58 163.51,352.76 165.61,352.94 167.76,353.12 169.93,353.30 172.16,353.48 174.40,353.66 176.70,353.84 179.03,354.02 181.39,354.20 183.80,354.38 186.23,354.56 188.71,354.74 191.23,354.92 193.77,355.10 196.36,355.28 198.97,355.46 201.63,355.65 204.31,355.83 207.02,356.01 209.78,356.19 212.55,356.37 215.37,356.55 218.21,356.73 221.08,356.91 223.98,357.09 226.90,357.27 229.85,357.45 232.83,357.63 235.82,357.81 238.84,357.99 241.88,358.17 244.94,358.35 248.02,358.53 251.11,358.71 254.22,358.89 257.34,359.07 260.47,359.25 263.62,359.43 266.77,359.61 269.93,359.79 273.09,359.97 276.25,360.16 279.42,360.34 282.59,360.52 285.75,360.70 288.91,360.88 292.06,361.06 295.20,361.24 298.33,361.42 301.45,361.60 304.56,361.78 307.64,361.96 310.70,362.14 313.75,362.32 316.77,362.50 319.77,362.68 322.72,362.86 325.66,363.04 328.56,363.22 331.43,363.40 334.26,363.58 337.04,363.76 339.80,363.94 342.49,364.12 345.15,364.30 347.77,364.48 350.31,364.66 352.82,364.85 355.27,365.03 357.65,365.21 360.00,365.39 362.25,365.57 364.47,365.75 366.61,365.93 368.68,366.11 370.70,366.29 372.61,366.47 374.49,366.65 376.26,366.83 377.98,367.01 379.62,367.19 381.15,367.37 382.65,367.55 384.02,367.73 385.33,367.91 386.55,368.09 387.67,368.27 388.74,368.45 389.68,368.63 390.55,368.81 391.34,368.99 392.01,369.17 392.63,369.36 393.11,369.54 393.53,369.72 393.84,369.90 394.05,370.08 394.21,370.26 394.21,370.44 394.16,370.62 394.00,370.80 393.74,370.98 393.42,371.16 392.95,371.34 392.43,371.52 391.79,371.70 391.06,371.88 390.28,372.06 389.34,372.24 388.36,372.42 387.27,372.60 386.08,372.78 384.84,372.96 383.46,373.14 382.04,373.32 380.51,373.50 378.90,373.68 377.23,373.87 375.44,374.05 373.61,374.23 371.68,374.41 369.68,374.59 367.62,374.77 365.46,374.95 363.26,375.13 360.96,375.31 358.62,375.49 356.21,375.67 353.73,375.85 351.21,376.03 348.60,376.21 345.96,376.39 343.27,376.57 340.51,376.75 337.72,376.93 334.86,377.11 331.98,377.29 329.05,377.47 326.07,377.65 323.08,377.83 320.03,378.01 316.96,378.19 313.86,378.38 310.72,378.56 307.58,378.74 304.39,378.92 301.20,379.10 297.98,379.28 294.75,379.46 291.51,379.64 288.26,379.82 285.00,380.00 281.73,380.18 278.45,380.36 275.18,380.54 271.90,380.72 268.63,380.90 265.36,381.08 262.10,381.26 258.84,381.44 255.60,381.62 252.37,381.80 249.15,381.98 245.94,382.16 242.75,382.34 239.59,382.52 236.44,382.70 233.31,382.89 230.21,383.07 227.12,383.25 224.08,383.43 221.04,383.61 218.05,383.79 215.08,383.97 212.14,384.15 209.24,384.33 206.36,384.51 203.52,384.69 200.71,384.87 197.94,385.05 195.21,385.23 192.50,385.41 189.85,385.59 187.22,385.77 184.63,385.95 182.09,386.13 179.57,386.31 177.11,386.49 174.67,386.67 172.28,386.85 169.93,387.03 167.61,387.21 165.35,387.40 163.12,387.58 160.92,387.76 158.78,387.94 156.65,388.12 154.59,388.30 152.56,388.48 150.57,388.66 148.62,388.84 146.69,389.02 144.83,389.20 142.99,389.38 141.19,389.56 139.43,389.74 137.70,389.92 136.02,390.10 134.36,390.28 132.75,390.46 131.17,390.64 129.62,390.82 128.12,391.00 126.64,391.18 125.20,391.36 123.79,391.54 122.41,391.72 121.07,391.91 119.75,392.09 118.47,392.27 117.21,392.45 115.98,392.63 114.79,392.81 113.62,392.99 112.48,393.17 111.37,393.35 110.28,393.53 109.23,393.71 108.18,393.89 107.18,394.07 106.19,394.25 105.23,394.43 104.30,394.61 103.37,394.79 102.49,394.97 101.61,395.15 100.76,395.33 99.93,395.51 99.12,395.69 98.34,395.87 97.56,396.05 96.81,396.23 96.08,396.42 95.36,396.60 94.67,396.78 93.99,396.96 93.33,397.14 92.68,397.32 92.05,397.50 91.44,397.68 90.83,397.86 90.25,398.04 89.68,398.22 89.12,398.40 88.59,398.58 88.06,398.76 87.54,398.94 87.04,399.12 86.55,399.30 86.08,399.48 85.61,399.66 85.16,399.84 84.72,400.02 84.29,400.20 83.88,400.38 83.47,400.56 83.07,400.74 82.69,400.92 82.31,401.11 81.95,401.29 81.59,401.47 81.25,401.65 80.92,401.83 80.59,402.01 80.27,402.19 79.97,402.37 79.67,402.55 79.38,402.73 79.09,402.91 78.82,403.09 78.56,403.27 78.30,403.45 78.05,403.63 77.81,403.81 77.57,403.99 77.35,404.17 77.13,404.35 76.91,404.53 76.71,404.71 76.51,404.89 76.31,405.07 76.13,405.25 75.95,405.43 75.77,405.62 75.60,405.80 75.44,405.98 75.29,406.16 75.13,406.34 74.99,406.52 74.85,406.70 74.71,406.88 74.58,407.06 74.45,407.24 74.33,407.42 74.22,407.60 74.10,407.78 74.00,407.96 73.89,408.14 73.79,408.32 73.70,408.50 73.61,408.68 73.52,408.86 73.44,409.04 73.36,409.22 73.28,409.40 73.20,409.58 73.13,409.76 73.07,409.94 73.00,410.13 72.94,410.31 72.88,410.49 72.82,410.67 72.77,410.85 72.72,411.03 72.67,411.21 72.62,411.39 72.58,411.57 72.54,411.75 72.50,411.93 72.46,412.11 72.42,412.29 72.39,412.47 72.36,412.65 72.33,412.83 72.30,413.01 72.27,413.19 72.24,413.37 72.22,413.55 72.19,413.73 72.17,413.91 72.15,414.09 72.13,414.27 72.11,414.45 72.09,414.64 72.08,414.82 72.06,415.00 72.05,415.18 72.03,415.36 72.02,415.54 72.01,415.72 71.99,415.90 71.98,416.08 71.97,416.26 71.96,416.44 71.95,416.62 71.95,416.80 ' style='stroke-width: 0.75; stroke: none; fill: #000000; fill-opacity: 0.10;' />
+<polyline points='71.95,416.80 71.95,416.62 71.96,416.44 71.97,416.26 71.98,416.08 71.99,415.90 72.01,415.72 72.02,415.54 72.03,415.36 72.05,415.18 72.06,415.00 72.08,414.82 72.09,414.64 72.11,414.45 72.13,414.27 72.15,414.09 72.17,413.91 72.19,413.73 72.22,413.55 72.24,413.37 72.27,413.19 72.30,413.01 72.33,412.83 72.36,412.65 72.39,412.47 72.42,412.29 72.46,412.11 72.50,411.93 72.54,411.75 72.58,411.57 72.62,411.39 72.67,411.21 72.72,411.03 72.77,410.85 72.82,410.67 72.88,410.49 72.94,410.31 73.00,410.13 73.07,409.94 73.13,409.76 73.20,409.58 73.28,409.40 73.36,409.22 73.44,409.04 73.52,408.86 73.61,408.68 73.70,408.50 73.79,408.32 73.89,408.14 74.00,407.96 74.10,407.78 74.22,407.60 74.33,407.42 74.45,407.24 74.58,407.06 74.71,406.88 74.85,406.70 74.99,406.52 75.13,406.34 75.29,406.16 75.44,405.98 75.60,405.80 75.77,405.62 75.95,405.43 76.13,405.25 76.31,405.07 76.51,404.89 76.71,404.71 76.91,404.53 77.13,404.35 77.35,404.17 77.57,403.99 77.81,403.81 78.05,403.63 78.30,403.45 78.56,403.27 78.82,403.09 79.09,402.91 79.38,402.73 79.67,402.55 79.97,402.37 80.27,402.19 80.59,402.01 80.92,401.83 81.25,401.65 81.59,401.47 81.95,401.29 82.31,401.11 82.69,400.92 83.07,400.74 83.47,400.56 83.88,400.38 84.29,400.20 84.72,400.02 85.16,399.84 85.61,399.66 86.08,399.48 86.55,399.30 87.04,399.12 87.54,398.94 88.06,398.76 88.59,398.58 89.12,398.40 89.68,398.22 90.25,398.04 90.83,397.86 91.44,397.68 92.05,397.50 92.68,397.32 93.33,397.14 93.99,396.96 94.67,396.78 95.36,396.60 96.08,396.42 96.81,396.23 97.56,396.05 98.34,395.87 99.12,395.69 99.93,395.51 100.76,395.33 101.61,395.15 102.49,394.97 103.37,394.79 104.30,394.61 105.23,394.43 106.19,394.25 107.18,394.07 108.18,393.89 109.23,393.71 110.28,393.53 111.37,393.35 112.48,393.17 113.62,392.99 114.79,392.81 115.98,392.63 117.21,392.45 118.47,392.27 119.75,392.09 121.07,391.91 122.41,391.72 123.79,391.54 125.20,391.36 126.64,391.18 128.12,391.00 129.62,390.82 131.17,390.64 132.75,390.46 134.36,390.28 136.02,390.10 137.70,389.92 139.43,389.74 141.19,389.56 142.99,389.38 144.83,389.20 146.69,389.02 148.62,388.84 150.57,388.66 152.56,388.48 154.59,388.30 156.65,388.12 158.78,387.94 160.92,387.76 163.12,387.58 165.35,387.40 167.61,387.21 169.93,387.03 172.28,386.85 174.67,386.67 177.11,386.49 179.57,386.31 182.09,386.13 184.63,385.95 187.22,385.77 189.85,385.59 192.50,385.41 195.21,385.23 197.94,385.05 200.71,384.87 203.52,384.69 206.36,384.51 209.24,384.33 212.14,384.15 215.08,383.97 218.05,383.79 221.04,383.61 224.08,383.43 227.12,383.25 230.21,383.07 233.31,382.89 236.44,382.70 239.59,382.52 242.75,382.34 245.94,382.16 249.15,381.98 252.37,381.80 255.60,381.62 258.84,381.44 262.10,381.26 265.36,381.08 268.63,380.90 271.90,380.72 275.18,380.54 278.45,380.36 281.73,380.18 285.00,380.00 288.26,379.82 291.51,379.64 294.75,379.46 297.98,379.28 301.20,379.10 304.39,378.92 307.58,378.74 310.72,378.56 313.86,378.38 316.96,378.19 320.03,378.01 323.08,377.83 326.07,377.65 329.05,377.47 331.98,377.29 334.86,377.11 337.72,376.93 340.51,376.75 343.27,376.57 345.96,376.39 348.60,376.21 351.21,376.03 353.73,375.85 356.21,375.67 358.62,375.49 360.96,375.31 363.26,375.13 365.46,374.95 367.62,374.77 369.68,374.59 371.68,374.41 373.61,374.23 375.44,374.05 377.23,373.87 378.90,373.68 380.51,373.50 382.04,373.32 383.46,373.14 384.84,372.96 386.08,372.78 387.27,372.60 388.36,372.42 389.34,372.24 390.28,372.06 391.06,371.88 391.79,371.70 392.43,371.52 392.95,371.34 393.42,371.16 393.74,370.98 394.00,370.80 394.16,370.62 394.21,370.44 394.21,370.26 394.05,370.08 393.84,369.90 393.53,369.72 393.11,369.54 392.63,369.36 392.01,369.17 391.34,368.99 390.55,368.81 389.68,368.63 388.74,368.45 387.67,368.27 386.55,368.09 385.33,367.91 384.02,367.73 382.65,367.55 381.15,367.37 379.62,367.19 377.98,367.01 376.26,366.83 374.49,366.65 372.61,366.47 370.70,366.29 368.68,366.11 366.61,365.93 364.47,365.75 362.25,365.57 360.00,365.39 357.65,365.21 355.27,365.03 352.82,364.85 350.31,364.66 347.77,364.48 345.15,364.30 342.49,364.12 339.80,363.94 337.04,363.76 334.26,363.58 331.43,363.40 328.56,363.22 325.66,363.04 322.72,362.86 319.77,362.68 316.77,362.50 313.75,362.32 310.70,362.14 307.64,361.96 304.56,361.78 301.45,361.60 298.33,361.42 295.20,361.24 292.06,361.06 288.91,360.88 285.75,360.70 282.59,360.52 279.42,360.34 276.25,360.16 273.09,359.97 269.93,359.79 266.77,359.61 263.62,359.43 260.47,359.25 257.34,359.07 254.22,358.89 251.11,358.71 248.02,358.53 244.94,358.35 241.88,358.17 238.84,357.99 235.82,357.81 232.83,357.63 229.85,357.45 226.90,357.27 223.98,357.09 221.08,356.91 218.21,356.73 215.37,356.55 212.55,356.37 209.78,356.19 207.02,356.01 204.31,355.83 201.63,355.65 198.97,355.46 196.36,355.28 193.77,355.10 191.23,354.92 188.71,354.74 186.23,354.56 183.80,354.38 181.39,354.20 179.03,354.02 176.70,353.84 174.40,353.66 172.16,353.48 169.93,353.30 167.76,353.12 165.61,352.94 163.51,352.76 161.45,352.58 159.40,352.40 157.42,352.22 155.46,352.04 153.54,351.86 151.66,351.68 149.81,351.50 148.01,351.32 146.23,351.14 144.49,350.95 142.79,350.77 141.11,350.59 139.48,350.41 137.87,350.23 136.30,350.05 134.77,349.87 133.25,349.69 131.79,349.51 130.34,349.33 128.93,349.15 127.55,348.97 126.19,348.79 124.88,348.61 123.58,348.43 122.31,348.25 121.07,348.07 119.86,347.89 118.68,347.71 117.51,347.53 116.38,347.35 115.27,347.17 114.18,346.99 113.12,346.81 112.07,346.63 111.06,346.44 110.06,346.26 109.09,346.08 108.14,345.90 107.20,345.72 106.29,345.54 105.40,345.36 104.53,345.18 103.67,345.00 102.83,344.82 102.02,344.64 101.22,344.46 100.43,344.28 99.67,344.10 98.91,343.92 98.18,343.74 97.46,343.56 96.76,343.38 96.07,343.20 95.40,343.02 94.74,342.84 94.09,342.66 93.46,342.48 92.85,342.30 92.24,342.12 91.65,341.93 91.07,341.75 90.50,341.57 89.95,341.39 89.41,341.21 88.88,341.03 88.36,340.85 87.86,340.67 87.36,340.49 86.87,340.31 86.40,340.13 85.94,339.95 85.49,339.77 85.05,339.59 84.62,339.41 84.20,339.23 83.79,339.05 83.39,338.87 83.00,338.69 82.62,338.51 82.25,338.33 81.88,338.15 81.53,337.97 81.19,337.79 80.85,337.61 80.53,337.42 80.21,337.24 79.90,337.06 79.60,336.88 79.31,336.70 79.02,336.52 78.75,336.34 78.48,336.16 78.22,335.98 77.97,335.80 77.73,335.62 77.49,335.44 77.26,335.26 77.03,335.08 76.82,334.90 76.61,334.72 76.41,334.54 76.21,334.36 76.02,334.18 75.84,334.00 75.67,333.82 75.50,333.64 75.33,333.46 75.17,333.28 75.02,333.10 74.88,332.91 74.73,332.73 74.60,332.55 74.47,332.37 74.34,332.19 74.22,332.01 74.10,331.83 73.99,331.65 73.88,331.47 73.78,331.29 73.68,331.11 73.59,330.93 73.50,330.75 73.41,330.57 73.33,330.39 73.25,330.21 73.18,330.03 73.10,329.85 73.03,329.67 72.97,329.49 72.91,329.31 72.85,329.13 72.79,328.95 72.74,328.77 72.68,328.59 72.64,328.40 72.59,328.22 72.54,328.04 72.50,327.86 72.46,327.68 72.42,327.50 72.39,327.32 72.36,327.14 72.32,326.96 72.29,326.78 72.26,326.60 72.24,326.42 72.21,326.24 72.19,326.06 72.16,325.88 72.14,325.70 72.12,325.52 72.10,325.34 72.08,325.16 72.07,324.98 72.05,324.80 72.04,324.62 ' style='stroke-width: 0.75;' />
+<polygon points='71.83,316.07 71.83,315.77 71.83,315.48 71.83,315.18 71.83,314.88 71.83,314.58 71.83,314.28 71.83,313.98 71.83,313.68 71.83,313.39 71.83,313.09 71.83,312.79 71.83,312.49 71.83,312.19 71.83,311.89 71.83,311.59 71.83,311.29 71.83,311.00 71.83,310.70 71.83,310.40 71.83,310.10 71.83,309.80 71.83,309.50 71.83,309.20 71.83,308.91 71.83,308.61 71.83,308.31 71.83,308.01 71.83,307.71 71.83,307.41 71.83,307.11 71.83,306.81 71.83,306.52 71.83,306.22 71.83,305.92 71.83,305.62 71.83,305.32 71.83,305.02 71.83,304.72 71.83,304.43 71.83,304.13 71.83,303.83 71.83,303.53 71.83,303.23 71.83,302.93 71.83,302.63 71.83,302.33 71.83,302.04 71.83,301.74 71.83,301.44 71.83,301.14 71.83,300.84 71.83,300.54 71.83,300.24 71.83,299.95 71.83,299.65 71.83,299.35 71.83,299.05 71.83,298.75 71.83,298.45 71.83,298.15 71.83,297.85 71.83,297.56 71.83,297.26 71.83,296.96 71.83,296.66 71.83,296.36 71.83,296.06 71.83,295.76 71.83,295.47 71.83,295.17 71.83,294.87 71.83,294.57 71.83,294.27 71.83,293.97 71.83,293.67 71.83,293.37 71.83,293.08 71.83,292.78 71.83,292.48 71.83,292.18 71.83,291.88 71.83,291.58 71.83,291.28 71.83,290.99 71.83,290.69 71.83,290.39 71.83,290.09 71.83,289.79 71.83,289.49 71.83,289.19 71.83,288.89 71.83,288.60 71.83,288.30 71.83,288.00 71.83,287.70 71.83,287.40 71.83,287.10 71.83,286.80 71.83,286.51 71.83,286.21 71.83,285.91 71.83,285.61 71.83,285.31 71.83,285.01 71.83,284.71 71.83,284.41 71.83,284.12 71.83,283.82 71.83,283.52 71.83,283.22 71.83,282.92 71.83,282.62 71.83,282.32 71.83,282.03 71.83,281.73 71.83,281.43 71.83,281.13 71.83,280.83 71.83,280.53 71.83,280.23 71.83,279.93 71.83,279.64 71.83,279.34 71.83,279.04 71.83,278.74 71.83,278.44 71.83,278.14 71.83,277.84 71.83,277.55 71.83,277.25 71.83,276.95 71.83,276.65 71.83,276.35 71.83,276.05 71.83,275.75 71.83,275.45 71.83,275.16 71.83,274.86 71.83,274.56 71.83,274.26 71.83,273.96 71.83,273.66 71.83,273.36 71.83,273.07 71.83,272.77 71.83,272.47 71.83,272.17 71.83,271.87 71.83,271.57 71.83,271.27 71.83,270.97 71.83,270.68 71.83,270.38 71.83,270.08 71.83,269.78 71.83,269.48 71.83,269.18 71.83,268.88 71.83,268.59 71.83,268.29 71.83,267.99 71.83,267.69 71.83,267.39 71.83,267.09 71.83,266.79 71.83,266.49 71.83,266.20 71.83,265.90 71.83,265.60 71.83,265.30 71.83,265.00 71.83,264.70 71.83,264.40 71.83,264.11 71.83,263.81 71.83,263.51 71.83,263.21 71.83,262.91 71.83,262.61 71.83,262.31 71.83,262.01 71.83,261.72 71.83,261.42 71.83,261.12 71.83,260.82 71.83,260.52 71.83,260.22 71.83,259.92 71.83,259.63 71.83,259.33 71.83,259.03 71.83,258.73 71.83,258.43 71.83,258.13 71.83,257.83 71.83,257.53 71.83,257.24 71.83,256.94 71.83,256.64 71.83,256.34 71.83,256.04 71.83,255.74 71.83,255.44 71.83,255.15 71.83,254.85 71.83,254.55 71.83,254.25 71.83,253.95 71.83,253.65 71.83,253.35 71.83,253.05 71.83,252.76 71.83,252.46 71.83,252.16 71.83,251.86 71.83,251.56 71.83,251.26 71.83,250.96 71.83,250.67 71.83,250.37 71.83,250.07 71.83,249.77 71.83,249.47 71.83,249.17 71.83,248.87 71.83,248.57 71.83,248.28 71.83,247.98 71.83,247.68 71.83,247.38 71.83,247.08 71.83,246.78 71.83,246.48 71.83,246.19 71.83,245.89 71.83,245.59 71.83,245.29 71.83,244.99 71.83,244.69 71.83,244.39 71.83,244.09 71.83,243.80 71.83,243.50 71.83,243.20 71.83,242.90 71.83,242.60 71.83,242.30 71.83,242.00 71.83,241.71 71.83,241.41 71.83,241.11 71.83,240.81 71.83,240.51 71.83,240.21 71.83,239.91 71.83,239.61 71.83,239.32 71.83,239.02 71.83,238.72 71.83,238.42 71.83,238.12 71.83,237.82 71.83,237.52 71.83,237.22 71.83,236.93 71.83,236.63 71.83,236.33 71.83,236.03 71.83,235.73 71.83,235.43 71.83,235.13 71.83,234.84 71.83,234.54 71.83,234.24 71.83,233.94 71.83,233.64 71.83,233.34 71.83,233.04 71.83,232.74 71.83,232.45 71.83,232.15 71.83,231.85 71.83,231.55 71.83,231.25 71.83,230.95 71.83,230.65 71.83,230.36 71.83,230.06 71.83,229.76 71.83,229.46 71.83,229.16 71.83,228.86 71.83,228.56 71.83,228.26 71.83,227.97 71.83,227.67 71.83,227.37 71.83,227.07 71.83,226.77 71.83,226.47 71.83,226.17 71.83,225.88 71.83,225.58 71.83,225.28 71.83,224.98 71.83,224.68 71.83,224.38 71.83,224.08 71.83,223.78 71.83,223.49 71.83,223.19 71.83,222.89 71.83,222.59 71.83,222.29 71.83,221.99 71.83,221.69 71.83,221.40 71.83,221.10 71.83,220.80 71.83,220.50 71.83,220.20 71.83,219.90 71.83,219.60 71.83,219.30 71.83,219.01 71.83,218.71 71.83,218.41 71.83,218.11 71.83,217.81 71.83,217.51 71.83,217.21 71.83,216.92 71.83,216.62 71.83,216.32 71.83,216.02 71.83,215.72 71.83,215.42 71.83,215.12 71.83,214.82 71.83,214.53 71.83,214.23 71.83,213.93 71.83,213.63 71.83,213.33 71.83,213.03 71.83,212.73 71.83,212.44 71.83,212.14 71.83,211.84 71.83,211.54 71.83,211.24 71.83,210.94 71.83,210.64 71.83,210.34 71.83,210.05 71.83,209.75 71.83,209.45 71.83,209.15 71.83,208.85 71.83,208.55 71.83,208.25 71.83,207.96 71.83,207.66 71.83,207.36 71.83,207.06 71.83,206.76 71.83,206.46 71.83,206.16 71.83,205.86 71.83,205.57 71.83,205.27 71.83,204.97 71.83,204.67 71.83,204.37 71.83,204.07 71.83,203.77 71.83,203.48 71.83,203.18 71.83,202.88 71.83,202.58 71.83,202.28 71.83,201.98 71.83,201.68 71.83,201.38 71.83,201.09 71.83,200.79 71.83,200.49 71.83,200.19 71.83,199.89 71.83,199.59 71.83,199.29 71.83,199.00 71.83,198.70 71.83,198.40 71.83,198.10 71.83,197.80 71.83,197.50 71.83,197.20 71.83,196.90 71.83,196.61 71.83,196.31 71.83,196.01 71.83,195.71 71.83,195.41 71.83,195.11 71.83,194.81 71.83,194.52 71.83,194.22 71.83,193.92 71.83,193.62 71.83,193.32 71.83,193.02 71.83,192.72 71.83,192.42 71.83,192.13 71.83,191.83 71.83,191.53 71.83,191.23 71.83,190.93 71.83,190.63 71.83,190.33 71.83,190.04 71.83,189.74 71.83,189.44 71.83,189.14 71.83,188.84 71.83,188.54 71.83,188.24 71.83,187.94 71.83,187.65 71.83,187.35 71.83,187.05 71.83,186.75 71.83,186.45 71.83,186.15 71.83,185.85 71.83,185.56 71.83,185.26 71.83,184.96 71.83,184.66 71.83,184.36 71.83,184.06 71.83,183.76 71.83,183.46 71.83,183.17 71.83,182.87 71.83,182.57 71.83,182.27 71.83,181.97 71.83,181.67 71.83,181.37 71.83,181.08 71.83,180.78 71.83,180.48 71.83,180.18 71.83,179.88 71.83,179.58 71.83,179.28 71.83,178.98 71.83,178.69 71.83,178.39 71.83,178.09 71.83,177.79 71.83,177.49 71.83,177.19 71.83,176.89 71.83,176.60 71.83,176.30 71.83,176.00 71.83,175.70 71.83,175.40 71.83,175.10 71.83,174.80 71.83,174.50 71.83,174.21 71.83,173.91 71.83,173.61 71.83,173.31 71.83,173.01 71.83,172.71 71.83,172.41 71.83,172.12 71.83,171.82 71.83,171.52 71.83,171.22 71.83,170.92 71.83,170.62 71.83,170.32 71.83,170.02 71.83,169.73 71.83,169.43 71.83,169.13 71.83,168.83 71.83,168.53 71.83,168.23 71.83,167.93 71.83,167.64 71.83,167.34 71.83,167.04 71.83,166.74 71.83,166.44 71.83,166.14 71.83,165.84 71.83,165.54 71.83,165.25 71.83,164.95 71.83,164.65 71.83,164.35 71.83,164.05 71.83,163.75 71.83,163.45 71.95,163.45 71.96,163.75 71.98,164.05 71.99,164.35 72.01,164.65 72.03,164.95 72.06,165.25 72.09,165.54 72.11,165.84 72.15,166.14 72.18,166.44 72.22,166.74 72.26,167.04 72.31,167.34 72.36,167.64 72.41,167.93 72.47,168.23 72.54,168.53 72.61,168.83 72.69,169.13 72.77,169.43 72.86,169.73 72.95,170.02 73.06,170.32 73.17,170.62 73.29,170.92 73.42,171.22 73.56,171.52 73.70,171.82 73.86,172.12 74.03,172.41 74.21,172.71 74.40,173.01 74.60,173.31 74.82,173.61 75.04,173.91 75.29,174.21 75.54,174.50 75.81,174.80 76.09,175.10 76.39,175.40 76.71,175.70 77.03,176.00 77.38,176.30 77.74,176.60 78.12,176.89 78.52,177.19 78.93,177.49 79.36,177.79 79.80,178.09 80.27,178.39 80.76,178.69 81.26,178.98 81.78,179.28 82.32,179.58 82.88,179.88 83.45,180.18 84.05,180.48 84.66,180.78 85.29,181.08 85.94,181.37 86.61,181.67 87.29,181.97 87.99,182.27 88.72,182.57 89.46,182.87 90.21,183.17 90.99,183.46 91.78,183.76 92.59,184.06 93.41,184.36 94.26,184.66 95.12,184.96 95.99,185.26 96.88,185.56 97.79,185.85 98.72,186.15 99.66,186.45 100.62,186.75 101.59,187.05 102.57,187.35 103.58,187.65 104.60,187.94 105.63,188.24 106.68,188.54 107.75,188.84 108.83,189.14 109.93,189.44 111.04,189.74 112.17,190.04 113.32,190.33 114.48,190.63 115.66,190.93 116.85,191.23 118.06,191.53 119.29,191.83 120.54,192.13 121.80,192.42 123.08,192.72 124.38,193.02 125.69,193.32 127.02,193.62 128.37,193.92 129.74,194.22 131.12,194.52 132.53,194.81 133.95,195.11 135.38,195.41 136.84,195.71 138.32,196.01 139.81,196.31 141.31,196.61 142.84,196.90 144.38,197.20 145.94,197.50 147.51,197.80 149.10,198.10 150.70,198.40 152.31,198.70 153.95,199.00 155.59,199.29 157.24,199.59 158.91,199.89 160.58,200.19 162.26,200.49 163.95,200.79 165.65,201.09 167.36,201.38 169.06,201.68 170.78,201.98 172.49,202.28 174.21,202.58 175.92,202.88 177.63,203.18 179.34,203.48 181.05,203.77 182.75,204.07 184.44,204.37 186.12,204.67 187.79,204.97 189.45,205.27 191.09,205.57 192.72,205.86 194.33,206.16 195.92,206.46 197.49,206.76 199.04,207.06 200.56,207.36 202.06,207.66 203.53,207.96 204.96,208.25 206.37,208.55 207.75,208.85 209.08,209.15 210.38,209.45 211.64,209.75 212.87,210.05 214.04,210.34 215.17,210.64 216.27,210.94 217.30,211.24 218.29,211.54 219.23,211.84 220.12,212.14 220.94,212.44 221.72,212.73 222.46,213.03 223.11,213.33 223.71,213.63 224.26,213.93 224.74,214.23 225.16,214.53 225.52,214.82 225.83,215.12 226.06,215.42 226.23,215.72 226.35,216.02 226.40,216.32 226.38,216.62 226.31,216.92 226.19,217.21 225.99,217.51 225.74,217.81 225.45,218.11 225.08,218.41 224.67,218.71 224.22,219.01 223.72,219.30 223.16,219.60 222.57,219.90 221.94,220.20 221.26,220.50 220.56,220.80 219.83,221.10 219.07,221.40 218.28,221.69 217.47,221.99 216.65,222.29 215.81,222.59 214.96,222.89 214.11,223.19 213.25,223.49 212.39,223.78 211.53,224.08 210.68,224.38 209.84,224.68 209.01,224.98 208.19,225.28 207.40,225.58 206.62,225.88 205.87,226.17 205.14,226.47 204.44,226.77 203.76,227.07 203.11,227.37 202.51,227.67 201.93,227.97 201.38,228.26 200.86,228.56 200.39,228.86 199.94,229.16 199.52,229.46 199.15,229.76 198.81,230.06 198.49,230.36 198.21,230.65 197.96,230.95 197.74,231.25 197.54,231.55 197.38,231.85 197.24,232.15 197.11,232.45 197.01,232.74 196.92,233.04 196.85,233.34 196.79,233.64 196.75,233.94 196.70,234.24 196.67,234.54 196.63,234.84 196.59,235.13 196.55,235.43 196.50,235.73 196.44,236.03 196.36,236.33 196.28,236.63 196.17,236.93 196.04,237.22 195.88,237.52 195.70,237.82 195.49,238.12 195.25,238.42 194.98,238.72 194.66,239.02 194.31,239.32 193.92,239.61 193.49,239.91 193.01,240.21 192.50,240.51 191.94,240.81 191.32,241.11 190.66,241.41 189.96,241.71 189.20,242.00 188.39,242.30 187.54,242.60 186.65,242.90 185.69,243.20 184.70,243.50 183.66,243.80 182.57,244.09 181.44,244.39 180.27,244.69 179.06,244.99 177.80,245.29 176.51,245.59 175.19,245.89 173.83,246.19 172.45,246.48 171.03,246.78 169.60,247.08 168.13,247.38 166.65,247.68 165.16,247.98 163.65,248.28 162.13,248.57 160.60,248.87 159.07,249.17 157.53,249.47 156.00,249.77 154.47,250.07 152.95,250.37 151.44,250.67 149.94,250.96 148.46,251.26 147.00,251.56 145.56,251.86 144.14,252.16 142.75,252.46 141.38,252.76 140.04,253.05 138.74,253.35 137.47,253.65 136.23,253.95 135.02,254.25 133.86,254.55 132.73,254.85 131.63,255.15 130.59,255.44 129.58,255.74 128.60,256.04 127.66,256.34 126.77,256.64 125.92,256.94 125.09,257.24 124.32,257.53 123.58,257.83 122.88,258.13 122.21,258.43 121.58,258.73 120.98,259.03 120.41,259.33 119.88,259.63 119.38,259.92 118.90,260.22 118.46,260.52 118.04,260.82 117.64,261.12 117.26,261.42 116.91,261.72 116.58,262.01 116.26,262.31 115.96,262.61 115.68,262.91 115.40,263.21 115.14,263.51 114.90,263.81 114.66,264.11 114.43,264.40 114.20,264.70 113.98,265.00 113.77,265.30 113.56,265.60 113.34,265.90 113.14,266.20 112.93,266.49 112.72,266.79 112.50,267.09 112.29,267.39 112.07,267.69 111.85,267.99 111.63,268.29 111.40,268.59 111.16,268.88 110.92,269.18 110.68,269.48 110.43,269.78 110.17,270.08 109.90,270.38 109.63,270.68 109.35,270.97 109.06,271.27 108.76,271.57 108.46,271.87 108.15,272.17 107.83,272.47 107.50,272.77 107.17,273.07 106.83,273.36 106.48,273.66 106.12,273.96 105.75,274.26 105.38,274.56 105.00,274.86 104.62,275.16 104.22,275.45 103.82,275.75 103.42,276.05 103.01,276.35 102.59,276.65 102.16,276.95 101.74,277.25 101.30,277.55 100.87,277.84 100.43,278.14 99.99,278.44 99.54,278.74 99.09,279.04 98.65,279.34 98.20,279.64 97.75,279.93 97.30,280.23 96.86,280.53 96.41,280.83 95.97,281.13 95.53,281.43 95.09,281.73 94.66,282.03 94.24,282.32 93.82,282.62 93.40,282.92 93.00,283.22 92.60,283.52 92.20,283.82 91.82,284.12 91.44,284.41 91.07,284.71 90.71,285.01 90.36,285.31 90.02,285.61 89.69,285.91 89.36,286.21 89.05,286.51 88.74,286.80 88.44,287.10 88.15,287.40 87.86,287.70 87.59,288.00 87.32,288.30 87.06,288.60 86.80,288.89 86.55,289.19 86.31,289.49 86.07,289.79 85.83,290.09 85.60,290.39 85.37,290.69 85.14,290.99 84.92,291.28 84.70,291.58 84.47,291.88 84.25,292.18 84.03,292.48 83.81,292.78 83.59,293.08 83.36,293.37 83.14,293.67 82.91,293.97 82.68,294.27 82.45,294.57 82.22,294.87 81.99,295.17 81.75,295.47 81.51,295.76 81.27,296.06 81.03,296.36 80.78,296.66 80.53,296.96 80.29,297.26 80.04,297.56 79.79,297.85 79.54,298.15 79.29,298.45 79.04,298.75 78.79,299.05 78.54,299.35 78.29,299.65 78.05,299.95 77.80,300.24 77.56,300.54 77.32,300.84 77.09,301.14 76.86,301.44 76.63,301.74 76.41,302.04 76.19,302.33 75.98,302.63 75.77,302.93 75.57,303.23 75.37,303.53 75.18,303.83 74.99,304.13 74.81,304.43 74.64,304.72 74.48,305.02 74.32,305.32 74.16,305.62 74.02,305.92 73.87,306.22 73.74,306.52 73.61,306.81 73.49,307.11 73.37,307.41 73.26,307.71 73.16,308.01 73.06,308.31 72.97,308.61 72.88,308.91 72.80,309.20 72.73,309.50 72.65,309.80 72.59,310.10 72.52,310.40 72.46,310.70 72.41,311.00 72.36,311.29 72.31,311.59 72.27,311.89 72.23,312.19 72.19,312.49 72.16,312.79 72.13,313.09 72.10,313.39 72.07,313.68 72.05,313.98 72.03,314.28 72.01,314.58 71.99,314.88 71.97,315.18 71.96,315.48 71.94,315.77 71.93,316.07 ' style='stroke-width: 0.75; stroke: none; fill: #DF536B; fill-opacity: 0.10;' />
+<polyline points='71.93,316.07 71.94,315.77 71.96,315.48 71.97,315.18 71.99,314.88 72.01,314.58 72.03,314.28 72.05,313.98 72.07,313.68 72.10,313.39 72.13,313.09 72.16,312.79 72.19,312.49 72.23,312.19 72.27,311.89 72.31,311.59 72.36,311.29 72.41,311.00 72.46,310.70 72.52,310.40 72.59,310.10 72.65,309.80 72.73,309.50 72.80,309.20 72.88,308.91 72.97,308.61 73.06,308.31 73.16,308.01 73.26,307.71 73.37,307.41 73.49,307.11 73.61,306.81 73.74,306.52 73.87,306.22 74.02,305.92 74.16,305.62 74.32,305.32 74.48,305.02 74.64,304.72 74.81,304.43 74.99,304.13 75.18,303.83 75.37,303.53 75.57,303.23 75.77,302.93 75.98,302.63 76.19,302.33 76.41,302.04 76.63,301.74 76.86,301.44 77.09,301.14 77.32,300.84 77.56,300.54 77.80,300.24 78.05,299.95 78.29,299.65 78.54,299.35 78.79,299.05 79.04,298.75 79.29,298.45 79.54,298.15 79.79,297.85 80.04,297.56 80.29,297.26 80.53,296.96 80.78,296.66 81.03,296.36 81.27,296.06 81.51,295.76 81.75,295.47 81.99,295.17 82.22,294.87 82.45,294.57 82.68,294.27 82.91,293.97 83.14,293.67 83.36,293.37 83.59,293.08 83.81,292.78 84.03,292.48 84.25,292.18 84.47,291.88 84.70,291.58 84.92,291.28 85.14,290.99 85.37,290.69 85.60,290.39 85.83,290.09 86.07,289.79 86.31,289.49 86.55,289.19 86.80,288.89 87.06,288.60 87.32,288.30 87.59,288.00 87.86,287.70 88.15,287.40 88.44,287.10 88.74,286.80 89.05,286.51 89.36,286.21 89.69,285.91 90.02,285.61 90.36,285.31 90.71,285.01 91.07,284.71 91.44,284.41 91.82,284.12 92.20,283.82 92.60,283.52 93.00,283.22 93.40,282.92 93.82,282.62 94.24,282.32 94.66,282.03 95.09,281.73 95.53,281.43 95.97,281.13 96.41,280.83 96.86,280.53 97.30,280.23 97.75,279.93 98.20,279.64 98.65,279.34 99.09,279.04 99.54,278.74 99.99,278.44 100.43,278.14 100.87,277.84 101.30,277.55 101.74,277.25 102.16,276.95 102.59,276.65 103.01,276.35 103.42,276.05 103.82,275.75 104.22,275.45 104.62,275.16 105.00,274.86 105.38,274.56 105.75,274.26 106.12,273.96 106.48,273.66 106.83,273.36 107.17,273.07 107.50,272.77 107.83,272.47 108.15,272.17 108.46,271.87 108.76,271.57 109.06,271.27 109.35,270.97 109.63,270.68 109.90,270.38 110.17,270.08 110.43,269.78 110.68,269.48 110.92,269.18 111.16,268.88 111.40,268.59 111.63,268.29 111.85,267.99 112.07,267.69 112.29,267.39 112.50,267.09 112.72,266.79 112.93,266.49 113.14,266.20 113.34,265.90 113.56,265.60 113.77,265.30 113.98,265.00 114.20,264.70 114.43,264.40 114.66,264.11 114.90,263.81 115.14,263.51 115.40,263.21 115.68,262.91 115.96,262.61 116.26,262.31 116.58,262.01 116.91,261.72 117.26,261.42 117.64,261.12 118.04,260.82 118.46,260.52 118.90,260.22 119.38,259.92 119.88,259.63 120.41,259.33 120.98,259.03 121.58,258.73 122.21,258.43 122.88,258.13 123.58,257.83 124.32,257.53 125.09,257.24 125.92,256.94 126.77,256.64 127.66,256.34 128.60,256.04 129.58,255.74 130.59,255.44 131.63,255.15 132.73,254.85 133.86,254.55 135.02,254.25 136.23,253.95 137.47,253.65 138.74,253.35 140.04,253.05 141.38,252.76 142.75,252.46 144.14,252.16 145.56,251.86 147.00,251.56 148.46,251.26 149.94,250.96 151.44,250.67 152.95,250.37 154.47,250.07 156.00,249.77 157.53,249.47 159.07,249.17 160.60,248.87 162.13,248.57 163.65,248.28 165.16,247.98 166.65,247.68 168.13,247.38 169.60,247.08 171.03,246.78 172.45,246.48 173.83,246.19 175.19,245.89 176.51,245.59 177.80,245.29 179.06,244.99 180.27,244.69 181.44,244.39 182.57,244.09 183.66,243.80 184.70,243.50 185.69,243.20 186.65,242.90 187.54,242.60 188.39,242.30 189.20,242.00 189.96,241.71 190.66,241.41 191.32,241.11 191.94,240.81 192.50,240.51 193.01,240.21 193.49,239.91 193.92,239.61 194.31,239.32 194.66,239.02 194.98,238.72 195.25,238.42 195.49,238.12 195.70,237.82 195.88,237.52 196.04,237.22 196.17,236.93 196.28,236.63 196.36,236.33 196.44,236.03 196.50,235.73 196.55,235.43 196.59,235.13 196.63,234.84 196.67,234.54 196.70,234.24 196.75,233.94 196.79,233.64 196.85,233.34 196.92,233.04 197.01,232.74 197.11,232.45 197.24,232.15 197.38,231.85 197.54,231.55 197.74,231.25 197.96,230.95 198.21,230.65 198.49,230.36 198.81,230.06 199.15,229.76 199.52,229.46 199.94,229.16 200.39,228.86 200.86,228.56 201.38,228.26 201.93,227.97 202.51,227.67 203.11,227.37 203.76,227.07 204.44,226.77 205.14,226.47 205.87,226.17 206.62,225.88 207.40,225.58 208.19,225.28 209.01,224.98 209.84,224.68 210.68,224.38 211.53,224.08 212.39,223.78 213.25,223.49 214.11,223.19 214.96,222.89 215.81,222.59 216.65,222.29 217.47,221.99 218.28,221.69 219.07,221.40 219.83,221.10 220.56,220.80 221.26,220.50 221.94,220.20 222.57,219.90 223.16,219.60 223.72,219.30 224.22,219.01 224.67,218.71 225.08,218.41 225.45,218.11 225.74,217.81 225.99,217.51 226.19,217.21 226.31,216.92 226.38,216.62 226.40,216.32 226.35,216.02 226.23,215.72 226.06,215.42 225.83,215.12 225.52,214.82 225.16,214.53 224.74,214.23 224.26,213.93 223.71,213.63 223.11,213.33 222.46,213.03 221.72,212.73 220.94,212.44 220.12,212.14 219.23,211.84 218.29,211.54 217.30,211.24 216.27,210.94 215.17,210.64 214.04,210.34 212.87,210.05 211.64,209.75 210.38,209.45 209.08,209.15 207.75,208.85 206.37,208.55 204.96,208.25 203.53,207.96 202.06,207.66 200.56,207.36 199.04,207.06 197.49,206.76 195.92,206.46 194.33,206.16 192.72,205.86 191.09,205.57 189.45,205.27 187.79,204.97 186.12,204.67 184.44,204.37 182.75,204.07 181.05,203.77 179.34,203.48 177.63,203.18 175.92,202.88 174.21,202.58 172.49,202.28 170.78,201.98 169.06,201.68 167.36,201.38 165.65,201.09 163.95,200.79 162.26,200.49 160.58,200.19 158.91,199.89 157.24,199.59 155.59,199.29 153.95,199.00 152.31,198.70 150.70,198.40 149.10,198.10 147.51,197.80 145.94,197.50 144.38,197.20 142.84,196.90 141.31,196.61 139.81,196.31 138.32,196.01 136.84,195.71 135.38,195.41 133.95,195.11 132.53,194.81 131.12,194.52 129.74,194.22 128.37,193.92 127.02,193.62 125.69,193.32 124.38,193.02 123.08,192.72 121.80,192.42 120.54,192.13 119.29,191.83 118.06,191.53 116.85,191.23 115.66,190.93 114.48,190.63 113.32,190.33 112.17,190.04 111.04,189.74 109.93,189.44 108.83,189.14 107.75,188.84 106.68,188.54 105.63,188.24 104.60,187.94 103.58,187.65 102.57,187.35 101.59,187.05 100.62,186.75 99.66,186.45 98.72,186.15 97.79,185.85 96.88,185.56 95.99,185.26 95.12,184.96 94.26,184.66 93.41,184.36 92.59,184.06 91.78,183.76 90.99,183.46 90.21,183.17 89.46,182.87 88.72,182.57 87.99,182.27 87.29,181.97 86.61,181.67 85.94,181.37 85.29,181.08 84.66,180.78 84.05,180.48 83.45,180.18 82.88,179.88 82.32,179.58 81.78,179.28 81.26,178.98 80.76,178.69 80.27,178.39 79.80,178.09 79.36,177.79 78.93,177.49 78.52,177.19 78.12,176.89 77.74,176.60 77.38,176.30 77.03,176.00 76.71,175.70 76.39,175.40 76.09,175.10 75.81,174.80 75.54,174.50 75.29,174.21 75.04,173.91 74.82,173.61 74.60,173.31 74.40,173.01 74.21,172.71 74.03,172.41 73.86,172.12 73.70,171.82 73.56,171.52 73.42,171.22 73.29,170.92 73.17,170.62 73.06,170.32 72.95,170.02 72.86,169.73 72.77,169.43 72.69,169.13 72.61,168.83 72.54,168.53 72.47,168.23 72.41,167.93 72.36,167.64 72.31,167.34 72.26,167.04 72.22,166.74 72.18,166.44 72.15,166.14 72.11,165.84 72.09,165.54 72.06,165.25 72.03,164.95 72.01,164.65 71.99,164.35 71.98,164.05 71.96,163.75 71.95,163.45 ' style='stroke-width: 0.75; stroke: #DF536B;' />
+<polygon points='71.83,240.53 71.83,240.20 71.83,239.87 71.83,239.54 71.83,239.22 71.83,238.89 71.83,238.56 71.83,238.23 71.83,237.90 71.83,237.57 71.83,237.25 71.83,236.92 71.83,236.59 71.83,236.26 71.83,235.93 71.83,235.60 71.83,235.28 71.83,234.95 71.83,234.62 71.83,234.29 71.83,233.96 71.83,233.64 71.83,233.31 71.83,232.98 71.83,232.65 71.83,232.32 71.83,231.99 71.83,231.67 71.83,231.34 71.83,231.01 71.83,230.68 71.83,230.35 71.83,230.02 71.83,229.70 71.83,229.37 71.83,229.04 71.83,228.71 71.83,228.38 71.83,228.06 71.83,227.73 71.83,227.40 71.83,227.07 71.83,226.74 71.83,226.41 71.83,226.09 71.83,225.76 71.83,225.43 71.83,225.10 71.83,224.77 71.83,224.44 71.83,224.12 71.83,223.79 71.83,223.46 71.83,223.13 71.83,222.80 71.83,222.48 71.83,222.15 71.83,221.82 71.83,221.49 71.83,221.16 71.83,220.83 71.83,220.51 71.83,220.18 71.83,219.85 71.83,219.52 71.83,219.19 71.83,218.86 71.83,218.54 71.83,218.21 71.83,217.88 71.83,217.55 71.83,217.22 71.83,216.90 71.83,216.57 71.83,216.24 71.83,215.91 71.83,215.58 71.83,215.25 71.83,214.93 71.83,214.60 71.83,214.27 71.83,213.94 71.83,213.61 71.83,213.28 71.83,212.96 71.83,212.63 71.83,212.30 71.83,211.97 71.83,211.64 71.83,211.32 71.83,210.99 71.83,210.66 71.83,210.33 71.83,210.00 71.83,209.67 71.83,209.35 71.83,209.02 71.83,208.69 71.83,208.36 71.83,208.03 71.83,207.70 71.83,207.38 71.83,207.05 71.83,206.72 71.83,206.39 71.83,206.06 71.83,205.74 71.83,205.41 71.83,205.08 71.83,204.75 71.83,204.42 71.83,204.09 71.83,203.77 71.83,203.44 71.83,203.11 71.83,202.78 71.83,202.45 71.83,202.12 71.83,201.80 71.83,201.47 71.83,201.14 71.83,200.81 71.83,200.48 71.83,200.16 71.83,199.83 71.83,199.50 71.83,199.17 71.83,198.84 71.83,198.51 71.83,198.19 71.83,197.86 71.83,197.53 71.83,197.20 71.83,196.87 71.83,196.54 71.83,196.22 71.83,195.89 71.83,195.56 71.83,195.23 71.83,194.90 71.83,194.58 71.83,194.25 71.83,193.92 71.83,193.59 71.83,193.26 71.83,192.93 71.83,192.61 71.83,192.28 71.83,191.95 71.83,191.62 71.83,191.29 71.83,190.96 71.83,190.64 71.83,190.31 71.83,189.98 71.83,189.65 71.83,189.32 71.83,189.00 71.83,188.67 71.83,188.34 71.83,188.01 71.83,187.68 71.83,187.35 71.83,187.03 71.83,186.70 71.83,186.37 71.83,186.04 71.83,185.71 71.83,185.38 71.83,185.06 71.83,184.73 71.83,184.40 71.83,184.07 71.83,183.74 71.83,183.42 71.83,183.09 71.83,182.76 71.83,182.43 71.83,182.10 71.83,181.77 71.83,181.45 71.83,181.12 71.83,180.79 71.83,180.46 71.83,180.13 71.83,179.80 71.83,179.48 71.83,179.15 71.83,178.82 71.83,178.49 71.83,178.16 71.83,177.84 71.83,177.51 71.83,177.18 71.83,176.85 71.83,176.52 71.83,176.19 71.83,175.87 71.83,175.54 71.83,175.21 71.83,174.88 71.83,174.55 71.83,174.22 71.83,173.90 71.83,173.57 71.83,173.24 71.83,172.91 71.83,172.58 71.83,172.26 71.83,171.93 71.83,171.60 71.83,171.27 71.83,170.94 71.83,170.61 71.83,170.29 71.83,169.96 71.83,169.63 71.83,169.30 71.83,168.97 71.83,168.64 71.83,168.32 71.83,167.99 71.83,167.66 71.83,167.33 71.83,167.00 71.83,166.68 71.83,166.35 71.83,166.02 71.83,165.69 71.83,165.36 71.83,165.03 71.83,164.71 71.83,164.38 71.83,164.05 71.83,163.72 71.83,163.39 71.83,163.06 71.83,162.74 71.83,162.41 71.83,162.08 71.83,161.75 71.83,161.42 71.83,161.10 71.83,160.77 71.83,160.44 71.83,160.11 71.83,159.78 71.83,159.45 71.83,159.13 71.83,158.80 71.83,158.47 71.83,158.14 71.83,157.81 71.83,157.48 71.83,157.16 71.83,156.83 71.83,156.50 71.83,156.17 71.83,155.84 71.83,155.52 71.83,155.19 71.83,154.86 71.83,154.53 71.83,154.20 71.83,153.87 71.83,153.55 71.83,153.22 71.83,152.89 71.83,152.56 71.83,152.23 71.83,151.90 71.83,151.58 71.83,151.25 71.83,150.92 71.83,150.59 71.83,150.26 71.83,149.94 71.83,149.61 71.83,149.28 71.83,148.95 71.83,148.62 71.83,148.29 71.83,147.97 71.83,147.64 71.83,147.31 71.83,146.98 71.83,146.65 71.83,146.32 71.83,146.00 71.83,145.67 71.83,145.34 71.83,145.01 71.83,144.68 71.83,144.36 71.83,144.03 71.83,143.70 71.83,143.37 71.83,143.04 71.83,142.71 71.83,142.39 71.83,142.06 71.83,141.73 71.83,141.40 71.83,141.07 71.83,140.74 71.83,140.42 71.83,140.09 71.83,139.76 71.83,139.43 71.83,139.10 71.83,138.78 71.83,138.45 71.83,138.12 71.83,137.79 71.83,137.46 71.83,137.13 71.83,136.81 71.83,136.48 71.83,136.15 71.83,135.82 71.83,135.49 71.83,135.16 71.83,134.84 71.83,134.51 71.83,134.18 71.83,133.85 71.83,133.52 71.83,133.20 71.83,132.87 71.83,132.54 71.83,132.21 71.83,131.88 71.83,131.55 71.83,131.23 71.83,130.90 71.83,130.57 71.83,130.24 71.83,129.91 71.83,129.58 71.83,129.26 71.83,128.93 71.83,128.60 71.83,128.27 71.83,127.94 71.83,127.62 71.83,127.29 71.83,126.96 71.83,126.63 71.83,126.30 71.83,125.97 71.83,125.65 71.83,125.32 71.83,124.99 71.83,124.66 71.83,124.33 71.83,124.00 71.83,123.68 71.83,123.35 71.83,123.02 71.83,122.69 71.83,122.36 71.83,122.04 71.83,121.71 71.83,121.38 71.83,121.05 71.83,120.72 71.83,120.39 71.83,120.07 71.83,119.74 71.83,119.41 71.83,119.08 71.83,118.75 71.83,118.42 71.83,118.10 71.83,117.77 71.83,117.44 71.83,117.11 71.83,116.78 71.83,116.46 71.83,116.13 71.83,115.80 71.83,115.47 71.83,115.14 71.83,114.81 71.83,114.49 71.83,114.16 71.83,113.83 71.83,113.50 71.83,113.17 71.83,112.84 71.83,112.52 71.83,112.19 71.83,111.86 71.83,111.53 71.83,111.20 71.83,110.88 71.83,110.55 71.83,110.22 71.83,109.89 71.83,109.56 71.83,109.23 71.83,108.91 71.83,108.58 71.83,108.25 71.83,107.92 71.83,107.59 71.83,107.26 71.83,106.94 71.83,106.61 71.83,106.28 71.83,105.95 71.83,105.62 71.83,105.30 71.83,104.97 71.83,104.64 71.83,104.31 71.83,103.98 71.83,103.65 71.83,103.33 71.83,103.00 71.83,102.67 71.83,102.34 71.83,102.01 71.83,101.68 71.83,101.36 71.83,101.03 71.83,100.70 71.83,100.37 71.83,100.04 71.83,99.72 71.83,99.39 71.83,99.06 71.83,98.73 71.83,98.40 71.83,98.07 71.83,97.75 71.83,97.42 71.83,97.09 71.83,96.76 71.83,96.43 71.83,96.10 71.83,95.78 71.83,95.45 71.83,95.12 71.83,94.79 71.83,94.46 71.83,94.14 71.83,93.81 71.83,93.48 71.83,93.15 71.83,92.82 71.83,92.49 71.83,92.17 71.83,91.84 71.83,91.51 71.83,91.18 71.83,90.85 71.83,90.52 71.83,90.20 71.83,89.87 71.83,89.54 71.83,89.21 71.83,88.88 71.83,88.56 71.83,88.23 71.83,87.90 71.83,87.57 71.83,87.24 71.83,86.91 71.83,86.59 71.83,86.26 71.83,85.93 71.83,85.60 71.83,85.27 71.83,84.94 71.83,84.62 71.83,84.29 71.83,83.96 71.83,83.63 71.83,83.30 71.83,82.98 71.83,82.65 71.83,82.32 71.83,81.99 71.83,81.66 71.83,81.33 71.83,81.01 71.83,80.68 71.83,80.35 71.83,80.02 71.83,79.69 71.83,79.36 71.83,79.04 71.83,78.71 71.83,78.38 71.83,78.05 71.83,77.72 71.83,77.40 71.83,77.07 71.83,76.74 71.83,76.41 71.83,76.08 71.83,75.75 71.83,75.43 71.83,75.10 71.83,74.77 71.83,74.44 71.83,74.11 71.83,73.78 71.83,73.46 71.83,73.13 71.83,72.80 71.93,72.80 71.95,73.13 71.96,73.46 71.98,73.78 72.00,74.11 72.02,74.44 72.05,74.77 72.07,75.10 72.10,75.43 72.13,75.75 72.17,76.08 72.21,76.41 72.25,76.74 72.30,77.07 72.35,77.40 72.41,77.72 72.47,78.05 72.54,78.38 72.61,78.71 72.69,79.04 72.77,79.36 72.86,79.69 72.96,80.02 73.07,80.35 73.18,80.68 73.30,81.01 73.43,81.33 73.57,81.66 73.72,81.99 73.88,82.32 74.05,82.65 74.22,82.98 74.41,83.30 74.61,83.63 74.82,83.96 75.04,84.29 75.28,84.62 75.52,84.94 75.78,85.27 76.05,85.60 76.33,85.93 76.62,86.26 76.92,86.59 77.24,86.91 77.57,87.24 77.91,87.57 78.26,87.90 78.62,88.23 79.00,88.56 79.38,88.88 79.78,89.21 80.20,89.54 80.62,89.87 81.05,90.20 81.49,90.52 81.94,90.85 82.40,91.18 82.87,91.51 83.36,91.84 83.84,92.17 84.34,92.49 84.85,92.82 85.36,93.15 85.88,93.48 86.40,93.81 86.93,94.14 87.47,94.46 88.01,94.79 88.56,95.12 89.10,95.45 89.65,95.78 90.21,96.10 90.76,96.43 91.32,96.76 91.87,97.09 92.42,97.42 92.97,97.75 93.52,98.07 94.07,98.40 94.61,98.73 95.14,99.06 95.66,99.39 96.18,99.72 96.69,100.04 97.19,100.37 97.68,100.70 98.16,101.03 98.62,101.36 99.07,101.68 99.50,102.01 99.92,102.34 100.32,102.67 100.70,103.00 101.06,103.33 101.40,103.65 101.71,103.98 102.01,104.31 102.29,104.64 102.53,104.97 102.76,105.30 102.96,105.62 103.14,105.95 103.29,106.28 103.42,106.61 103.52,106.94 103.60,107.26 103.65,107.59 103.69,107.92 103.70,108.25 103.68,108.58 103.64,108.91 103.59,109.23 103.51,109.56 103.41,109.89 103.30,110.22 103.18,110.55 103.04,110.88 102.88,111.20 102.72,111.53 102.54,111.86 102.36,112.19 102.17,112.52 101.98,112.84 101.78,113.17 101.59,113.50 101.39,113.83 101.20,114.16 101.01,114.49 100.83,114.81 100.65,115.14 100.49,115.47 100.33,115.80 100.19,116.13 100.05,116.46 99.93,116.78 99.83,117.11 99.75,117.44 99.67,117.77 99.62,118.10 99.59,118.42 99.58,118.75 99.58,119.08 99.61,119.41 99.67,119.74 99.74,120.07 99.83,120.39 99.95,120.72 100.10,121.05 100.26,121.38 100.45,121.71 100.67,122.04 100.91,122.36 101.17,122.69 101.46,123.02 101.78,123.35 102.13,123.68 102.49,124.00 102.89,124.33 103.32,124.66 103.77,124.99 104.24,125.32 104.75,125.65 105.28,125.97 105.84,126.30 106.42,126.63 107.04,126.96 107.67,127.29 108.33,127.62 109.03,127.94 109.75,128.27 110.49,128.60 111.25,128.93 112.04,129.26 112.85,129.58 113.68,129.91 114.54,130.24 115.42,130.57 116.31,130.90 117.22,131.23 118.15,131.55 119.09,131.88 120.04,132.21 121.01,132.54 121.99,132.87 122.97,133.20 123.97,133.52 124.97,133.85 125.97,134.18 126.98,134.51 127.98,134.84 128.99,135.16 130.00,135.49 131.00,135.82 132.00,136.15 132.99,136.48 133.98,136.81 134.96,137.13 135.94,137.46 136.90,137.79 137.86,138.12 138.81,138.45 139.74,138.78 140.67,139.10 141.60,139.43 142.51,139.76 143.41,140.09 144.31,140.42 145.20,140.74 146.09,141.07 146.96,141.40 147.84,141.73 148.71,142.06 149.58,142.39 150.45,142.71 151.33,143.04 152.20,143.37 153.08,143.70 153.96,144.03 154.85,144.36 155.74,144.68 156.65,145.01 157.56,145.34 158.49,145.67 159.42,146.00 160.38,146.32 161.34,146.65 162.31,146.98 163.31,147.31 164.32,147.64 165.34,147.97 166.38,148.29 167.43,148.62 168.50,148.95 169.58,149.28 170.67,149.61 171.78,149.94 172.90,150.26 174.02,150.59 175.16,150.92 176.29,151.25 177.44,151.58 178.58,151.90 179.72,152.23 180.86,152.56 181.99,152.89 183.12,153.22 184.23,153.55 185.32,153.87 186.40,154.20 187.45,154.53 188.48,154.86 189.48,155.19 190.45,155.52 191.37,155.84 192.26,156.17 193.12,156.50 193.92,156.83 194.67,157.16 195.37,157.48 196.03,157.81 196.61,158.14 197.13,158.47 197.60,158.80 198.01,159.13 198.33,159.45 198.59,159.78 198.79,160.11 198.92,160.44 198.96,160.77 198.94,161.10 198.87,161.42 198.70,161.75 198.46,162.08 198.17,162.41 197.81,162.74 197.36,163.06 196.87,163.39 196.32,163.72 195.70,164.05 195.03,164.38 194.31,164.71 193.55,165.03 192.73,165.36 191.88,165.69 191.00,166.02 190.10,166.35 189.16,166.68 188.20,167.00 187.23,167.33 186.26,167.66 185.28,167.99 184.30,168.32 183.34,168.64 182.38,168.97 181.45,169.30 180.54,169.63 179.65,169.96 178.81,170.29 178.01,170.61 177.25,170.94 176.53,171.27 175.88,171.60 175.28,171.93 174.73,172.26 174.26,172.58 173.85,172.91 173.51,173.24 173.23,173.57 173.05,173.90 172.94,174.22 172.89,174.55 172.92,174.88 173.04,175.21 173.23,175.54 173.48,175.87 173.82,176.19 174.25,176.52 174.73,176.85 175.27,177.18 175.90,177.51 176.58,177.84 177.32,178.16 178.11,178.49 178.96,178.82 179.85,179.15 180.78,179.48 181.75,179.80 182.75,180.13 183.77,180.46 184.81,180.79 185.86,181.12 186.92,181.45 187.98,181.77 189.03,182.10 190.07,182.43 191.09,182.76 192.09,183.09 193.06,183.42 193.98,183.74 194.86,184.07 195.70,184.40 196.48,184.73 197.19,185.06 197.85,185.38 198.45,185.71 198.95,186.04 199.38,186.37 199.75,186.70 200.02,187.03 200.20,187.35 200.29,187.68 200.31,188.01 200.22,188.34 200.03,188.67 199.77,189.00 199.42,189.32 198.94,189.65 198.38,189.98 197.74,190.31 197.00,190.64 196.16,190.96 195.24,191.29 194.25,191.62 193.15,191.95 191.97,192.28 190.73,192.61 189.41,192.93 188.00,193.26 186.53,193.59 185.00,193.92 183.40,194.25 181.73,194.58 180.02,194.90 178.26,195.23 176.44,195.56 174.58,195.89 172.68,196.22 170.75,196.54 168.77,196.87 166.77,197.20 164.75,197.53 162.70,197.86 160.63,198.19 158.55,198.51 156.46,198.84 154.36,199.17 152.25,199.50 150.14,199.83 148.04,200.16 145.94,200.48 143.85,200.81 141.77,201.14 139.70,201.47 137.66,201.80 135.63,202.12 133.62,202.45 131.64,202.78 129.69,203.11 127.77,203.44 125.88,203.77 124.03,204.09 122.21,204.42 120.43,204.75 118.69,205.08 117.00,205.41 115.35,205.74 113.74,206.06 112.18,206.39 110.67,206.72 109.20,207.05 107.78,207.38 106.42,207.70 105.10,208.03 103.83,208.36 102.61,208.69 101.45,209.02 100.33,209.35 99.25,209.67 98.23,210.00 97.25,210.33 96.32,210.66 95.43,210.99 94.59,211.32 93.79,211.64 93.03,211.97 92.30,212.30 91.62,212.63 90.97,212.96 90.35,213.28 89.76,213.61 89.20,213.94 88.68,214.27 88.17,214.60 87.69,214.93 87.23,215.25 86.79,215.58 86.37,215.91 85.97,216.24 85.58,216.57 85.20,216.90 84.84,217.22 84.49,217.55 84.14,217.88 83.80,218.21 83.47,218.54 83.15,218.86 82.83,219.19 82.51,219.52 82.20,219.85 81.89,220.18 81.58,220.51 81.28,220.83 80.98,221.16 80.68,221.49 80.38,221.82 80.08,222.15 79.79,222.48 79.49,222.80 79.20,223.13 78.91,223.46 78.63,223.79 78.35,224.12 78.07,224.44 77.79,224.77 77.52,225.10 77.25,225.43 76.99,225.76 76.74,226.09 76.49,226.41 76.24,226.74 76.01,227.07 75.78,227.40 75.55,227.73 75.33,228.06 75.12,228.38 74.92,228.71 74.73,229.04 74.54,229.37 74.36,229.70 74.19,230.02 74.03,230.35 73.87,230.68 73.73,231.01 73.59,231.34 73.45,231.67 73.33,231.99 73.21,232.32 73.10,232.65 73.00,232.98 72.90,233.31 72.81,233.64 72.72,233.96 72.65,234.29 72.57,234.62 72.51,234.95 72.44,235.28 72.39,235.60 72.33,235.93 72.28,236.26 72.24,236.59 72.20,236.92 72.16,237.25 72.13,237.57 72.09,237.90 72.07,238.23 72.04,238.56 72.02,238.89 72.00,239.22 71.98,239.54 71.96,239.87 71.94,240.20 71.93,240.53 ' style='stroke-width: 0.75; stroke: none; fill: #61D04F; fill-opacity: 0.10;' />
+<polyline points='71.93,240.53 71.94,240.20 71.96,239.87 71.98,239.54 72.00,239.22 72.02,238.89 72.04,238.56 72.07,238.23 72.09,237.90 72.13,237.57 72.16,237.25 72.20,236.92 72.24,236.59 72.28,236.26 72.33,235.93 72.39,235.60 72.44,235.28 72.51,234.95 72.57,234.62 72.65,234.29 72.72,233.96 72.81,233.64 72.90,233.31 73.00,232.98 73.10,232.65 73.21,232.32 73.33,231.99 73.45,231.67 73.59,231.34 73.73,231.01 73.87,230.68 74.03,230.35 74.19,230.02 74.36,229.70 74.54,229.37 74.73,229.04 74.92,228.71 75.12,228.38 75.33,228.06 75.55,227.73 75.78,227.40 76.01,227.07 76.24,226.74 76.49,226.41 76.74,226.09 76.99,225.76 77.25,225.43 77.52,225.10 77.79,224.77 78.07,224.44 78.35,224.12 78.63,223.79 78.91,223.46 79.20,223.13 79.49,222.80 79.79,222.48 80.08,222.15 80.38,221.82 80.68,221.49 80.98,221.16 81.28,220.83 81.58,220.51 81.89,220.18 82.20,219.85 82.51,219.52 82.83,219.19 83.15,218.86 83.47,218.54 83.80,218.21 84.14,217.88 84.49,217.55 84.84,217.22 85.20,216.90 85.58,216.57 85.97,216.24 86.37,215.91 86.79,215.58 87.23,215.25 87.69,214.93 88.17,214.60 88.68,214.27 89.20,213.94 89.76,213.61 90.35,213.28 90.97,212.96 91.62,212.63 92.30,212.30 93.03,211.97 93.79,211.64 94.59,211.32 95.43,210.99 96.32,210.66 97.25,210.33 98.23,210.00 99.25,209.67 100.33,209.35 101.45,209.02 102.61,208.69 103.83,208.36 105.10,208.03 106.42,207.70 107.78,207.38 109.20,207.05 110.67,206.72 112.18,206.39 113.74,206.06 115.35,205.74 117.00,205.41 118.69,205.08 120.43,204.75 122.21,204.42 124.03,204.09 125.88,203.77 127.77,203.44 129.69,203.11 131.64,202.78 133.62,202.45 135.63,202.12 137.66,201.80 139.70,201.47 141.77,201.14 143.85,200.81 145.94,200.48 148.04,200.16 150.14,199.83 152.25,199.50 154.36,199.17 156.46,198.84 158.55,198.51 160.63,198.19 162.70,197.86 164.75,197.53 166.77,197.20 168.77,196.87 170.75,196.54 172.68,196.22 174.58,195.89 176.44,195.56 178.26,195.23 180.02,194.90 181.73,194.58 183.40,194.25 185.00,193.92 186.53,193.59 188.00,193.26 189.41,192.93 190.73,192.61 191.97,192.28 193.15,191.95 194.25,191.62 195.24,191.29 196.16,190.96 197.00,190.64 197.74,190.31 198.38,189.98 198.94,189.65 199.42,189.32 199.77,189.00 200.03,188.67 200.22,188.34 200.31,188.01 200.29,187.68 200.20,187.35 200.02,187.03 199.75,186.70 199.38,186.37 198.95,186.04 198.45,185.71 197.85,185.38 197.19,185.06 196.48,184.73 195.70,184.40 194.86,184.07 193.98,183.74 193.06,183.42 192.09,183.09 191.09,182.76 190.07,182.43 189.03,182.10 187.98,181.77 186.92,181.45 185.86,181.12 184.81,180.79 183.77,180.46 182.75,180.13 181.75,179.80 180.78,179.48 179.85,179.15 178.96,178.82 178.11,178.49 177.32,178.16 176.58,177.84 175.90,177.51 175.27,177.18 174.73,176.85 174.25,176.52 173.82,176.19 173.48,175.87 173.23,175.54 173.04,175.21 172.92,174.88 172.89,174.55 172.94,174.22 173.05,173.90 173.23,173.57 173.51,173.24 173.85,172.91 174.26,172.58 174.73,172.26 175.28,171.93 175.88,171.60 176.53,171.27 177.25,170.94 178.01,170.61 178.81,170.29 179.65,169.96 180.54,169.63 181.45,169.30 182.38,168.97 183.34,168.64 184.30,168.32 185.28,167.99 186.26,167.66 187.23,167.33 188.20,167.00 189.16,166.68 190.10,166.35 191.00,166.02 191.88,165.69 192.73,165.36 193.55,165.03 194.31,164.71 195.03,164.38 195.70,164.05 196.32,163.72 196.87,163.39 197.36,163.06 197.81,162.74 198.17,162.41 198.46,162.08 198.70,161.75 198.87,161.42 198.94,161.10 198.96,160.77 198.92,160.44 198.79,160.11 198.59,159.78 198.33,159.45 198.01,159.13 197.60,158.80 197.13,158.47 196.61,158.14 196.03,157.81 195.37,157.48 194.67,157.16 193.92,156.83 193.12,156.50 192.26,156.17 191.37,155.84 190.45,155.52 189.48,155.19 188.48,154.86 187.45,154.53 186.40,154.20 185.32,153.87 184.23,153.55 183.12,153.22 181.99,152.89 180.86,152.56 179.72,152.23 178.58,151.90 177.44,151.58 176.29,151.25 175.16,150.92 174.02,150.59 172.90,150.26 171.78,149.94 170.67,149.61 169.58,149.28 168.50,148.95 167.43,148.62 166.38,148.29 165.34,147.97 164.32,147.64 163.31,147.31 162.31,146.98 161.34,146.65 160.38,146.32 159.42,146.00 158.49,145.67 157.56,145.34 156.65,145.01 155.74,144.68 154.85,144.36 153.96,144.03 153.08,143.70 152.20,143.37 151.33,143.04 150.45,142.71 149.58,142.39 148.71,142.06 147.84,141.73 146.96,141.40 146.09,141.07 145.20,140.74 144.31,140.42 143.41,140.09 142.51,139.76 141.60,139.43 140.67,139.10 139.74,138.78 138.81,138.45 137.86,138.12 136.90,137.79 135.94,137.46 134.96,137.13 133.98,136.81 132.99,136.48 132.00,136.15 131.00,135.82 130.00,135.49 128.99,135.16 127.98,134.84 126.98,134.51 125.97,134.18 124.97,133.85 123.97,133.52 122.97,133.20 121.99,132.87 121.01,132.54 120.04,132.21 119.09,131.88 118.15,131.55 117.22,131.23 116.31,130.90 115.42,130.57 114.54,130.24 113.68,129.91 112.85,129.58 112.04,129.26 111.25,128.93 110.49,128.60 109.75,128.27 109.03,127.94 108.33,127.62 107.67,127.29 107.04,126.96 106.42,126.63 105.84,126.30 105.28,125.97 104.75,125.65 104.24,125.32 103.77,124.99 103.32,124.66 102.89,124.33 102.49,124.00 102.13,123.68 101.78,123.35 101.46,123.02 101.17,122.69 100.91,122.36 100.67,122.04 100.45,121.71 100.26,121.38 100.10,121.05 99.95,120.72 99.83,120.39 99.74,120.07 99.67,119.74 99.61,119.41 99.58,119.08 99.58,118.75 99.59,118.42 99.62,118.10 99.67,117.77 99.75,117.44 99.83,117.11 99.93,116.78 100.05,116.46 100.19,116.13 100.33,115.80 100.49,115.47 100.65,115.14 100.83,114.81 101.01,114.49 101.20,114.16 101.39,113.83 101.59,113.50 101.78,113.17 101.98,112.84 102.17,112.52 102.36,112.19 102.54,111.86 102.72,111.53 102.88,111.20 103.04,110.88 103.18,110.55 103.30,110.22 103.41,109.89 103.51,109.56 103.59,109.23 103.64,108.91 103.68,108.58 103.70,108.25 103.69,107.92 103.65,107.59 103.60,107.26 103.52,106.94 103.42,106.61 103.29,106.28 103.14,105.95 102.96,105.62 102.76,105.30 102.53,104.97 102.29,104.64 102.01,104.31 101.71,103.98 101.40,103.65 101.06,103.33 100.70,103.00 100.32,102.67 99.92,102.34 99.50,102.01 99.07,101.68 98.62,101.36 98.16,101.03 97.68,100.70 97.19,100.37 96.69,100.04 96.18,99.72 95.66,99.39 95.14,99.06 94.61,98.73 94.07,98.40 93.52,98.07 92.97,97.75 92.42,97.42 91.87,97.09 91.32,96.76 90.76,96.43 90.21,96.10 89.65,95.78 89.10,95.45 88.56,95.12 88.01,94.79 87.47,94.46 86.93,94.14 86.40,93.81 85.88,93.48 85.36,93.15 84.85,92.82 84.34,92.49 83.84,92.17 83.36,91.84 82.87,91.51 82.40,91.18 81.94,90.85 81.49,90.52 81.05,90.20 80.62,89.87 80.20,89.54 79.78,89.21 79.38,88.88 79.00,88.56 78.62,88.23 78.26,87.90 77.91,87.57 77.57,87.24 77.24,86.91 76.92,86.59 76.62,86.26 76.33,85.93 76.05,85.60 75.78,85.27 75.52,84.94 75.28,84.62 75.04,84.29 74.82,83.96 74.61,83.63 74.41,83.30 74.22,82.98 74.05,82.65 73.88,82.32 73.72,81.99 73.57,81.66 73.43,81.33 73.30,81.01 73.18,80.68 73.07,80.35 72.96,80.02 72.86,79.69 72.77,79.36 72.69,79.04 72.61,78.71 72.54,78.38 72.47,78.05 72.41,77.72 72.35,77.40 72.30,77.07 72.25,76.74 72.21,76.41 72.17,76.08 72.13,75.75 72.10,75.43 72.07,75.10 72.05,74.77 72.02,74.44 72.00,74.11 71.98,73.78 71.96,73.46 71.95,73.13 71.93,72.80 ' style='stroke-width: 0.75; stroke: #61D04F;' />
 </g>
 </svg>
diff --git a/inst/tinytest/test-flip.R b/inst/tinytest/test-flip.R
index bc61b65d..dad33c78 100644
--- a/inst/tinytest/test-flip.R
+++ b/inst/tinytest/test-flip.R
@@ -108,7 +108,7 @@ expect_snapshot_plot(f, label = "flip_ribbon_pred")
 
 
 f = function() {
-  x_dtt = strptime(20010101:20010110, format="%Y%m%d", tz = "UTC")
+  x_dt = as.Date(strptime(20010101:20010110, format="%Y%m%d", tz = "UTC"))
   y = 1:10
   tinyplot(x_dtt, y, grid = TRUE, flip = TRUE)
 }

From 4d4f258b614e9e1933bdf140fbfa1bb12d68c97c Mon Sep 17 00:00:00 2001
From: Grant McDermott <grant.mcdermott@gmail.com>
Date: Fri, 4 Oct 2024 18:41:07 -0700
Subject: [PATCH 12/72] typo

---
 inst/tinytest/test-flip.R | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/inst/tinytest/test-flip.R b/inst/tinytest/test-flip.R
index dad33c78..6548feb1 100644
--- a/inst/tinytest/test-flip.R
+++ b/inst/tinytest/test-flip.R
@@ -110,6 +110,6 @@ expect_snapshot_plot(f, label = "flip_ribbon_pred")
 f = function() {
   x_dt = as.Date(strptime(20010101:20010110, format="%Y%m%d", tz = "UTC"))
   y = 1:10
-  tinyplot(x_dtt, y, grid = TRUE, flip = TRUE)
+  tinyplot(x_dt, y, grid = TRUE, flip = TRUE)
 }
 expect_snapshot_plot(f, label = "flip_date_time")

From 2d3b67456f8d4932f9ce7e38c2c4d454428a305a Mon Sep 17 00:00:00 2001
From: Grant McDermott <grant.mcdermott@gmail.com>
Date: Fri, 4 Oct 2024 18:45:35 -0700
Subject: [PATCH 13/72] one more time

---
 .../{flip_date_time.svg => flip_date.svg}     | 36 +++++++++----------
 inst/tinytest/test-flip.R                     |  2 +-
 2 files changed, 19 insertions(+), 19 deletions(-)
 rename inst/tinytest/_tinysnapshot/{flip_date_time.svg => flip_date.svg} (73%)

diff --git a/inst/tinytest/_tinysnapshot/flip_date_time.svg b/inst/tinytest/_tinysnapshot/flip_date.svg
similarity index 73%
rename from inst/tinytest/_tinysnapshot/flip_date_time.svg
rename to inst/tinytest/_tinysnapshot/flip_date.svg
index cf7869a5..d10f68f7 100644
--- a/inst/tinytest/_tinysnapshot/flip_date_time.svg
+++ b/inst/tinytest/_tinysnapshot/flip_date.svg
@@ -22,7 +22,7 @@
 </defs>
 <g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
 <text x='266.40' y='485.28' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.00px' lengthAdjust='spacingAndGlyphs'>y</text>
-<text transform='translate(12.96,244.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='26.02px' lengthAdjust='spacingAndGlyphs'>x_dtt</text>
+<text transform='translate(12.96,244.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='22.69px' lengthAdjust='spacingAndGlyphs'>x_dt</text>
 <line x1='117.07' y1='430.56' x2='458.40' y2='430.56' style='stroke-width: 0.75;' />
 <line x1='117.07' y1='430.56' x2='117.07' y2='437.76' style='stroke-width: 0.75;' />
 <line x1='202.40' y1='430.56' x2='202.40' y2='437.76' style='stroke-width: 0.75;' />
@@ -34,17 +34,17 @@
 <text x='287.73' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>6</text>
 <text x='373.07' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>8</text>
 <text x='458.40' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>10</text>
-<line x1='59.04' y1='378.58' x2='59.04' y2='72.80' style='stroke-width: 0.75;' />
-<line x1='59.04' y1='378.58' x2='51.84' y2='378.58' style='stroke-width: 0.75;' />
-<line x1='59.04' y1='302.13' x2='51.84' y2='302.13' style='stroke-width: 0.75;' />
-<line x1='59.04' y1='225.69' x2='51.84' y2='225.69' style='stroke-width: 0.75;' />
-<line x1='59.04' y1='149.24' x2='51.84' y2='149.24' style='stroke-width: 0.75;' />
-<line x1='59.04' y1='72.80' x2='51.84' y2='72.80' style='stroke-width: 0.75;' />
-<text transform='translate(41.76,378.58) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='36.04px' lengthAdjust='spacingAndGlyphs'>Jan 02</text>
-<text transform='translate(41.76,302.13) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='36.04px' lengthAdjust='spacingAndGlyphs'>Jan 04</text>
-<text transform='translate(41.76,225.69) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='36.04px' lengthAdjust='spacingAndGlyphs'>Jan 06</text>
-<text transform='translate(41.76,149.24) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='36.04px' lengthAdjust='spacingAndGlyphs'>Jan 08</text>
-<text transform='translate(41.76,72.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='36.04px' lengthAdjust='spacingAndGlyphs'>Jan 10</text>
+<line x1='59.04' y1='416.80' x2='59.04' y2='111.02' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='416.80' x2='51.84' y2='416.80' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='340.36' x2='51.84' y2='340.36' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='263.91' x2='51.84' y2='263.91' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='187.47' x2='51.84' y2='187.47' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='111.02' x2='51.84' y2='111.02' style='stroke-width: 0.75;' />
+<text transform='translate(41.76,416.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='36.04px' lengthAdjust='spacingAndGlyphs'>Jan 01</text>
+<text transform='translate(41.76,340.36) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='36.04px' lengthAdjust='spacingAndGlyphs'>Jan 03</text>
+<text transform='translate(41.76,263.91) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='36.04px' lengthAdjust='spacingAndGlyphs'>Jan 05</text>
+<text transform='translate(41.76,187.47) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='36.04px' lengthAdjust='spacingAndGlyphs'>Jan 07</text>
+<text transform='translate(41.76,111.02) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='36.04px' lengthAdjust='spacingAndGlyphs'>Jan 09</text>
 <polygon points='59.04,430.56 473.76,430.56 473.76,59.04 59.04,59.04 ' style='stroke-width: 0.75;' />
 </g>
 <defs>
@@ -59,12 +59,12 @@
 <line x1='287.73' y1='430.56' x2='287.73' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
 <line x1='373.07' y1='430.56' x2='373.07' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
 <line x1='458.40' y1='430.56' x2='458.40' y2='59.04' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
-<line x1='59.04' y1='433202.01' x2='473.76' y2='433202.01' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
-<line x1='59.04' y1='433202.01' x2='473.76' y2='433202.01' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
-<line x1='59.04' y1='433202.01' x2='473.76' y2='433202.01' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
-<line x1='59.04' y1='433202.01' x2='473.76' y2='433202.01' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
-<line x1='59.04' y1='433202.01' x2='473.76' y2='433202.01' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
-<line x1='59.04' y1='433202.01' x2='473.76' y2='433202.01' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='416.80' x2='473.76' y2='416.80' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='340.36' x2='473.76' y2='340.36' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='263.91' x2='473.76' y2='263.91' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='187.47' x2='473.76' y2='187.47' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='111.02' x2='473.76' y2='111.02' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
+<line x1='59.04' y1='34.58' x2='473.76' y2='34.58' style='stroke-width: 0.75; stroke: #D3D3D3; stroke-dasharray: 1.00,3.00;' />
 <circle cx='74.40' cy='416.80' r='2.70' style='stroke-width: 0.75;' />
 <circle cx='117.07' cy='378.58' r='2.70' style='stroke-width: 0.75;' />
 <circle cx='159.73' cy='340.36' r='2.70' style='stroke-width: 0.75;' />
diff --git a/inst/tinytest/test-flip.R b/inst/tinytest/test-flip.R
index 6548feb1..be14563f 100644
--- a/inst/tinytest/test-flip.R
+++ b/inst/tinytest/test-flip.R
@@ -112,4 +112,4 @@ f = function() {
   y = 1:10
   tinyplot(x_dt, y, grid = TRUE, flip = TRUE)
 }
-expect_snapshot_plot(f, label = "flip_date_time")
+expect_snapshot_plot(f, label = "flip_date")

From 80d8d01812de500690be7fcc89b07969a231abc3 Mon Sep 17 00:00:00 2001
From: Grant McDermott <grant.mcdermott@gmail.com>
Date: Fri, 4 Oct 2024 19:06:37 -0700
Subject: [PATCH 14/72] typo

---
 inst/tinytest/_tinysnapshot/flip_density.svg | 2 +-
 inst/tinytest/test-flip.R                    | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/inst/tinytest/_tinysnapshot/flip_density.svg b/inst/tinytest/_tinysnapshot/flip_density.svg
index 2caba47d..5027252c 100644
--- a/inst/tinytest/_tinysnapshot/flip_density.svg
+++ b/inst/tinytest/_tinysnapshot/flip_density.svg
@@ -35,7 +35,7 @@
   </clipPath>
 </defs>
 <g clip-path='url(#cpMC4wMHw0MDcuMTB8MC4wMHw1MDQuMDA=)'>
-<text x='233.07' y='34.47' text-anchor='middle' style='font-size: 14.40px; font-weight: bold; font-family: "Liberation Sans";' textLength='124.73px' lengthAdjust='spacingAndGlyphs'>Flipped histogram</text>
+<text x='233.07' y='34.47' text-anchor='middle' style='font-size: 14.40px; font-weight: bold; font-family: "Liberation Sans";' textLength='105.55px' lengthAdjust='spacingAndGlyphs'>Flipped density</text>
 <text x='233.07' y='485.28' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='40.02px' lengthAdjust='spacingAndGlyphs'>Density</text>
 <text transform='translate(12.96,244.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='227.51px' lengthAdjust='spacingAndGlyphs'>N = [50, 50, 50]   Joint Bandwidth = 0.1551</text>
 </g>
diff --git a/inst/tinytest/test-flip.R b/inst/tinytest/test-flip.R
index be14563f..a7b2c173 100644
--- a/inst/tinytest/test-flip.R
+++ b/inst/tinytest/test-flip.R
@@ -52,7 +52,7 @@ f = function () {
     type = "density", fill = 0.5,
     grid = TRUE,
     flip = TRUE,
-    main = "Flipped histogram"
+    main = "Flipped density"
   )
 }
 expect_snapshot_plot(f, label = "flip_density")

From f9c68e09d435ac1d889d2ce44ff6d5de0377894f Mon Sep 17 00:00:00 2001
From: Grant McDermott <grant.mcdermott@gmail.com>
Date: Fri, 4 Oct 2024 19:22:28 -0700
Subject: [PATCH 15/72] NEWS

---
 NEWS.md | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/NEWS.md b/NEWS.md
index 2cc59721..632398a4 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -6,11 +6,20 @@ where the formatting is also better._
 
 ## 0.2.1.99 (dev version)
 
+New features:
+
+- The new `flip` argument allows for easily flipping (swapping) the orientation
+of the x and y axes. This should work regardless of plot type, e.g.
+`plt(~Sepal.Length, data = iris, type = "density")`. (#216 @grantmcdermott)
+
 Bug fixes:
 
 - Better preserve facet attributes, thus avoiding misarrangement of facet grids
 for density and histogram types. (#209 @zeileis)
-- Respect `xlim` and `ylim` when explicitly supplied by the user. (thanks to @mclements for code submission #221)
+- Plots of the form `plt(numeric ~ character)` now work correctly, with the
+character variable automatically being coerced to a factor. (#219 @zeileis)
+- Respect `xlim` and `ylim` when explicitly supplied by the user. (Thanks to
+@mclements for code submission #221)
 
 Internals:
 

From 9a14f4370bd3575c098c2e31928c908a3f4fdf7d Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 12:58:15 -0400
Subject: [PATCH 16/72] draw_elements_refactor start

---
 R/draw_elements.R | 290 +++++++++++++++++++++++++++++++++++++---------
 1 file changed, 234 insertions(+), 56 deletions(-)

diff --git a/R/draw_elements.R b/R/draw_elements.R
index f529884c..d646a113 100644
--- a/R/draw_elements.R
+++ b/R/draw_elements.R
@@ -44,51 +44,24 @@ draw_elements = function(
             col = bg[i],
             border = FALSE
           )
-          
+
         }
-        
+
       } else if (type == "pointrange") {
-        segments(
-          x0 = xxmin,
-          y0 = yymin,
-          x1 = xxmax,
-          y1 = yymax,
-          col = icol,
-          # lty = ilty,
-          lwd = ilwd
-        )
+        draw_pointrange(xx = xx, yy = yy, xxmin = xxmin, yymin = yymin, xxmax = xxmax, yymax = yymax, icol = icol, ilwd = ilwd, ipch = ipch, cex = cex, ibg = ibg)
+
       } else if (type == "errorbar") {
-        arrows(
-          x0 = xxmin,
-          y0 = yymin,
-          x1 = xxmax,
-          y1 = yymax,
-          col = icol,
-          # lty = ilty,
-          lwd = ilwd,
-          length = 0.05,
-          angle = 90,
-          code = 3
-        )
+        draw_errorbar(xx = xx, yy = yy, xxmin = xxmin, yymin = yymin, xxmax = xxmax, yymax = yymax, icol = icol, ilwd = ilwd, ipch = ipch, cex = cex, ibg = ibg)
+
       }
 
       ## now draw the points/lines/polygons/etc
       if (isTRUE(empty_plot)) {
         # empty plot
-      } else if (type %in% c("p", "pointrange", "errorbar")) {
-        points(
-          x = xx,
-          y = yy,
-          col = icol,
-          bg = ibg,
-          ## rather hardcode "p" to avoid warning message about "pointrange"
-          type = "p",
-          pch = ipch,
-          # lty = ilty,
-          lwd = ilwd,
-          cex = cex
-        )
-      } else if (type %in% c("l", "o", "b", "c", "h", "s", "S", "ribbon")) {
+      } else if (type == "p") {
+        draw_points(xx = xx, yy = yy, icol = icol, ibg = ibg, ipch = ipch, ilwd = ilwd, cex = cex)
+
+     } else if (type %in% c("l", "o", "b", "c", "h", "s", "S", "ribbon")) {
         rtype = type == "ribbon"
         if (rtype) type = "l"
         lines(
@@ -101,26 +74,13 @@ draw_elements = function(
           lwd = ilwd
         )
         if (rtype) type = "ribbon"
+
       } else if (type == "polygon") {
-        polygon(
-          x = xx,
-          y = yy,
-          border = icol,
-          col = ibg,
-          lty = ilty,
-          lwd = ilwd
-        )
+        draw_polygon(x = xx, y = yy, icol = icol, ibg = ibg, ilty = ilty, ilwd = ilwd)
+
       } else if (type == "polypath") {
-        irule = ifelse(!is.null(dots[["rule"]]), dots[["rule"]], "winding")
-        polypath(
-          x = xx,
-          y = yy,
-          border = icol,
-          col = ibg,
-          lty = ilty,
-          lwd = ilwd,
-          rule = irule
-        )
+        draw_polypath(xx = xx, yy = yy, icol = icol, ibg = ibg, ilty = ilty, ilwd = ilwd, dots = dots)
+
       } else if (type == "boxplot") {
         at_xx = unique(xx)
         horizontal = ifelse(!is.null(dots[["horizontal"]]), dots[["horizontal"]], FALSE)
@@ -172,7 +132,225 @@ draw_elements = function(
           lwd = ilwd,
           col = icol
         )
-      } else {
+      } else if (!type %in% c("pointrange", "errorbar")) {
         stop("`type` argument not supported.", call. = FALSE)
       }
 }
+
+
+
+# Draw Ribbon
+draw_ribbon <- function(xx, yy, xxmin, xxmax, yymin, yymax, bg, i = 1, flip = FALSE, ...) {
+  if (isFALSE(flip)) {
+    draw_polygon(x = c(xx, rev(xx)), y = c(yymin, rev(yymax)), icol = bg[i], ibg = bg[i])
+  } else {
+    draw_polygon(x = c(xxmin, rev(xxmax)), y = c(yy, rev(yy)), icol = bg[i], ibg = bg[i])
+  }
+}
+
+# Draw Pointrange
+draw_pointrange <- function(xx, yy, xxmin, yymin, xxmax, yymax, icol, ibg, ipch, ilwd, cex, ...) {
+  segments(
+    x0 = xxmin,
+    y0 = yymin,
+    x1 = xxmax,
+    y1 = yymax,
+    col = icol,
+    lwd = ilwd
+  )
+  draw_points(xx = xx, yy = yy, icol = icol, ibg = ibg, ipch = ipch, ilwd = ilwd, cex = cex)
+}
+
+# Draw Errorbar
+draw_errorbar <- function(xx, yy, xxmin, yymin, xxmax, yymax, icol, ibg, ipch, ilwd, cex, ...) {
+  arrows(
+    x0 = xxmin,
+    y0 = yymin,
+    x1 = xxmax,
+    y1 = yymax,
+    col = icol,
+    lwd = ilwd,
+    length = 0.05,
+    angle = 90,
+    code = 3
+  )
+  draw_points(xx = xx, yy = yy, icol = icol, ibg = ibg, ipch = ipch, ilwd = ilwd, cex = cex)
+}
+
+# Draw Points
+draw_points <- function(xx, yy, icol, ibg, ipch, ilwd, cex, ...) {
+  points(
+    x = xx,
+    y = yy,
+    col = icol,
+    bg = ibg,
+    type = "p",
+    pch = ipch,
+    lwd = ilwd,
+    cex = cex
+  )
+}
+
+# Draw Lines
+draw_lines <- function(xx, yy, icol, ipch, ilty, ilwd, type, ...) {
+  lines(
+    x = xx,
+    y = yy,
+    col = icol,
+    type = type,
+    pch = ipch,
+    lty = ilty,
+    lwd = ilwd
+  )
+}
+
+# Draw Polygon
+draw_polygon <- function(xx, yy, icol, ibg, ilty = par("lty"), ilwd = par("lwd"), ...) {
+  polygon(
+    x = xx,
+    y = yy,
+    border = icol,
+    col = ibg,
+    lty = ilty,
+    lwd = ilwd
+  )
+}
+
+# Draw Polypath
+draw_polypath <- function(xx, yy, icol, ibg, ilty, ilwd, dots) {
+  irule <- ifelse(!is.null(dots[["rule"]]), dots[["rule"]], "winding")
+  polypath(
+    x = xx,
+    y = yy,
+    border = icol,
+    col = ibg,
+    lty = ilty,
+    lwd = ilwd,
+    rule = irule
+  )
+}
+
+# Draw Boxplot
+draw_boxplot <- function(xx, yy, ipch, ilty, icol, ibg, dots, i = 1, x_by = FALSE, facet_by = FALSE, split_data, ...) {
+  at_xx <- unique(xx)
+  horizontal <- ifelse(!is.null(dots[["horizontal"]]), dots[["horizontal"]], FALSE)
+  range_xx <- ifelse(!is.null(dots[["range"]]), dots[["range"]], 1.5)
+  boxwidth_xx <- ifelse(!is.null(dots[["boxwidth"]]), dots[["boxwidth"]], NULL)
+  varwidth_xx <- ifelse(!is.null(dots[["varwidth"]]), dots[["varwidth"]], FALSE)
+  notch_xx <- ifelse(!is.null(dots[["notch"]]), dots[["notch"]], FALSE)
+  outline_xx <- ifelse(!is.null(dots[["outline"]]), dots[["outline"]], TRUE)
+  boxwex_xx <- ifelse(!is.null(dots[["boxwex"]]), dots[["boxwex"]], 0.8)
+  if (isTRUE(x_by)) boxwex_xx <- boxwex_xx * 2
+  staplewex_xx <- ifelse(!is.null(dots[["staplewex"]]), dots[["staplewex"]], 0.5)
+  outwex_xx <- ifelse(!is.null(dots[["outwex"]]), dots[["outwex"]], 0.5)
+  
+  # Handle multiple groups
+  if (!is.null(split_data) && isFALSE(x_by) && isFALSE(facet_by) && length(split_data) > 1) {
+    boxwex_xx_orig <- boxwex_xx
+    boxwex_xx <- boxwex_xx / length(split_data) - 0.01
+    at_xx <- at_xx + seq(
+      -((boxwex_xx_orig - boxwex_xx) / 2),
+      ((boxwex_xx_orig - boxwex_xx) / 2),
+      length.out = length(split_data)
+    )[i]
+  }
+  
+  boxplot(
+    formula = yy ~ xx,
+    pch = ipch,
+    lty = ilty,
+    border = icol,
+    col = ibg,
+    add = TRUE, axes = FALSE,
+    horizontal = horizontal,
+    at = at_xx,
+    range = range_xx,
+    width = boxwidth_xx,
+    varwidth = varwidth_xx,
+    notch = notch_xx,
+    outline = outline_xx,
+    boxwex = boxwex_xx,
+    staplewex = staplewex_xx,
+    outwex = outwex_xx
+  )
+}
+
+# Draw Rectangle
+draw_rect <- function(xxmin, yymin, xxmax, yymax, ilty, ilwd, icol, ibg, ...) {
+  rect(
+    xleft = xxmin, ybottom = yymin, xright = xxmax, ytop = yymax,
+    lty = ilty,
+    lwd = ilwd,
+    border = icol,
+    col = ibg
+  )
+}
+
+# Draw Segments
+draw_segments <- function(xxmin, yymin, xxmax, yymax, ilty, ilwd, icol, ...) {
+  segments(
+    x0 = xxmin, y0 = yymin, x1 = xxmax, y1 = yymax,
+    lty = ilty,
+    lwd = ilwd,
+    col = icol
+  )
+}
+
+# # Dispatcher Function
+# draw_elements <- function(
+#   type,
+#   xx,
+#   yy,
+#   xxmin,
+#   xxmax,
+#   yymin,
+#   yymax,
+#   bg,
+#   icol,
+#   ilwd,
+#   ipch,
+#   ibg,
+#   ilty,
+#   cex,
+#   dots,
+#   empty_plot,
+#   facet_by,
+#   split_data,
+#   i = 1,
+#   x_by = FALSE,
+#   flip = FALSE,
+#   ...
+# ) {
+#   if (isTRUE(empty_plot)) {
+#     # Do nothing for empty plot
+#     return()
+#   }
+#   
+#   switch(
+#     type,
+#     "ribbon" = draw_ribbon(xx, yy, xxmin, xxmax, yymin, yymax, bg, i, flip, ...),
+#     "pointrange" = {
+#       draw_pointrange(xxmin, yymin, xxmax, yymax, icol, ilwd, ...)
+#       draw_points(xx, yy, icol, ibg, ipch, ilwd, cex, ...)
+#     },
+#     "errorbar" = {
+#       draw_errorbar(xxmin, yymin, xxmax, yymax, icol, ilwd, ...)
+#       draw_points(xx, yy, icol, ibg, ipch, ilwd, cex, ...)
+#     },
+#     "p" = draw_points(xx, yy, icol, ibg, ipch, ilwd, cex, ...),
+#     "l" = draw_lines(xx, yy, icol, ipch, ilty, ilwd, type, ...),
+#     "o" = draw_lines(xx, yy, icol, ipch, ilty, ilwd, type, ...),
+#     "b" = draw_lines(xx, yy, icol, ipch, ilty, ilwd, type, ...),
+#     "c" = draw_lines(xx, yy, icol, ipch, ilty, ilwd, type, ...),
+#     "h" = draw_lines(xx, yy, icol, ipch, ilty, ilwd, type, ...),
+#     "s" = draw_lines(xx, yy, icol, ipch, ilty, ilwd, type, ...),
+#     "S" = draw_lines(xx, yy, icol, ipch, ilty, ilwd, type, ...),
+#     "polygon" = draw_polygon(xx, yy, icol, ibg, ilty, ilwd, ...),
+#     "polypath" = draw_polypath(xx, yy, icol, ibg, ilty, ilwd, dots, ...),
+#     "boxplot" = draw_boxplot(xx, yy, ipch, ilty, icol, ibg, dots, i, x_by, facet_by, split_data, ...),
+#     "rect" = draw_rect(xxmin, yymin, xxmax, yymax, ilty, ilwd, icol, ibg, ...),
+#     "segments" = draw_segments(xxmin, yymin, xxmax, yymax, ilty, ilwd, icol, ...),
+#     stop("`type` argument not supported.", call. = FALSE)
+#   )
+# }
+#

From 1fc923aa4b5c6b23576f9208780a8b424481242b Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 13:08:29 -0400
Subject: [PATCH 17/72] draw_ribbon

---
 R/draw_elements.R | 23 ++++-------------------
 1 file changed, 4 insertions(+), 19 deletions(-)

diff --git a/R/draw_elements.R b/R/draw_elements.R
index d646a113..a3187313 100644
--- a/R/draw_elements.R
+++ b/R/draw_elements.R
@@ -30,22 +30,7 @@ draw_elements = function(
       if (isTRUE(empty_plot)) {
 
       } else if (type == "ribbon") {
-        if (isFALSE(flip)) {
-          polygon(
-            x = c(xx, rev(xx)),
-            y = c(yymin, rev(yymax)),
-            col = bg[i],
-            border = FALSE
-          )
-        } else {
-          polygon(
-            x = c(xxmin, rev(xxmax)),
-            y = c(yy, rev(yy)),
-            col = bg[i],
-            border = FALSE
-          )
-
-        }
+        draw_ribbon( xx = xx, yy = yy, xxmin = xxmin, xxmax = xxmax, yymin = yymin, yymax = yymax, icol = icol, ibg = ibg, flip = flip)
 
       } else if (type == "pointrange") {
         draw_pointrange(xx = xx, yy = yy, xxmin = xxmin, yymin = yymin, xxmax = xxmax, yymax = yymax, icol = icol, ilwd = ilwd, ipch = ipch, cex = cex, ibg = ibg)
@@ -140,11 +125,11 @@ draw_elements = function(
 
 
 # Draw Ribbon
-draw_ribbon <- function(xx, yy, xxmin, xxmax, yymin, yymax, bg, i = 1, flip = FALSE, ...) {
+draw_ribbon <- function(xx, yy, xxmin, xxmax, yymin, yymax, ibg, icol, i = 1, flip = FALSE, ...) {
   if (isFALSE(flip)) {
-    draw_polygon(x = c(xx, rev(xx)), y = c(yymin, rev(yymax)), icol = bg[i], ibg = bg[i])
+    draw_polygon(x = c(xx, rev(xx)), y = c(yymin, rev(yymax)), icol = NA, ibg = ibg)
   } else {
-    draw_polygon(x = c(xxmin, rev(xxmax)), y = c(yy, rev(yy)), icol = bg[i], ibg = bg[i])
+    draw_polygon(x = c(xxmin, rev(xxmax)), y = c(yy, rev(yy)), icol = NA, ibg = ibg)
   }
 }
 

From 080c4a25d72b2e441cb3a85a0051b2adc51daedc Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 13:47:23 -0400
Subject: [PATCH 18/72] draw_fun

---
 R/draw_elements.R | 213 ++++++++++++++++------------------------------
 1 file changed, 75 insertions(+), 138 deletions(-)

diff --git a/R/draw_elements.R b/R/draw_elements.R
index a3187313..773ee997 100644
--- a/R/draw_elements.R
+++ b/R/draw_elements.R
@@ -26,47 +26,13 @@ draw_elements = function(
     flip = FALSE
     ) {
 
-      ## polygons before lines, segments/arrows before points, etc.
-      if (isTRUE(empty_plot)) {
-
-      } else if (type == "ribbon") {
-        draw_ribbon( xx = xx, yy = yy, xxmin = xxmin, xxmax = xxmax, yymin = yymin, yymax = yymax, icol = icol, ibg = ibg, flip = flip)
-
-      } else if (type == "pointrange") {
-        draw_pointrange(xx = xx, yy = yy, xxmin = xxmin, yymin = yymin, xxmax = xxmax, yymax = yymax, icol = icol, ilwd = ilwd, ipch = ipch, cex = cex, ibg = ibg)
-
-      } else if (type == "errorbar") {
-        draw_errorbar(xx = xx, yy = yy, xxmin = xxmin, yymin = yymin, xxmax = xxmax, yymax = yymax, icol = icol, ilwd = ilwd, ipch = ipch, cex = cex, ibg = ibg)
-
-      }
-
-      ## now draw the points/lines/polygons/etc
-      if (isTRUE(empty_plot)) {
-        # empty plot
-      } else if (type == "p") {
-        draw_points(xx = xx, yy = yy, icol = icol, ibg = ibg, ipch = ipch, ilwd = ilwd, cex = cex)
+      types = c("boxplot", "ribbon", "pointrange", "errorbar", "polygon", "polypath", "rect", "segments", "p", "points", "l", "o", "b", "c", "h", "s", "S", "n")
+      assert_choice(type, types, null.ok = TRUE)
 
-     } else if (type %in% c("l", "o", "b", "c", "h", "s", "S", "ribbon")) {
-        rtype = type == "ribbon"
-        if (rtype) type = "l"
-        lines(
-          x = xx,
-          y = yy,
-          col = icol,
-          type = type,
-          pch = ipch,
-          lty = ilty,
-          lwd = ilwd
-        )
-        if (rtype) type = "ribbon"
-
-      } else if (type == "polygon") {
-        draw_polygon(x = xx, y = yy, icol = icol, ibg = ibg, ilty = ilty, ilwd = ilwd)
-
-      } else if (type == "polypath") {
-        draw_polypath(xx = xx, yy = yy, icol = icol, ibg = ibg, ilty = ilty, ilwd = ilwd, dots = dots)
+      ## polygons before lines, segments/arrows before points, etc.
+      if (isTRUE(empty_plot)) return(invisible())
 
-      } else if (type == "boxplot") {
+      if (type == "boxplot") {
         at_xx = unique(xx)
         horizontal = ifelse(!is.null(dots[["horizontal"]]), dots[["horizontal"]], FALSE)
         range_xx = ifelse(!is.null(dots[["range"]]), dots[["range"]], 1.5)
@@ -102,37 +68,57 @@ draw_elements = function(
           staplewex = staplewex_xx,
           outwex = outwex_xx
         )
-      } else if (type == "rect") {
-        rect(
-          xleft = xxmin, ybottom = yymin, xright = xxmax, ytop = yymax,
-          lty = ilty,
-          lwd = ilwd,
-          border = icol,
-          col = ibg
-        )
-      } else if (type == "segments") {
-        segments(
-          x0 = xxmin, y0 = yymin, x1 = xxmax, y1 = yymax,
-          lty = ilty,
-          lwd = ilwd,
-          col = icol
-        )
-      } else if (!type %in% c("pointrange", "errorbar")) {
-        stop("`type` argument not supported.", call. = FALSE)
+
+    } else {
+        draw_fun = switch(
+        type,
+        "ribbon" = draw_ribbon,
+        "pointrange" = draw_pointrange,
+        "errorbar" = draw_errorbar,
+        "polygon" = draw_polygon,
+        "polypath" = draw_polypath,
+        "rect" = draw_rect,
+        "segments" = draw_segments,
+        "p" = ,
+        "points" = draw_points,
+        "l" = ,
+        "o" = ,
+        "b" = ,
+        "c" = ,
+        "h" = ,
+        "s" = ,
+        "S" = draw_lines)
+        draw_fun(xx = xx,
+          yy = yy,
+          xxmin = xxmin,
+          yymin = yymin,
+          xxmax = xxmax,
+          yymax = yymax,
+          icol = icol,
+          ilwd = ilwd,
+          ilty = ilty,
+          ipch = ipch,
+          cex = cex,
+          ibg = ibg,
+          dots = dots,
+          type = type,
+          flip = flip)
+
       }
 }
 
 
-
 # Draw Ribbon
-draw_ribbon <- function(xx, yy, xxmin, xxmax, yymin, yymax, ibg, icol, i = 1, flip = FALSE, ...) {
+draw_ribbon <- function(xx, yy, xxmin, xxmax, yymin, yymax, ibg, ilty, ilwd, icol, ipch, i = 1, flip = FALSE, ...) {
   if (isFALSE(flip)) {
     draw_polygon(x = c(xx, rev(xx)), y = c(yymin, rev(yymax)), icol = NA, ibg = ibg)
   } else {
     draw_polygon(x = c(xxmin, rev(xxmax)), y = c(yy, rev(yy)), icol = NA, ibg = ibg)
   }
+  draw_lines(xx = xx, yy = yy, icol = icol, ipch = ipch, ilty = ilty, ilwd = ilwd, type = "l")
 }
 
+
 # Draw Pointrange
 draw_pointrange <- function(xx, yy, xxmin, yymin, xxmax, yymax, icol, ibg, ipch, ilwd, cex, ...) {
   segments(
@@ -146,6 +132,7 @@ draw_pointrange <- function(xx, yy, xxmin, yymin, xxmax, yymax, icol, ibg, ipch,
   draw_points(xx = xx, yy = yy, icol = icol, ibg = ibg, ipch = ipch, ilwd = ilwd, cex = cex)
 }
 
+
 # Draw Errorbar
 draw_errorbar <- function(xx, yy, xxmin, yymin, xxmax, yymax, icol, ibg, ipch, ilwd, cex, ...) {
   arrows(
@@ -162,6 +149,7 @@ draw_errorbar <- function(xx, yy, xxmin, yymin, xxmax, yymax, icol, ibg, ipch, i
   draw_points(xx = xx, yy = yy, icol = icol, ibg = ibg, ipch = ipch, ilwd = ilwd, cex = cex)
 }
 
+
 # Draw Points
 draw_points <- function(xx, yy, icol, ibg, ipch, ilwd, cex, ...) {
   points(
@@ -176,6 +164,7 @@ draw_points <- function(xx, yy, icol, ibg, ipch, ilwd, cex, ...) {
   )
 }
 
+
 # Draw Lines
 draw_lines <- function(xx, yy, icol, ipch, ilty, ilwd, type, ...) {
   lines(
@@ -189,6 +178,7 @@ draw_lines <- function(xx, yy, icol, ipch, ilty, ilwd, type, ...) {
   )
 }
 
+
 # Draw Polygon
 draw_polygon <- function(xx, yy, icol, ibg, ilty = par("lty"), ilwd = par("lwd"), ...) {
   polygon(
@@ -201,8 +191,9 @@ draw_polygon <- function(xx, yy, icol, ibg, ilty = par("lty"), ilwd = par("lwd")
   )
 }
 
+
 # Draw Polypath
-draw_polypath <- function(xx, yy, icol, ibg, ilty, ilwd, dots) {
+draw_polypath <- function(xx, yy, icol, ibg, ilty, ilwd, dots, ...) {
   irule <- ifelse(!is.null(dots[["rule"]]), dots[["rule"]], "winding")
   polypath(
     x = xx,
@@ -215,6 +206,30 @@ draw_polypath <- function(xx, yy, icol, ibg, ilty, ilwd, dots) {
   )
 }
 
+
+# Draw Rectangle
+draw_rect <- function(xxmin, yymin, xxmax, yymax, ilty, ilwd, icol, ibg, ...) {
+  rect(
+    xleft = xxmin, ybottom = yymin, xright = xxmax, ytop = yymax,
+    lty = ilty,
+    lwd = ilwd,
+    border = icol,
+    col = ibg
+  )
+}
+
+
+# Draw Segments
+draw_segments <- function(xxmin, yymin, xxmax, yymax, ilty, ilwd, icol, ...) {
+  segments(
+    x0 = xxmin, y0 = yymin, x1 = xxmax, y1 = yymax,
+    lty = ilty,
+    lwd = ilwd,
+    col = icol
+  )
+}
+
+
 # Draw Boxplot
 draw_boxplot <- function(xx, yy, ipch, ilty, icol, ibg, dots, i = 1, x_by = FALSE, facet_by = FALSE, split_data, ...) {
   at_xx <- unique(xx)
@@ -239,7 +254,7 @@ draw_boxplot <- function(xx, yy, ipch, ilty, icol, ibg, dots, i = 1, x_by = FALS
       length.out = length(split_data)
     )[i]
   }
-  
+
   boxplot(
     formula = yy ~ xx,
     pch = ipch,
@@ -260,82 +275,4 @@ draw_boxplot <- function(xx, yy, ipch, ilty, icol, ibg, dots, i = 1, x_by = FALS
   )
 }
 
-# Draw Rectangle
-draw_rect <- function(xxmin, yymin, xxmax, yymax, ilty, ilwd, icol, ibg, ...) {
-  rect(
-    xleft = xxmin, ybottom = yymin, xright = xxmax, ytop = yymax,
-    lty = ilty,
-    lwd = ilwd,
-    border = icol,
-    col = ibg
-  )
-}
-
-# Draw Segments
-draw_segments <- function(xxmin, yymin, xxmax, yymax, ilty, ilwd, icol, ...) {
-  segments(
-    x0 = xxmin, y0 = yymin, x1 = xxmax, y1 = yymax,
-    lty = ilty,
-    lwd = ilwd,
-    col = icol
-  )
-}
 
-# # Dispatcher Function
-# draw_elements <- function(
-#   type,
-#   xx,
-#   yy,
-#   xxmin,
-#   xxmax,
-#   yymin,
-#   yymax,
-#   bg,
-#   icol,
-#   ilwd,
-#   ipch,
-#   ibg,
-#   ilty,
-#   cex,
-#   dots,
-#   empty_plot,
-#   facet_by,
-#   split_data,
-#   i = 1,
-#   x_by = FALSE,
-#   flip = FALSE,
-#   ...
-# ) {
-#   if (isTRUE(empty_plot)) {
-#     # Do nothing for empty plot
-#     return()
-#   }
-#   
-#   switch(
-#     type,
-#     "ribbon" = draw_ribbon(xx, yy, xxmin, xxmax, yymin, yymax, bg, i, flip, ...),
-#     "pointrange" = {
-#       draw_pointrange(xxmin, yymin, xxmax, yymax, icol, ilwd, ...)
-#       draw_points(xx, yy, icol, ibg, ipch, ilwd, cex, ...)
-#     },
-#     "errorbar" = {
-#       draw_errorbar(xxmin, yymin, xxmax, yymax, icol, ilwd, ...)
-#       draw_points(xx, yy, icol, ibg, ipch, ilwd, cex, ...)
-#     },
-#     "p" = draw_points(xx, yy, icol, ibg, ipch, ilwd, cex, ...),
-#     "l" = draw_lines(xx, yy, icol, ipch, ilty, ilwd, type, ...),
-#     "o" = draw_lines(xx, yy, icol, ipch, ilty, ilwd, type, ...),
-#     "b" = draw_lines(xx, yy, icol, ipch, ilty, ilwd, type, ...),
-#     "c" = draw_lines(xx, yy, icol, ipch, ilty, ilwd, type, ...),
-#     "h" = draw_lines(xx, yy, icol, ipch, ilty, ilwd, type, ...),
-#     "s" = draw_lines(xx, yy, icol, ipch, ilty, ilwd, type, ...),
-#     "S" = draw_lines(xx, yy, icol, ipch, ilty, ilwd, type, ...),
-#     "polygon" = draw_polygon(xx, yy, icol, ibg, ilty, ilwd, ...),
-#     "polypath" = draw_polypath(xx, yy, icol, ibg, ilty, ilwd, dots, ...),
-#     "boxplot" = draw_boxplot(xx, yy, ipch, ilty, icol, ibg, dots, i, x_by, facet_by, split_data, ...),
-#     "rect" = draw_rect(xxmin, yymin, xxmax, yymax, ilty, ilwd, icol, ibg, ...),
-#     "segments" = draw_segments(xxmin, yymin, xxmax, yymax, ilty, ilwd, icol, ...),
-#     stop("`type` argument not supported.", call. = FALSE)
-#   )
-# }
-#

From 66d955f815bec26d56e53187d73c8ee1a3c2234b Mon Sep 17 00:00:00 2001
From: Grant McDermott <grant.mcdermott@gmail.com>
Date: Sat, 5 Oct 2024 11:03:03 -0700
Subject: [PATCH 19/72] Vincent comments

---
 NEWS.md      | 3 ++-
 R/tinyplot.R | 1 +
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/NEWS.md b/NEWS.md
index 632398a4..909ee283 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -10,7 +10,8 @@ New features:
 
 - The new `flip` argument allows for easily flipping (swapping) the orientation
 of the x and y axes. This should work regardless of plot type, e.g.
-`plt(~Sepal.Length, data = iris, type = "density")`. (#216 @grantmcdermott)
+`plt(~Sepal.Length | Species, data = iris, type = "density", flip = TRUE)`.
+(#216 @grantmcdermott)
 
 Bug fixes:
 
diff --git a/R/tinyplot.R b/R/tinyplot.R
index 5ba232f8..28cd69d7 100644
--- a/R/tinyplot.R
+++ b/R/tinyplot.R
@@ -685,6 +685,7 @@ tinyplot.default = function(
   }
   
   # swap x and y values if flip is TRUE
+  assert_flag(flip)
   if (isTRUE(flip)) {
     if (type != "boxplot") {
       # limits, labs, etc.

From 7b3ba0d32111a3c9a266748cd66473bcce5f5eab Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 14:07:58 -0400
Subject: [PATCH 20/72] draw elements works

---
 R/draw_elements.R | 80 +++++++++++------------------------------------
 1 file changed, 19 insertions(+), 61 deletions(-)

diff --git a/R/draw_elements.R b/R/draw_elements.R
index 773ee997..7d523aa6 100644
--- a/R/draw_elements.R
+++ b/R/draw_elements.R
@@ -32,45 +32,7 @@ draw_elements = function(
       ## polygons before lines, segments/arrows before points, etc.
       if (isTRUE(empty_plot)) return(invisible())
 
-      if (type == "boxplot") {
-        at_xx = unique(xx)
-        horizontal = ifelse(!is.null(dots[["horizontal"]]), dots[["horizontal"]], FALSE)
-        range_xx = ifelse(!is.null(dots[["range"]]), dots[["range"]], 1.5)
-        boxwidth_xx = NULL
-        if (!is.null(dots[["boxwidth"]])) boxwidth_xx = dots[["boxwidth"]]
-        varwidth_xx = ifelse(!is.null(dots[["varwidth"]]), dots[["varwidth"]], FALSE)
-        notch_xx = ifelse(!is.null(dots[["notch"]]), dots[["notch"]], FALSE)
-        outline_xx = ifelse(!is.null(dots[["outline"]]), dots[["outline"]], TRUE)
-        boxwex_xx = ifelse(!is.null(dots[["boxwex"]]), dots[["boxwex"]], 0.8)
-        if (isTRUE(x_by)) boxwex_xx = boxwex_xx * 2
-        staplewex_xx = ifelse(!is.null(dots[["staplewex"]]), dots[["staplewex"]], 0.5)
-        outwex_xx = ifelse(!is.null(dots[["outwex"]]), dots[["outwex"]], 0.5)
-        if (!is.null(by) && isFALSE(x_by) && isFALSE(facet_by) && length(split_data) > 1) {
-          boxwex_xx_orig = boxwex_xx
-          boxwex_xx = boxwex_xx / length(split_data) - 0.01
-          at_xx = at_xx + seq(-((boxwex_xx_orig - boxwex_xx) / 2), ((boxwex_xx_orig - boxwex_xx) / 2), length.out = length(split_data))[i]
-        }
-        boxplot(
-          formula = yy ~ xx,
-          pch = ipch,
-          lty = ilty,
-          border = icol,
-          col = ibg,
-          add = TRUE, axes = FALSE,
-          horizontal = horizontal,
-          at = at_xx,
-          range = range_xx,
-          width = boxwidth_xx,
-          varwidth = varwidth_xx,
-          notch = notch_xx,
-          outline = outline_xx,
-          boxwex = boxwex_xx,
-          staplewex = staplewex_xx,
-          outwex = outwex_xx
-        )
-
-    } else {
-        draw_fun = switch(
+      draw_fun = switch(
         type,
         "ribbon" = draw_ribbon,
         "pointrange" = draw_pointrange,
@@ -79,6 +41,7 @@ draw_elements = function(
         "polypath" = draw_polypath,
         "rect" = draw_rect,
         "segments" = draw_segments,
+        "boxplot" = draw_boxplot,
         "p" = ,
         "points" = draw_points,
         "l" = ,
@@ -88,7 +51,7 @@ draw_elements = function(
         "h" = ,
         "s" = ,
         "S" = draw_lines)
-        draw_fun(xx = xx,
+      draw_fun(xx = xx,
           yy = yy,
           xxmin = xxmin,
           yymin = yymin,
@@ -102,13 +65,15 @@ draw_elements = function(
           ibg = ibg,
           dots = dots,
           type = type,
+          i = i,
+          x_by = x_by,
+          facet_by = facet_by,
+          split_data = split_data,
           flip = flip)
 
-      }
 }
 
 
-# Draw Ribbon
 draw_ribbon <- function(xx, yy, xxmin, xxmax, yymin, yymax, ibg, ilty, ilwd, icol, ipch, i = 1, flip = FALSE, ...) {
   if (isFALSE(flip)) {
     draw_polygon(x = c(xx, rev(xx)), y = c(yymin, rev(yymax)), icol = NA, ibg = ibg)
@@ -119,7 +84,6 @@ draw_ribbon <- function(xx, yy, xxmin, xxmax, yymin, yymax, ibg, ilty, ilwd, ico
 }
 
 
-# Draw Pointrange
 draw_pointrange <- function(xx, yy, xxmin, yymin, xxmax, yymax, icol, ibg, ipch, ilwd, cex, ...) {
   segments(
     x0 = xxmin,
@@ -133,7 +97,6 @@ draw_pointrange <- function(xx, yy, xxmin, yymin, xxmax, yymax, icol, ibg, ipch,
 }
 
 
-# Draw Errorbar
 draw_errorbar <- function(xx, yy, xxmin, yymin, xxmax, yymax, icol, ibg, ipch, ilwd, cex, ...) {
   arrows(
     x0 = xxmin,
@@ -150,7 +113,6 @@ draw_errorbar <- function(xx, yy, xxmin, yymin, xxmax, yymax, icol, ibg, ipch, i
 }
 
 
-# Draw Points
 draw_points <- function(xx, yy, icol, ibg, ipch, ilwd, cex, ...) {
   points(
     x = xx,
@@ -165,7 +127,6 @@ draw_points <- function(xx, yy, icol, ibg, ipch, ilwd, cex, ...) {
 }
 
 
-# Draw Lines
 draw_lines <- function(xx, yy, icol, ipch, ilty, ilwd, type, ...) {
   lines(
     x = xx,
@@ -179,7 +140,6 @@ draw_lines <- function(xx, yy, icol, ipch, ilty, ilwd, type, ...) {
 }
 
 
-# Draw Polygon
 draw_polygon <- function(xx, yy, icol, ibg, ilty = par("lty"), ilwd = par("lwd"), ...) {
   polygon(
     x = xx,
@@ -192,7 +152,6 @@ draw_polygon <- function(xx, yy, icol, ibg, ilty = par("lty"), ilwd = par("lwd")
 }
 
 
-# Draw Polypath
 draw_polypath <- function(xx, yy, icol, ibg, ilty, ilwd, dots, ...) {
   irule <- ifelse(!is.null(dots[["rule"]]), dots[["rule"]], "winding")
   polypath(
@@ -207,7 +166,6 @@ draw_polypath <- function(xx, yy, icol, ibg, ilty, ilwd, dots, ...) {
 }
 
 
-# Draw Rectangle
 draw_rect <- function(xxmin, yymin, xxmax, yymax, ilty, ilwd, icol, ibg, ...) {
   rect(
     xleft = xxmin, ybottom = yymin, xright = xxmax, ytop = yymax,
@@ -219,7 +177,6 @@ draw_rect <- function(xxmin, yymin, xxmax, yymax, ilty, ilwd, icol, ibg, ...) {
 }
 
 
-# Draw Segments
 draw_segments <- function(xxmin, yymin, xxmax, yymax, ilty, ilwd, icol, ...) {
   segments(
     x0 = xxmin, y0 = yymin, x1 = xxmax, y1 = yymax,
@@ -230,20 +187,20 @@ draw_segments <- function(xxmin, yymin, xxmax, yymax, ilty, ilwd, icol, ...) {
 }
 
 
-# Draw Boxplot
 draw_boxplot <- function(xx, yy, ipch, ilty, icol, ibg, dots, i = 1, x_by = FALSE, facet_by = FALSE, split_data, ...) {
+
   at_xx <- unique(xx)
-  horizontal <- ifelse(!is.null(dots[["horizontal"]]), dots[["horizontal"]], FALSE)
-  range_xx <- ifelse(!is.null(dots[["range"]]), dots[["range"]], 1.5)
-  boxwidth_xx <- ifelse(!is.null(dots[["boxwidth"]]), dots[["boxwidth"]], NULL)
-  varwidth_xx <- ifelse(!is.null(dots[["varwidth"]]), dots[["varwidth"]], FALSE)
-  notch_xx <- ifelse(!is.null(dots[["notch"]]), dots[["notch"]], FALSE)
-  outline_xx <- ifelse(!is.null(dots[["outline"]]), dots[["outline"]], TRUE)
-  boxwex_xx <- ifelse(!is.null(dots[["boxwex"]]), dots[["boxwex"]], 0.8)
+  horizontal <- if (!is.null(dots[["horizontal"]])) dots[["horizontal"]] else FALSE
+  range_xx <- if (!is.null(dots[["range"]])) dots[["range"]] else 1.5
+  boxwidth_xx <- if (!is.null(dots[["boxwidth"]])) dots[["boxwidth"]] else NULL
+  varwidth_xx <- if (!is.null(dots[["varwidth"]])) dots[["varwidth"]] else FALSE
+  notch_xx <- if (!is.null(dots[["notch"]])) dots[["notch"]] else FALSE
+  outline_xx <- if (!is.null(dots[["outline"]])) dots[["outline"]] else TRUE
+  boxwex_xx <- if (!is.null(dots[["boxwex"]])) dots[["boxwex"]] else 0.8
   if (isTRUE(x_by)) boxwex_xx <- boxwex_xx * 2
-  staplewex_xx <- ifelse(!is.null(dots[["staplewex"]]), dots[["staplewex"]], 0.5)
-  outwex_xx <- ifelse(!is.null(dots[["outwex"]]), dots[["outwex"]], 0.5)
-  
+  staplewex_xx <- if (!is.null(dots[["staplewex"]])) dots[["staplewex"]] else 0.5
+  outwex_xx <- if (!is.null(dots[["outwex"]])) dots[["outwex"]] else 0.5
+
   # Handle multiple groups
   if (!is.null(split_data) && isFALSE(x_by) && isFALSE(facet_by) && length(split_data) > 1) {
     boxwex_xx_orig <- boxwex_xx
@@ -273,6 +230,7 @@ draw_boxplot <- function(xx, yy, ipch, ilty, icol, ibg, dots, i = 1, x_by = FALS
     staplewex = staplewex_xx,
     outwex = outwex_xx
   )
+
 }
 
 

From 28e9c80f866a2c17fe426349d4829e5b4bde04b7 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 16:08:07 -0400
Subject: [PATCH 21/72] type function factories

---
 .Rbuildignore     |   3 +-
 R/draw_elements.R | 219 ++++++++++++++++++++++------------------------
 R/sanitize.R      |  14 ++-
 R/tinyplot.R      |  36 +++++---
 R/type_jitter.R   |  81 ++++++++++-------
 R/type_points.R   |  29 ++++++
 6 files changed, 218 insertions(+), 164 deletions(-)
 create mode 100644 R/type_points.R

diff --git a/.Rbuildignore b/.Rbuildignore
index de8dbdc6..1203e7a9 100644
--- a/.Rbuildignore
+++ b/.Rbuildignore
@@ -19,4 +19,5 @@ vignettes/
 ^LICENSE\.md$
 ^cran-comments\.md$
 ^CRAN-SUBMISSION$
-#inst/tinytest/
\ No newline at end of file
+#inst/tinytest/
+Makefile
diff --git a/R/draw_elements.R b/R/draw_elements.R
index 7d523aa6..14486c25 100644
--- a/R/draw_elements.R
+++ b/R/draw_elements.R
@@ -4,26 +4,26 @@
 #
 draw_elements = function(
     type,
-    xx,
-    yy,
-    xxmin,
-    xxmax,
-    yymin,
-    yymax,
-    bg,
+    ix,
+    iy,
+    ixmin,
+    ixmax,
+    iymin,
+    iymax,
     icol,
     ilwd,
     ipch,
     ibg,
     ilty,
+    i,
     cex,
     dots,
     empty_plot,
     facet_by,
     split_data,
-    i = 1,
     x_by = FALSE,
-    flip = FALSE
+    flip = FALSE,
+    draw_fun = NULL
     ) {
 
       types = c("boxplot", "ribbon", "pointrange", "errorbar", "polygon", "polypath", "rect", "segments", "p", "points", "l", "o", "b", "c", "h", "s", "S", "n")
@@ -32,105 +32,96 @@ draw_elements = function(
       ## polygons before lines, segments/arrows before points, etc.
       if (isTRUE(empty_plot)) return(invisible())
 
-      draw_fun = switch(
-        type,
-        "ribbon" = draw_ribbon,
-        "pointrange" = draw_pointrange,
-        "errorbar" = draw_errorbar,
-        "polygon" = draw_polygon,
-        "polypath" = draw_polypath,
-        "rect" = draw_rect,
-        "segments" = draw_segments,
-        "boxplot" = draw_boxplot,
-        "p" = ,
-        "points" = draw_points,
-        "l" = ,
-        "o" = ,
-        "b" = ,
-        "c" = ,
-        "h" = ,
-        "s" = ,
-        "S" = draw_lines)
-      draw_fun(xx = xx,
-          yy = yy,
-          xxmin = xxmin,
-          yymin = yymin,
-          xxmax = xxmax,
-          yymax = yymax,
-          icol = icol,
-          ilwd = ilwd,
-          ilty = ilty,
-          ipch = ipch,
-          cex = cex,
-          ibg = ibg,
-          dots = dots,
-          type = type,
-          i = i,
-          x_by = x_by,
-          facet_by = facet_by,
-          split_data = split_data,
-          flip = flip)
+      if (is.null(draw_fun)) {
+        draw_fun = switch(
+          type,
+          "ribbon" = draw_ribbon,
+          "pointrange" = draw_pointrange,
+          "errorbar" = draw_errorbar,
+          "polygon" = draw_polygon,
+          "polypath" = draw_polypath,
+          "rect" = draw_rect,
+          "segments" = draw_segments,
+          "boxplot" = draw_boxplot,
+          "p" = ,
+          "points" = draw_points,
+          "l" = ,
+          "o" = ,
+          "b" = ,
+          "c" = ,
+          "h" = ,
+          "s" = ,
+          "S" = draw_lines)
+      }
+      draw_fun(
+        ibg = ibg,
+        icol = icol,
+        ilty = ilty,
+        ilwd = ilwd,
+        ipch = ipch,
+        ix = ix,
+        ixmax = ixmax,
+        ixmin = ixmin,
+        iy = iy,
+        iymax = iymax,
+        iymin = iymin,
+        cex = cex,
+        dots = dots,
+        type = type,
+        x_by = x_by,
+        i = i,
+        facet_by = facet_by,
+        split_data = split_data,
+        flip = flip)
 
 }
 
 
-draw_ribbon <- function(xx, yy, xxmin, xxmax, yymin, yymax, ibg, ilty, ilwd, icol, ipch, i = 1, flip = FALSE, ...) {
+draw_ribbon <- function(ix, iy, ixmin, ixmax, iymin, iymax, ibg, ilty, ilwd, icol, ipch, i, flip = FALSE, ...) {
   if (isFALSE(flip)) {
-    draw_polygon(x = c(xx, rev(xx)), y = c(yymin, rev(yymax)), icol = NA, ibg = ibg)
+    draw_polygon(ix = c(ix, rev(ix)), iy = c(iymin, rev(iymax)), icol = NA, ibg = ibg)
   } else {
-    draw_polygon(x = c(xxmin, rev(xxmax)), y = c(yy, rev(yy)), icol = NA, ibg = ibg)
+    draw_polygon(ix = c(ixmin, rev(ixmax)), iy = c(iy, rev(iy)), icol = NA, ibg = ibg)
   }
-  draw_lines(xx = xx, yy = yy, icol = icol, ipch = ipch, ilty = ilty, ilwd = ilwd, type = "l")
+  draw_lines(ix = ix, iy = iy, icol = icol, ipch = ipch, ilty = ilty, ilwd = ilwd, type = "l")
 }
 
 
-draw_pointrange <- function(xx, yy, xxmin, yymin, xxmax, yymax, icol, ibg, ipch, ilwd, cex, ...) {
+draw_pointrange <- function(ix, iy, ixmin, iymin, ixmax, iymax, icol, ibg, ipch, ilwd, cex, ...) {
   segments(
-    x0 = xxmin,
-    y0 = yymin,
-    x1 = xxmax,
-    y1 = yymax,
+    x0 = ixmin,
+    y0 = iymin,
+    x1 = ixmax,
+    y1 = iymax,
     col = icol,
     lwd = ilwd
   )
-  draw_points(xx = xx, yy = yy, icol = icol, ibg = ibg, ipch = ipch, ilwd = ilwd, cex = cex)
+  draw_points(ix = ix, iy = iy, icol = icol, ibg = ibg, ipch = ipch, ilwd = ilwd, cex = cex)
 }
 
 
-draw_errorbar <- function(xx, yy, xxmin, yymin, xxmax, yymax, icol, ibg, ipch, ilwd, cex, ...) {
+draw_errorbar <- function(ix, iy, ixmin, iymin, ixmax, iymax, icol, ibg, ipch, ilwd, cex, ...) {
   arrows(
-    x0 = xxmin,
-    y0 = yymin,
-    x1 = xxmax,
-    y1 = yymax,
+    x0 = ixmin,
+    y0 = iymin,
+    x1 = ixmax,
+    y1 = iymax,
     col = icol,
     lwd = ilwd,
     length = 0.05,
     angle = 90,
     code = 3
   )
-  draw_points(xx = xx, yy = yy, icol = icol, ibg = ibg, ipch = ipch, ilwd = ilwd, cex = cex)
+  draw_points(ix = ix, iy = iy, icol = icol, ibg = ibg, ipch = ipch, ilwd = ilwd, cex = cex)
 }
 
 
-draw_points <- function(xx, yy, icol, ibg, ipch, ilwd, cex, ...) {
-  points(
-    x = xx,
-    y = yy,
-    col = icol,
-    bg = ibg,
-    type = "p",
-    pch = ipch,
-    lwd = ilwd,
-    cex = cex
-  )
-}
 
 
-draw_lines <- function(xx, yy, icol, ipch, ilty, ilwd, type, ...) {
+draw_lines <- function(ix, iy, icol, ipch, ilty, ilwd, type, ...) {
   lines(
-    x = xx,
-    y = yy,
+    x = ix,
+    y = iy,
     col = icol,
     type = type,
     pch = ipch,
@@ -140,10 +131,10 @@ draw_lines <- function(xx, yy, icol, ipch, ilty, ilwd, type, ...) {
 }
 
 
-draw_polygon <- function(xx, yy, icol, ibg, ilty = par("lty"), ilwd = par("lwd"), ...) {
+draw_polygon <- function(ix, iy, icol, ibg, ilty = par("lty"), ilwd = par("lwd"), ...) {
   polygon(
-    x = xx,
-    y = yy,
+    x = ix,
+    y = iy,
     border = icol,
     col = ibg,
     lty = ilty,
@@ -152,11 +143,11 @@ draw_polygon <- function(xx, yy, icol, ibg, ilty = par("lty"), ilwd = par("lwd")
 }
 
 
-draw_polypath <- function(xx, yy, icol, ibg, ilty, ilwd, dots, ...) {
+draw_polypath <- function(ix, iy, icol, ibg, ilty, ilwd, dots, ...) {
   irule <- ifelse(!is.null(dots[["rule"]]), dots[["rule"]], "winding")
   polypath(
-    x = xx,
-    y = yy,
+    x = ix,
+    y = iy,
     border = icol,
     col = ibg,
     lty = ilty,
@@ -166,9 +157,9 @@ draw_polypath <- function(xx, yy, icol, ibg, ilty, ilwd, dots, ...) {
 }
 
 
-draw_rect <- function(xxmin, yymin, xxmax, yymax, ilty, ilwd, icol, ibg, ...) {
+draw_rect <- function(ixmin, iymin, ixmax, iymax, ilty, ilwd, icol, ibg, ...) {
   rect(
-    xleft = xxmin, ybottom = yymin, xright = xxmax, ytop = yymax,
+    xleft = ixmin, ybottom = iymin, xright = ixmax, ytop = iymax,
     lty = ilty,
     lwd = ilwd,
     border = icol,
@@ -177,9 +168,9 @@ draw_rect <- function(xxmin, yymin, xxmax, yymax, ilty, ilwd, icol, ibg, ...) {
 }
 
 
-draw_segments <- function(xxmin, yymin, xxmax, yymax, ilty, ilwd, icol, ...) {
+draw_segments <- function(ixmin, iymin, ixmax, iymax, ilty, ilwd, icol, ...) {
   segments(
-    x0 = xxmin, y0 = yymin, x1 = xxmax, y1 = yymax,
+    x0 = ixmin, y0 = iymin, x1 = ixmax, y1 = iymax,
     lty = ilty,
     lwd = ilwd,
     col = icol
@@ -187,48 +178,48 @@ draw_segments <- function(xxmin, yymin, xxmax, yymax, ilty, ilwd, icol, ...) {
 }
 
 
-draw_boxplot <- function(xx, yy, ipch, ilty, icol, ibg, dots, i = 1, x_by = FALSE, facet_by = FALSE, split_data, ...) {
+draw_boxplot <- function(i, ix, iy, ipch, ilty, icol, ibg, dots, x_by = FALSE, facet_by = FALSE, split_data, ...) {
 
-  at_xx <- unique(xx)
+  at_ix <- unique(ix)
   horizontal <- if (!is.null(dots[["horizontal"]])) dots[["horizontal"]] else FALSE
-  range_xx <- if (!is.null(dots[["range"]])) dots[["range"]] else 1.5
-  boxwidth_xx <- if (!is.null(dots[["boxwidth"]])) dots[["boxwidth"]] else NULL
-  varwidth_xx <- if (!is.null(dots[["varwidth"]])) dots[["varwidth"]] else FALSE
-  notch_xx <- if (!is.null(dots[["notch"]])) dots[["notch"]] else FALSE
-  outline_xx <- if (!is.null(dots[["outline"]])) dots[["outline"]] else TRUE
-  boxwex_xx <- if (!is.null(dots[["boxwex"]])) dots[["boxwex"]] else 0.8
-  if (isTRUE(x_by)) boxwex_xx <- boxwex_xx * 2
-  staplewex_xx <- if (!is.null(dots[["staplewex"]])) dots[["staplewex"]] else 0.5
-  outwex_xx <- if (!is.null(dots[["outwex"]])) dots[["outwex"]] else 0.5
+  range_ix <- if (!is.null(dots[["range"]])) dots[["range"]] else 1.5
+  boxwidth_ix <- if (!is.null(dots[["boxwidth"]])) dots[["boxwidth"]] else NULL
+  varwidth_ix <- if (!is.null(dots[["varwidth"]])) dots[["varwidth"]] else FALSE
+  notch_ix <- if (!is.null(dots[["notch"]])) dots[["notch"]] else FALSE
+  outline_ix <- if (!is.null(dots[["outline"]])) dots[["outline"]] else TRUE
+  boxwex_ix <- if (!is.null(dots[["boxwex"]])) dots[["boxwex"]] else 0.8
+  if (isTRUE(x_by)) boxwex_ix <- boxwex_ix * 2
+  staplewex_ix <- if (!is.null(dots[["staplewex"]])) dots[["staplewex"]] else 0.5
+  outwex_ix <- if (!is.null(dots[["outwex"]])) dots[["outwex"]] else 0.5
 
   # Handle multiple groups
   if (!is.null(split_data) && isFALSE(x_by) && isFALSE(facet_by) && length(split_data) > 1) {
-    boxwex_xx_orig <- boxwex_xx
-    boxwex_xx <- boxwex_xx / length(split_data) - 0.01
-    at_xx <- at_xx + seq(
-      -((boxwex_xx_orig - boxwex_xx) / 2),
-      ((boxwex_xx_orig - boxwex_xx) / 2),
+    boxwex_ix_orig <- boxwex_ix
+    boxwex_ix <- boxwex_ix / length(split_data) - 0.01
+    at_ix <- at_ix + seq(
+      -((boxwex_ix_orig - boxwex_ix) / 2),
+      ((boxwex_ix_orig - boxwex_ix) / 2),
       length.out = length(split_data)
     )[i]
   }
 
   boxplot(
-    formula = yy ~ xx,
+    formula = iy ~ ix,
     pch = ipch,
     lty = ilty,
     border = icol,
     col = ibg,
     add = TRUE, axes = FALSE,
     horizontal = horizontal,
-    at = at_xx,
-    range = range_xx,
-    width = boxwidth_xx,
-    varwidth = varwidth_xx,
-    notch = notch_xx,
-    outline = outline_xx,
-    boxwex = boxwex_xx,
-    staplewex = staplewex_xx,
-    outwex = outwex_xx
+    at = at_ix,
+    range = range_ix,
+    width = boxwidth_ix,
+    varwidth = varwidth_ix,
+    notch = notch_ix,
+    outline = outline_ix,
+    boxwex = boxwex_ix,
+    staplewex = staplewex_ix,
+    outwex = outwex_ix
   )
 
 }
diff --git a/R/sanitize.R b/R/sanitize.R
index 4dc38e91..a9ff4327 100644
--- a/R/sanitize.R
+++ b/R/sanitize.R
@@ -7,6 +7,16 @@ sanitize_ribbon.alpha = function(ribbon.alpha) {
 
 
 sanitize_type = function(type, x, y) {
+    if (inherits(type, "tinyplot_type")) {
+        return(type)
+    }
+
+    if (identical(type, "points")) {
+        return(type_points())
+    } else if (isTRUE(type %in% c("j", "jitter"))) {
+        return(type_jitter())
+    }
+
     if (is.null(type)) {
         # enforce boxplot type for y ~ factor(x)
         if (!is.null(x) && is.factor(x) && !is.factor(y)) {
@@ -19,5 +29,7 @@ sanitize_type = function(type, x, y) {
     } else if (type %in% c("j", "jitter")) {
         type = "jitter"
     }
-    return(type)
+
+    out = list(draw = NULL, data = NULL, name = type)
+    return(out)
 }
diff --git a/R/tinyplot.R b/R/tinyplot.R
index 5ba232f8..20a2cc2e 100644
--- a/R/tinyplot.R
+++ b/R/tinyplot.R
@@ -528,16 +528,23 @@ tinyplot.default = function(
     flip = FALSE,
     ...
     ) {
-  
+
   dots = list(...)
 
   if (isTRUE(add)) legend = FALSE
   
   # sanitize arguments
   ribbon.alpha = sanitize_ribbon.alpha(ribbon.alpha)
-  type = sanitize_type(type, x, y)
   was_area_type = identical(type, "area") # flag to keep track for some legend adjustments below
 
+
+  # type factories vs. strings
+  type = sanitize_type(type, x, y)
+  type_data = type$data
+  type_draw = type$draw
+  type = type$name
+
+
   palette = substitute(palette)
 
   xlabs = ylabs = NULL
@@ -669,7 +676,7 @@ tinyplot.default = function(
     "pointrange" = type_pointrange,
     "errorbar" = type_pointrange
   )
-  if (isTRUE(type %in% names(type_dict))) {
+  if (!is.null(type_data) || isTRUE(type %in% names(type_dict))) {
     fargs = list(
       by = by,
       facet = facet,
@@ -680,8 +687,9 @@ tinyplot.default = function(
       ribbon.alpha = ribbon.alpha,
       xlabs = xlabs,
       datapoints = datapoints)
+    fun = if (is.null(type_data)) type_dict[[type]] else type_data
     fargs = c(fargs, dots)
-    list2env(do.call(type_dict[[type]], fargs), environment())
+    list2env(do.call(fun, fargs), environment())
   }
   
   # swap x and y values if flip is TRUE
@@ -1053,13 +1061,13 @@ tinyplot.default = function(
       # Draw the individual plot elements...
       draw_elements(
         type = type,
-        xx = xx,
-        yy = yy,
-        xxmin = xxmin,
-        xxmax = xxmax,
-        yymin = yymin,
-        yymax = yymax, 
-        bg = bg,
+        i = i,
+        ix = xx,
+        iy = yy,
+        ixmin = xxmin,
+        ixmax = xxmax,
+        iymin = yymin,
+        iymax = yymax, 
         icol = icol,
         ilwd = ilwd,
         ipch = ipch,
@@ -1070,9 +1078,9 @@ tinyplot.default = function(
         empty_plot = empty_plot,
         facet_by = facet_by,
         split_data = split_data,
-        i = i,
         x_by = x_by,
-        flip = flip
+        flip = flip,
+        draw_fun = type_draw
       )
     }
   }
@@ -1180,7 +1188,7 @@ tinyplot.formula = function(
   }
 
   ## nice axis and legend labels
-  if (!is.null(type) && type %in% c("hist", "histogram")) {
+  if (!is.null(type) && isTRUE(type %in% c("hist", "histogram"))) {
     if (is.null(ylab)) ylab = "Frequency"
     if (is.null(xlab)) xlab = xnam
   } else if (is.null(y)) {
diff --git a/R/type_jitter.R b/R/type_jitter.R
index 9ff0a10f..d5ec0788 100644
--- a/R/type_jitter.R
+++ b/R/type_jitter.R
@@ -1,37 +1,50 @@
-type_jitter = function(datapoints, ...) {
-  x = datapoints$x
-  y = datapoints$y
-  if (is.character(x)) x = as.factor(x)
-  if (is.character(y)) y = as.factor(y)
-  if (is.factor(x)) {
-    xlvls = levels(x)
-    xlabs = seq_along(xlvls)
-    names(xlabs) = xlvls
-    x = as.integer(x)
-  } else {
-    xlabs = NULL
-  }
-  if (is.factor(y)) {
-    ylvls = levels(y)
-    ylabs = seq_along(ylvls)
-    names(ylabs) = ylvls
-    y = as.integer(y)
-  } else {
-    ylabs = NULL
-  }
-  x = jitter(x)
-  y = jitter(y)
-
-  datapoints$x = x
-  datapoints$y = y
-
-  out = list(
-    datapoints = datapoints,
-    x = x,
-    y = y,
-    xlabs = xlabs,
-    ylabs = ylabs,
-    type = "p"
+type_jitter = function(factor = 1, amount = NULL) {
+  out <- list(
+    draw = draw_points,
+    data = data_jitter(factor = factor, amount = amount),
+    name = "p"
   )
+  class(out) <- "tinyplot_type"
   return(out)
 }
+
+
+data_jitter = function(factor, amount) {
+    fun = function(datapoints, ...) {
+        x = datapoints$x
+        y = datapoints$y
+        if (is.character(x)) x = as.factor(x)
+        if (is.character(y)) y = as.factor(y)
+        if (is.factor(x)) {
+            xlvls = levels(x)
+            xlabs = seq_along(xlvls)
+            names(xlabs) = xlvls
+            x = as.integer(x)
+        } else {
+            xlabs = NULL
+        }
+        if (is.factor(y)) {
+            ylvls = levels(y)
+            ylabs = seq_along(ylvls)
+            names(ylabs) = ylvls
+            y = as.integer(y)
+        } else {
+            ylabs = NULL
+        }
+        x = jitter(x, factor = factor, amount = amount)
+        y = jitter(y, factor = factor, amount = amount)
+
+        datapoints$x = x
+        datapoints$y = y
+
+        out = list(
+            datapoints = datapoints,
+            x = x,
+            y = y,
+            xlabs = xlabs,
+            ylabs = ylabs
+        )
+        return(out)
+    }
+}
+
diff --git a/R/type_points.R b/R/type_points.R
new file mode 100644
index 00000000..e9ee0fc9
--- /dev/null
+++ b/R/type_points.R
@@ -0,0 +1,29 @@
+type_points = function() {
+  out <- list(
+    draw = draw_points,
+    data = data_points,
+    name = "p"
+  )
+  class(out) <- "tinyplot_type"
+  return(out)
+}
+
+
+data_points = function(datapoints, ...) {
+    return(list())
+}
+
+
+draw_points <- function(ix, iy, icol, ibg, ipch, ilwd, cex, ...) {
+  points(
+    x = ix,
+    y = iy,
+    col = icol,
+    bg = ibg,
+    type = "p",
+    pch = ipch,
+    lwd = ilwd,
+    cex = cex
+  )
+}
+

From 057c6ad045ada0a2b98485f53f24d8069c9d1b2a Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 16:08:12 -0400
Subject: [PATCH 22/72] makefile

---
 Makefile | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)
 create mode 100644 Makefile

diff --git a/Makefile b/Makefile
new file mode 100644
index 00000000..a253676f
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,21 @@
+.PHONY: help testall testone document check install 
+
+help:  ## Display this help screen
+	@echo -e "\033[1mAvailable commands:\033[0m\n"
+	@grep -E '^[a-z.A-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "  \033[36m%-18s\033[0m %s\n", $$1, $$2}' | sort
+
+testall: ## tinytest::build_install_test()
+	Rscript -e "pkgload::load_all();tinytest::run_test_dir()"
+
+testone: install ## make testone testfile="inst/tinytest/test-aaa-warn_once.R"
+	Rscript -e "pkgload::load_all();tinytest::run_test_file('$(testfile)')"
+
+document: ## altdoc::render_docs()
+	Rscript -e "devtools::document()"
+
+check: document ## devtools::check()
+	R CMD check .
+
+install: document ## devtools::install(dependencies = FALSE)
+	R CMD INSTALL .
+

From e568d910cfacca9bd6b6b328c9f4bec88b1e73b5 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 16:18:12 -0400
Subject: [PATCH 23/72] type_points()

---
 R/draw_elements.R |  6 +++---
 R/tinyplot.R      |  1 -
 R/type_jitter.R   |  2 +-
 R/type_points.R   | 34 ++++++++++++++++------------------
 4 files changed, 20 insertions(+), 23 deletions(-)

diff --git a/R/draw_elements.R b/R/draw_elements.R
index 14486c25..3c31dea3 100644
--- a/R/draw_elements.R
+++ b/R/draw_elements.R
@@ -44,7 +44,7 @@ draw_elements = function(
           "segments" = draw_segments,
           "boxplot" = draw_boxplot,
           "p" = ,
-          "points" = draw_points,
+          "points" = draw_points(),
           "l" = ,
           "o" = ,
           "b" = ,
@@ -96,7 +96,7 @@ draw_pointrange <- function(ix, iy, ixmin, iymin, ixmax, iymax, icol, ibg, ipch,
     col = icol,
     lwd = ilwd
   )
-  draw_points(ix = ix, iy = iy, icol = icol, ibg = ibg, ipch = ipch, ilwd = ilwd, cex = cex)
+  draw_points()(ix = ix, iy = iy, icol = icol, ibg = ibg, ipch = ipch, ilwd = ilwd, cex = cex)
 }
 
 
@@ -112,7 +112,7 @@ draw_errorbar <- function(ix, iy, ixmin, iymin, ixmax, iymax, icol, ibg, ipch, i
     angle = 90,
     code = 3
   )
-  draw_points(ix = ix, iy = iy, icol = icol, ibg = ibg, ipch = ipch, ilwd = ilwd, cex = cex)
+  draw_points()(ix = ix, iy = iy, icol = icol, ibg = ibg, ipch = ipch, ilwd = ilwd, cex = cex)
 }
 
 
diff --git a/R/tinyplot.R b/R/tinyplot.R
index 20a2cc2e..ab2cbc4a 100644
--- a/R/tinyplot.R
+++ b/R/tinyplot.R
@@ -668,7 +668,6 @@ tinyplot.default = function(
   datapoints[["by"]] = if (!is.null(by)) by else ""
 
   type_dict = list(
-    "jitter" = type_jitter,
     "histogram" = type_histogram,
     "area" = type_area,
     "boxplot" = type_boxplot,
diff --git a/R/type_jitter.R b/R/type_jitter.R
index d5ec0788..248270c1 100644
--- a/R/type_jitter.R
+++ b/R/type_jitter.R
@@ -1,6 +1,6 @@
 type_jitter = function(factor = 1, amount = NULL) {
   out <- list(
-    draw = draw_points,
+    draw = draw_points(),
     data = data_jitter(factor = factor, amount = amount),
     name = "p"
   )
diff --git a/R/type_points.R b/R/type_points.R
index e9ee0fc9..c9da70fc 100644
--- a/R/type_points.R
+++ b/R/type_points.R
@@ -1,7 +1,7 @@
 type_points = function() {
   out <- list(
-    draw = draw_points,
-    data = data_points,
+    draw = draw_points(),
+    data = NULL,
     name = "p"
   )
   class(out) <- "tinyplot_type"
@@ -9,21 +9,19 @@ type_points = function() {
 }
 
 
-data_points = function(datapoints, ...) {
-    return(list())
-}
-
-
-draw_points <- function(ix, iy, icol, ibg, ipch, ilwd, cex, ...) {
-  points(
-    x = ix,
-    y = iy,
-    col = icol,
-    bg = ibg,
-    type = "p",
-    pch = ipch,
-    lwd = ilwd,
-    cex = cex
-  )
+draw_points = function() {
+    fun = function(ix, iy, icol, ibg, ipch, ilwd, cex, ...) {
+        points(
+            x = ix,
+            y = iy,
+            col = icol,
+            bg = ibg,
+            type = "p",
+            pch = ipch,
+            lwd = ilwd,
+            cex = cex
+        )
+    }
+    return(fun)
 }
 

From aa316966a18c19db59cbe7ce9e0e306e671cb99b Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 16:36:42 -0400
Subject: [PATCH 24/72] type_errobar + type_pointrange factories

---
 R/draw_elements.R   | 28 -------------------
 R/sanitize.R        |  4 +++
 R/tinyplot.R        |  4 +--
 R/type_errorbar.R   | 30 ++++++++++++++++++++
 R/type_pointrange.R | 67 +++++++++++++++++++++++++++++++++------------
 5 files changed, 84 insertions(+), 49 deletions(-)
 create mode 100644 R/type_errorbar.R

diff --git a/R/draw_elements.R b/R/draw_elements.R
index 3c31dea3..a75f24e7 100644
--- a/R/draw_elements.R
+++ b/R/draw_elements.R
@@ -36,8 +36,6 @@ draw_elements = function(
         draw_fun = switch(
           type,
           "ribbon" = draw_ribbon,
-          "pointrange" = draw_pointrange,
-          "errorbar" = draw_errorbar,
           "polygon" = draw_polygon,
           "polypath" = draw_polypath,
           "rect" = draw_rect,
@@ -87,34 +85,8 @@ draw_ribbon <- function(ix, iy, ixmin, ixmax, iymin, iymax, ibg, ilty, ilwd, ico
 }
 
 
-draw_pointrange <- function(ix, iy, ixmin, iymin, ixmax, iymax, icol, ibg, ipch, ilwd, cex, ...) {
-  segments(
-    x0 = ixmin,
-    y0 = iymin,
-    x1 = ixmax,
-    y1 = iymax,
-    col = icol,
-    lwd = ilwd
-  )
-  draw_points()(ix = ix, iy = iy, icol = icol, ibg = ibg, ipch = ipch, ilwd = ilwd, cex = cex)
-}
 
 
-draw_errorbar <- function(ix, iy, ixmin, iymin, ixmax, iymax, icol, ibg, ipch, ilwd, cex, ...) {
-  arrows(
-    x0 = ixmin,
-    y0 = iymin,
-    x1 = ixmax,
-    y1 = iymax,
-    col = icol,
-    lwd = ilwd,
-    length = 0.05,
-    angle = 90,
-    code = 3
-  )
-  draw_points()(ix = ix, iy = iy, icol = icol, ibg = ibg, ipch = ipch, ilwd = ilwd, cex = cex)
-}
-
 
 
 
diff --git a/R/sanitize.R b/R/sanitize.R
index a9ff4327..f796116f 100644
--- a/R/sanitize.R
+++ b/R/sanitize.R
@@ -13,6 +13,10 @@ sanitize_type = function(type, x, y) {
 
     if (identical(type, "points")) {
         return(type_points())
+    } else if (identical(type, "pointrange")) {
+        return(type_pointrange())
+    } else if (identical(type, "errorbar")) {
+        return(type_errorbar())
     } else if (isTRUE(type %in% c("j", "jitter"))) {
         return(type_jitter())
     }
diff --git a/R/tinyplot.R b/R/tinyplot.R
index ab2cbc4a..aae34a85 100644
--- a/R/tinyplot.R
+++ b/R/tinyplot.R
@@ -671,9 +671,7 @@ tinyplot.default = function(
     "histogram" = type_histogram,
     "area" = type_area,
     "boxplot" = type_boxplot,
-    "ribbon" = type_ribbon,
-    "pointrange" = type_pointrange,
-    "errorbar" = type_pointrange
+    "ribbon" = type_ribbon
   )
   if (!is.null(type_data) || isTRUE(type %in% names(type_dict))) {
     fargs = list(
diff --git a/R/type_errorbar.R b/R/type_errorbar.R
new file mode 100644
index 00000000..e5f1a8f6
--- /dev/null
+++ b/R/type_errorbar.R
@@ -0,0 +1,30 @@
+type_errorbar = function() {
+  out <- list(
+    draw = draw_errorbar(),
+    data = data_pointrange(),
+    name = "p"
+  )
+  class(out) <- "tinyplot_type"
+  return(out)
+}
+
+
+draw_errorbar <- function() {
+    fun = function(ix, iy, ixmin, iymin, ixmax, iymax, icol, ibg, ipch, ilwd, cex, ...) {
+        arrows(
+            x0 = ixmin,
+            y0 = iymin,
+            x1 = ixmax,
+            y1 = iymax,
+            col = icol,
+            lwd = ilwd,
+            length = 0.05,
+            angle = 90,
+            code = 3
+        )
+        draw_points()(ix = ix, iy = iy, icol = icol, ibg = ibg, ipch = ipch, ilwd = ilwd, cex = cex)
+    }
+    return(fun)
+}
+
+
diff --git a/R/type_pointrange.R b/R/type_pointrange.R
index 7703f2ea..533d5a51 100644
--- a/R/type_pointrange.R
+++ b/R/type_pointrange.R
@@ -1,19 +1,50 @@
-type_pointrange = function(datapoints, xlabs, ...) {
- if (is.character(datapoints$x)) datapoints$x = as.factor(datapoints$x)
- if (is.factor(datapoints$x)) {
-     ## original data (i.e., no new sorting by factor)
-     xlvls = unique(datapoints$x)
-     datapoints$x = factor(datapoints$x, levels = xlvls)
-     xlabs = seq_along(xlvls)
-     names(xlabs) = xlvls
-     datapoints$x = as.integer(datapoints$x)
- }
- datapoints$xmin = datapoints$x
- datapoints$xmax = datapoints$x
-  out = list(
-    x = datapoints$x,
-    xlabs = xlabs,
-    datapoints = datapoints)
-
+type_pointrange = function() {
+  out <- list(
+    draw = draw_pointrange(),
+    data = data_pointrange(),
+    name = "p"
+  )
+  class(out) <- "tinyplot_type"
   return(out)
-}
\ No newline at end of file
+}
+
+
+
+draw_pointrange <- function() {
+    fun = function(ix, iy, ixmin, iymin, ixmax, iymax, icol, ibg, ipch, ilwd, cex, ...) {
+        segments(
+            x0 = ixmin,
+            y0 = iymin,
+            x1 = ixmax,
+            y1 = iymax,
+            col = icol,
+            lwd = ilwd
+        )
+        draw_points()(ix = ix, iy = iy, icol = icol, ibg = ibg, ipch = ipch, ilwd = ilwd, cex = cex)
+    }
+    return(fun)
+}
+
+
+data_pointrange = function() {
+    fun = function(datapoints, xlabs, ...) {
+        if (is.character(datapoints$x)) datapoints$x = as.factor(datapoints$x)
+        if (is.factor(datapoints$x)) {
+            ## original data (i.e., no new sorting by factor)
+            xlvls = unique(datapoints$x)
+            datapoints$x = factor(datapoints$x, levels = xlvls)
+            xlabs = seq_along(xlvls)
+            names(xlabs) = xlvls
+            datapoints$x = as.integer(datapoints$x)
+        }
+        datapoints$xmin = datapoints$x
+        datapoints$xmax = datapoints$x
+        out = list(
+            x = datapoints$x,
+            xlabs = xlabs,
+            datapoints = datapoints)
+
+        return(out)
+    }
+    return(fun)
+}

From 3e35a369c9182e5271d12948180443319d7ea537 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 17:00:05 -0400
Subject: [PATCH 25/72] type_lines

---
 R/draw_elements.R | 17 +++--------------
 R/type_lines.R    | 25 +++++++++++++++++++++++++
 2 files changed, 28 insertions(+), 14 deletions(-)
 create mode 100644 R/type_lines.R

diff --git a/R/draw_elements.R b/R/draw_elements.R
index a75f24e7..36cd010c 100644
--- a/R/draw_elements.R
+++ b/R/draw_elements.R
@@ -42,14 +42,14 @@ draw_elements = function(
           "segments" = draw_segments,
           "boxplot" = draw_boxplot,
           "p" = ,
-          "points" = draw_points(),
+          "points" = type_points()$draw,
           "l" = ,
           "o" = ,
           "b" = ,
           "c" = ,
           "h" = ,
           "s" = ,
-          "S" = draw_lines)
+          "S" = type_lines(type = type)$draw)
       }
       draw_fun(
         ibg = ibg,
@@ -81,7 +81,7 @@ draw_ribbon <- function(ix, iy, ixmin, ixmax, iymin, iymax, ibg, ilty, ilwd, ico
   } else {
     draw_polygon(ix = c(ixmin, rev(ixmax)), iy = c(iy, rev(iy)), icol = NA, ibg = ibg)
   }
-  draw_lines(ix = ix, iy = iy, icol = icol, ipch = ipch, ilty = ilty, ilwd = ilwd, type = "l")
+  draw_lines()(ix = ix, iy = iy, icol = icol, ipch = ipch, ilty = ilty, ilwd = ilwd, type = "l")
 }
 
 
@@ -90,17 +90,6 @@ draw_ribbon <- function(ix, iy, ixmin, ixmax, iymin, iymax, ibg, ilty, ilwd, ico
 
 
 
-draw_lines <- function(ix, iy, icol, ipch, ilty, ilwd, type, ...) {
-  lines(
-    x = ix,
-    y = iy,
-    col = icol,
-    type = type,
-    pch = ipch,
-    lty = ilty,
-    lwd = ilwd
-  )
-}
 
 
 draw_polygon <- function(ix, iy, icol, ibg, ilty = par("lty"), ilwd = par("lwd"), ...) {
diff --git a/R/type_lines.R b/R/type_lines.R
new file mode 100644
index 00000000..1fa4beee
--- /dev/null
+++ b/R/type_lines.R
@@ -0,0 +1,25 @@
+type_lines = function(type = "l") {
+  out <- list(
+    draw = draw_lines(type = type),
+    data = NULL,
+    name = type
+  )
+  class(out) <- "tinyplot_type"
+  return(out)
+}
+
+
+draw_lines <- function(type = "l") {
+    fun = function(ix, iy, icol, ipch, ilty, ilwd, ...) {
+        lines(
+            x = ix,
+            y = iy,
+            col = icol,
+            type = type,
+            pch = ipch,
+            lty = ilty,
+            lwd = ilwd
+        )
+    }
+    return(fun)
+}

From 977a77c91bb8e736e58cb882bb6f22a69cf06c5f Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 17:07:10 -0400
Subject: [PATCH 26/72] type_polygon

---
 R/draw_elements.R | 35 +++++++++--------------------------
 R/type_polygon.R  | 24 ++++++++++++++++++++++++
 2 files changed, 33 insertions(+), 26 deletions(-)
 create mode 100644 R/type_polygon.R

diff --git a/R/draw_elements.R b/R/draw_elements.R
index 36cd010c..11079d40 100644
--- a/R/draw_elements.R
+++ b/R/draw_elements.R
@@ -36,7 +36,7 @@ draw_elements = function(
         draw_fun = switch(
           type,
           "ribbon" = draw_ribbon,
-          "polygon" = draw_polygon,
+          "polygon" = type_polygon()$draw,
           "polypath" = draw_polypath,
           "rect" = draw_rect,
           "segments" = draw_segments,
@@ -76,31 +76,14 @@ draw_elements = function(
 
 
 draw_ribbon <- function(ix, iy, ixmin, ixmax, iymin, iymax, ibg, ilty, ilwd, icol, ipch, i, flip = FALSE, ...) {
-  if (isFALSE(flip)) {
-    draw_polygon(ix = c(ix, rev(ix)), iy = c(iymin, rev(iymax)), icol = NA, ibg = ibg)
-  } else {
-    draw_polygon(ix = c(ixmin, rev(ixmax)), iy = c(iy, rev(iy)), icol = NA, ibg = ibg)
-  }
-  draw_lines()(ix = ix, iy = iy, icol = icol, ipch = ipch, ilty = ilty, ilwd = ilwd, type = "l")
-}
-
-
-
-
-
-
-
-
-
-draw_polygon <- function(ix, iy, icol, ibg, ilty = par("lty"), ilwd = par("lwd"), ...) {
-  polygon(
-    x = ix,
-    y = iy,
-    border = icol,
-    col = ibg,
-    lty = ilty,
-    lwd = ilwd
-  )
+    polyg = type_polygon()$draw
+    lin = type_lines()$draw
+    if (isFALSE(flip)) {
+        polyg(ix = c(ix, rev(ix)), iy = c(iymin, rev(iymax)), icol = NA, ibg = ibg)
+    } else {
+        polyg(c(ixmin, rev(ixmax)), iy = c(iy, rev(iy)), icol = NA, ibg = ibg)
+    }
+    lin(ix = ix, iy = iy, icol = icol, ipch = ipch, ilty = ilty, ilwd = ilwd, type = "l")
 }
 
 
diff --git a/R/type_polygon.R b/R/type_polygon.R
new file mode 100644
index 00000000..616f0bd0
--- /dev/null
+++ b/R/type_polygon.R
@@ -0,0 +1,24 @@
+type_polygon = function() {
+  out <- list(
+    draw = draw_polygon(),
+    data = NULL,
+    name = "polygon"
+  )
+  class(out) <- "tinyplot_type"
+  return(out)
+}
+
+
+draw_polygon <- function() {
+    fun = function(ix, iy, icol, ibg, ilty = par("lty"), ilwd = par("lwd"), ...) {
+        polygon(
+            x = ix,
+            y = iy,
+            border = icol,
+            col = ibg,
+            lty = ilty,
+            lwd = ilwd
+        )
+    }
+    return(fun)
+}

From ca57e6d2de88c4c6cd4b1aa52f49a223844536ad Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 17:29:01 -0400
Subject: [PATCH 27/72] type_polypath

---
 R/draw_elements.R | 13 -------------
 R/sanitize.R      |  2 ++
 R/type_polypath.R | 26 ++++++++++++++++++++++++++
 3 files changed, 28 insertions(+), 13 deletions(-)
 create mode 100644 R/type_polypath.R

diff --git a/R/draw_elements.R b/R/draw_elements.R
index 11079d40..72fcf427 100644
--- a/R/draw_elements.R
+++ b/R/draw_elements.R
@@ -37,7 +37,6 @@ draw_elements = function(
           type,
           "ribbon" = draw_ribbon,
           "polygon" = type_polygon()$draw,
-          "polypath" = draw_polypath,
           "rect" = draw_rect,
           "segments" = draw_segments,
           "boxplot" = draw_boxplot,
@@ -87,18 +86,6 @@ draw_ribbon <- function(ix, iy, ixmin, ixmax, iymin, iymax, ibg, ilty, ilwd, ico
 }
 
 
-draw_polypath <- function(ix, iy, icol, ibg, ilty, ilwd, dots, ...) {
-  irule <- ifelse(!is.null(dots[["rule"]]), dots[["rule"]], "winding")
-  polypath(
-    x = ix,
-    y = iy,
-    border = icol,
-    col = ibg,
-    lty = ilty,
-    lwd = ilwd,
-    rule = irule
-  )
-}
 
 
 draw_rect <- function(ixmin, iymin, ixmax, iymax, ilty, ilwd, icol, ibg, ...) {
diff --git a/R/sanitize.R b/R/sanitize.R
index f796116f..6860e572 100644
--- a/R/sanitize.R
+++ b/R/sanitize.R
@@ -13,6 +13,8 @@ sanitize_type = function(type, x, y) {
 
     if (identical(type, "points")) {
         return(type_points())
+    } else if (identical(type, "polypath")) {
+        return(type_polypath())
     } else if (identical(type, "pointrange")) {
         return(type_pointrange())
     } else if (identical(type, "errorbar")) {
diff --git a/R/type_polypath.R b/R/type_polypath.R
new file mode 100644
index 00000000..ff0e25de
--- /dev/null
+++ b/R/type_polypath.R
@@ -0,0 +1,26 @@
+type_polypath = function() {
+  out <- list(
+    draw = draw_polypath(),
+    data = NULL,
+    name = "p"
+  )
+  class(out) <- "tinyplot_type"
+  return(out)
+}
+
+
+draw_polypath <- function() {
+    fun =  function(ix, iy, icol, ibg, ilty, ilwd, dots, ...) {
+        irule <- ifelse(!is.null(dots[["rule"]]), dots[["rule"]], "winding")
+        polypath(
+            x = ix,
+            y = iy,
+            border = icol,
+            col = ibg,
+            lty = ilty,
+            lwd = ilwd,
+            rule = irule
+        )
+    }
+    return(fun)
+}

From 66070d17bb74c2ff2b40c4cdd032c4798868540b Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 17:32:44 -0400
Subject: [PATCH 28/72] typo

---
 R/type_polypath.R | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/R/type_polypath.R b/R/type_polypath.R
index ff0e25de..cbbc8aa9 100644
--- a/R/type_polypath.R
+++ b/R/type_polypath.R
@@ -2,7 +2,7 @@ type_polypath = function() {
   out <- list(
     draw = draw_polypath(),
     data = NULL,
-    name = "p"
+    name = "polypath"
   )
   class(out) <- "tinyplot_type"
   return(out)

From 6ddfaedeecf36cd5548d425092e8fbf1ee5a9cfa Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 18:33:54 -0400
Subject: [PATCH 29/72] type_boxplot

---
 R/by_aesthetics.R | 479 ++++++++++++++++++++++------------------------
 R/draw_elements.R |  47 -----
 R/facet.R         |   2 +-
 R/lim.R           |   2 +-
 R/sanitize.R      |  28 +--
 R/tinyplot.R      |   7 +-
 R/type_boxplot.R  | 162 +++++++++++-----
 7 files changed, 364 insertions(+), 363 deletions(-)

diff --git a/R/by_aesthetics.R b/R/by_aesthetics.R
index f5526719..10f75ccb 100755
--- a/R/by_aesthetics.R
+++ b/R/by_aesthetics.R
@@ -1,293 +1,274 @@
 by_col = function(ngrps = 1L, col = NULL, palette = NULL, gradient = NULL, ordered = NULL, alpha = NULL) {
-  
-  if (is.null(ordered)) ordered = FALSE
-  if (is.null(alpha)) alpha = 1
-  if (is.null(gradient)) gradient = FALSE
-  if (isTRUE(gradient)) {
-    ngrps = 100L
-  }
-  
-  # palette = substitute(palette, env = parent.env(environment()))
-  
-  # special "by" convenience keyword (will treat as NULL & handle grouping below)
-  if (!anyNA(col) && !is.null(col) && length(col)==1 && col=="by") col = NULL
-
-  if (is.null(col) && is.null(palette)) {
-    col = seq_len(ngrps)
-  }
-  
-  if (is.atomic(col) && is.vector(col)) {
-    if (length(col) == 1) {
-      col = rep(col, ngrps)
-    } else if (length(col) != ngrps) {
-      if (isFALSE(gradient)) {
-        stop(sprintf("`col` must be of length 1 or %s.", ngrps), call. = FALSE)
-      } else {
-        # interpolate gradient colors
-        col = colorRampPalette(colors = col, alpha = TRUE)(ngrps)
-      }
-    } 
+    if (is.null(ordered)) ordered = FALSE
+    if (is.null(alpha)) alpha = 1
+    if (is.null(gradient)) gradient = FALSE
     if (isTRUE(gradient)) {
-      col = rev(col)
+        ngrps = 100L
     }
-    if (anyNA(col) || is.character(col)) {
-      return(col)
+
+    # palette = substitute(palette, env = parent.env(environment()))
+
+    # special "by" convenience keyword (will treat as NULL & handle grouping below)
+    if (!anyNA(col) && !is.null(col) && length(col) == 1 && col == "by") col = NULL
+
+    if (is.null(col) && is.null(palette)) {
+        col = seq_len(ngrps)
     }
-  }
 
-  if (is.null(palette)) {
+    if (is.atomic(col) && is.vector(col)) {
+        if (length(col) == 1) {
+            col = rep(col, ngrps)
+        } else if (length(col) != ngrps) {
+            if (isFALSE(gradient)) {
+                stop(sprintf("`col` must be of length 1 or %s.", ngrps), call. = FALSE)
+            } else {
+                # interpolate gradient colors
+                col = colorRampPalette(colors = col, alpha = TRUE)(ngrps)
+            }
+        }
+        if (isTRUE(gradient)) {
+            col = rev(col)
+        }
+        if (anyNA(col) || is.character(col)) {
+            return(col)
+        }
+    }
 
-    if (ngrps <= length(palette()) && isFALSE(ordered) && isFALSE(gradient)) {
-      palette_fun = function(alpha) adjustcolor(palette(), alpha) # must be function to avoid arg ambiguity
-      args = list(alpha = alpha)
+    if (is.null(palette)) {
+        if (ngrps <= length(palette()) && isFALSE(ordered) && isFALSE(gradient)) {
+            palette_fun = function(alpha) adjustcolor(palette(), alpha) # must be function to avoid arg ambiguity
+            args = list(alpha = alpha)
+        } else {
+            if (ngrps <= 8 && isFALSE(ordered)) { # ngrps < 100 so we know gradient is FALSE too
+                palette = "R4"
+                palette_fun = palette.colors
+            } else {
+                palette = "Viridis"
+                if (isFALSE(gradient) && isFALSE(ordered)) {
+                    palette_fun = hcl.colors
+                } else {
+                    palette_fun_gradient = function(n, palette, from = 0.1, to = 0.9, alpha = 1) {
+                        colorRampPalette(
+                            hcl.colors(n = 100, palette = palette, alpha = alpha)[(100 * from + 1):(100 * to)],
+                            alpha = TRUE
+                        )(n)
+                    }
+                    palette_fun = palette_fun_gradient
+                }
+            }
+            args = list(n = ngrps, palette = palette, alpha = alpha)
+        }
     } else {
-      if (ngrps <= 8 && isFALSE(ordered)) { # ngrps < 100 so we know gradient is FALSE too
-        palette = "R4"
-        palette_fun = palette.colors
-      } else {
-        palette = "Viridis"
-        if (isFALSE(gradient) && isFALSE(ordered)) {
-          palette_fun = hcl.colors
+        if (is.character(palette)) {
+            fx = function(x) tolower(gsub("[-, _, \\,, (, ), \\ , \\.]", "", x))
+            pal_match = charmatch(fx(palette), fx(palette.pals()))
+            if (!is.na(pal_match)) {
+                if (pal_match < 1L) stop("'palette' is ambiguous")
+                palette_fun = palette.colors
+                if (isTRUE(gradient)) {
+                    palette_fun2 = function(n, palette, alpha) colorRampPalette(palette.colors(palette = palette, alpha = alpha))(n)
+                    palette_fun = palette_fun2
+                }
+            } else {
+                pal_match = charmatch(fx(palette), fx(hcl.pals()))
+                if (!is.na(pal_match)) {
+                    if (pal_match < 1L) stop("'palette' is ambiguous")
+                    palette_fun = hcl.colors
+                } else {
+                    stop(
+                        "\nPalette string not recogized. Must be a value produced by either",
+                        "`palette.pals()` or `hcl.pals()`.\n",
+                        call. = FALSE
+                    )
+                }
+            }
+            args = list(n = ngrps, palette = palette, alpha = alpha)
+        } else if (class(palette) %in% c("call", "name")) {
+            args = as.list(palette)
+            palette_fun = paste(args[[1]])
+            args[[1]] = NULL
+            args[["n"]] = ngrps
+            # remove unnamed arguments to prevent unintentional argument sliding
+            if (any(names(args) == "")) args[[which(names(args) == "")]] = NULL
         } else {
-          palette_fun_gradient = function(n, palette, from = 0.1, to = 0.9, alpha = 1)  {
-            colorRampPalette(
-              hcl.colors(n = 100, palette = palette, alpha = alpha)[(100 * from + 1):(100 * to)],
-              alpha = TRUE
-            )(n)
-          }
-          palette_fun = palette_fun_gradient
+            stop(
+                "\nInvalid palette argument. Must be a recognized keyword, or a",
+                "palette-generating function with named arguments.\n"
+            )
         }
-        
-      } 
-      args = list(n = ngrps, palette = palette, alpha = alpha)
     }
 
-  } else {
+    cols = tryCatch(
+        do.call(palette_fun, args),
+        error = function(e) do.call(eval(palette), args) # catch for bespoke palette generating funcs
+    )
 
-    if (is.character(palette)) {
+    if (length(cols) > ngrps) cols = cols[1:ngrps]
 
-      fx = function(x) tolower(gsub("[-, _, \\,, (, ), \\ , \\.]", "", x))
-      pal_match = charmatch(fx(palette), fx(palette.pals()))
-      if (!is.na(pal_match)) {
-        if (pal_match < 1L) stop("'palette' is ambiguous")
-        palette_fun = palette.colors
-        if (isTRUE(gradient)) {
-          palette_fun2 = function(n, palette, alpha) colorRampPalette(palette.colors(palette = palette, alpha = alpha))(n)
-          palette_fun = palette_fun2
-        }
-      } else {
-        pal_match = charmatch(fx(palette), fx(hcl.pals()))
-        if (!is.na(pal_match)) {
-          if (pal_match < 1L) stop("'palette' is ambiguous")
-          palette_fun = hcl.colors
-        } else {
-          stop(
-            "\nPalette string not recogized. Must be a value produced by either",
-            "`palette.pals()` or `hcl.pals()`.\n",
-            call. = FALSE
-          )
-        }
-      }
-      args = list(n = ngrps, palette = palette, alpha = alpha)
+    # For gradient and ordered colors, we'll run high to low
+    if (isTRUE(gradient) || isTRUE(ordered)) cols = rev(cols)
 
-    } else if (class(palette) %in% c("call", "name")) {
+    return(cols)
+}
 
-      args = as.list(palette)
-      palette_fun = paste(args[[1]])
-      args[[1]] = NULL
-      args[["n"]] = ngrps
-      # remove unnamed arguments to prevent unintentional argument sliding
-      if (any(names(args) == "")) args[[which(names(args) == "")]] = NULL
 
-    } else {
+by_pch = function(ngrps, type, pch = NULL) {
+    no_pch = FALSE
+    if (!type %in% c("p", "b", "o", "pointrange", "errorbar", "boxplot")) {
+        no_pch = TRUE
+        pch = NULL
 
-      stop(
-        "\nInvalid palette argument. Must be a recognized keyword, or a",
-        "palette-generating function with named arguments.\n"
-      )
+        # special "by" convenience keyword
+    } else if (!is.null(pch) && length(pch) == 1 && pch == "by") {
+        no_pch = TRUE # skip checks below
+        pch = 1:ngrps + par("pch") - 1
+        # correctly recycle if over max pch type
+        pch_ceiling = 25 # see ?pch
+        if (max(pch) > pch_ceiling) {
+            pch_below = pch[pch <= pch_ceiling]
+            pch_above = pch[pch > pch_ceiling]
+            pch_above = rep_len(0:pch_ceiling, length(pch_above))
+            pch = c(pch_below, pch_above)
+        }
 
+        # return NULL if not a valid point type
+    } else if (is.null(pch)) {
+        pch = par("pch")
     }
-  }
-
-  cols = tryCatch(
-    do.call(palette_fun, args),
-    error = function(e) do.call(eval(palette), args) # catch for bespoke palette generating funcs
-  )
 
-  if (length(cols) > ngrps) cols = cols[1:ngrps]
-  
-  # For gradient and ordered colors, we'll run high to low
-  if (isTRUE(gradient) || isTRUE(ordered)) cols = rev(cols)
+    if (!no_pch) {
+        if (!is.atomic(pch) || !is.vector(pch) || !is.numeric(pch) || (length(pch) != 1 && length(pch) != ngrps)) {
+            stop(sprintf("`pch` must be `NULL` or a numeric vector of length 1 or %s.", ngrps), call. = FALSE)
+        }
 
-  return(cols)
+        if (length(pch) == 1) {
+            pch = rep(pch, ngrps)
+        }
+    }
 
+    return(pch)
 }
 
 
-by_pch = function(ngrps, type, pch=NULL) {
-  
-  no_pch = FALSE
-  if (!type %in% c("p", "b", "o", "pointrange", "errorbar", "boxplot")) {
-    no_pch = TRUE
-    pch = NULL
-    
-    # special "by" convenience keyword
-  } else if (!is.null(pch) && length(pch)==1 && pch=="by") {
-    no_pch = TRUE # skip checks below
-    pch = 1:ngrps + par("pch") - 1
-    # correctly recycle if over max pch type
-    pch_ceiling = 25 # see ?pch
-    if (max(pch)>pch_ceiling) {
-      pch_below = pch[pch<=pch_ceiling]
-      pch_above = pch[pch>pch_ceiling]
-      pch_above = rep_len(0:pch_ceiling, length(pch_above))
-      pch = c(pch_below, pch_above)
-    }
-    
-    # return NULL if not a valid point type
-  } else if (is.null(pch)) {
-    pch = par("pch")
-  }
+by_lty = function(ngrps, type, lty = NULL) {
+    # We only care about line types, otherwise return NULL
+    if (!type %in% c("l", "b", "o", "c", "h", "s", "S", "ribbon", "boxplot", "rect", "segments")) {
+        out = NULL
 
-  if (!no_pch) {
-    
-    if (!is.atomic(pch) || !is.vector(pch) || !is.numeric(pch) || (length(pch) != 1 && length(pch) != ngrps)) {
-      stop(sprintf("`pch` must be `NULL` or a numeric vector of length 1 or %s.", ngrps), call. = FALSE)
-    }
-    
-    if (length(pch) == 1) {
-      pch = rep(pch, ngrps)
-    }
-  }
-  
-  return(pch)
-}
+        # special "by" convenience keyword
+    } else if (!is.null(lty) && length(lty) == 1 && lty == "by") {
+        lty_dict = c("solid", "dashed", "dotted", "dotdash", "longdash", "twodash")
+        par_lty = par("lty")
 
+        if (!par_lty %in% lty_dict) {
+            warning(
+                "\nBesoke lty specifications (i.e., using string combinations) are not",
+                "currently supported alongside the lty='by' keyword argument.",
+                "Defaulting to 1 and looping from there.\n"
+            )
+            par_lty = 1
+        } else {
+            par_lty = which(par_lty == lty_dict)
+        }
+        out = 1:ngrps + par_lty - 1
+        # correctly recycle if over max pch type
+        lty_ceiling = 6 # see ?pch
+        if (max(out) > lty_ceiling) {
+            lty_below = out[out <= lty_ceiling]
+            lty_above = out[out > lty_ceiling]
+            lty_above = rep_len(1:lty_ceiling, length(lty_above))
+            out = c(lty_below, lty_above)
+        }
 
-by_lty = function(ngrps, type, lty=NULL) {
+        # NULL -> solid (or default) line
+    } else if (is.null(lty)) {
+        if (identical(type, "boxplot")) {
+            out = NULL
+        } else {
+            out = rep(par("lty"), ngrps)
+        }
 
-  # We only care about line types, otherwise return NULL
-  if (!type %in% c("l", "b", "o", "c", "h", "s", "S", "ribbon", "boxplot", "rect", "segments")) {
-    out = NULL
-    
-    # special "by" convenience keyword
-  } else if (!is.null(lty) && length(lty)==1 && lty=="by") {
-    
-    lty_dict = c("solid", "dashed", "dotted", "dotdash", "longdash", "twodash")
-    par_lty = par("lty")
-    
-    if (!par_lty %in% lty_dict) {
-      warning(
-        "\nBesoke lty specifications (i.e., using string combinations) are not",
-        "currently supported alongside the lty='by' keyword argument.",
-        "Defaulting to 1 and looping from there.\n"
-        )
-      par_lty = 1
-    } else {
-      par_lty = which(par_lty==lty_dict)
-    }
-    out = 1:ngrps + par_lty - 1
-    # correctly recycle if over max pch type
-    lty_ceiling = 6 # see ?pch
-    if (max(out)>lty_ceiling) {
-      lty_below = out[out<=lty_ceiling]
-      lty_above = out[out>lty_ceiling]
-      lty_above = rep_len(1:lty_ceiling, length(lty_above))
-      out = c(lty_below, lty_above)
-    }
-    
-    # NULL -> solid (or default) line
-  } else if (is.null(lty)) {
-    if (type == "boxplot") {
-      out = NULL
-    } else {
-      out = rep(par("lty"), ngrps)
-    }
-  
-  # atomic vector: sanity check length
-  } else if (is.atomic(lty) && is.vector(lty)) {
-    if (length(lty) == 1) {
-      out = rep(lty, ngrps)
-    } else {
-      if (length(lty) != ngrps) {
-        stop(sprintf("`lty` must be `NULL` or a numeric vector of length 1 or %s.", ngrps), call. = FALSE)
-      }
-      out = lty
+        # atomic vector: sanity check length
+    } else if (is.atomic(lty) && is.vector(lty)) {
+        if (length(lty) == 1) {
+            out = rep(lty, ngrps)
+        } else {
+            if (length(lty) != ngrps) {
+                stop(sprintf("`lty` must be `NULL` or a numeric vector of length 1 or %s.", ngrps), call. = FALSE)
+            }
+            out = lty
+        }
     }
-  }
 
-  return(out)
+    return(out)
 }
 
 
-by_lwd = function(ngrps, type, lwd=NULL) {
-
-  lwd_base = par("lwd")
-  lwd_floor = lwd_base / min(5, max((ngrps-1), 1))
-  lwd_ceiling = lwd_base * min(5, ngrps)
-  
-  no_lwd = FALSE
-  # special "by" convenience keyword
-  if (!is.null(lwd) && length(lwd)==1 && lwd=="by") {
-    no_lwd = TRUE # skip checks below
-    lwd = seq(lwd_floor, lwd_ceiling, length.out = ngrps)
-  } else if (is.null(lwd)) {
-    no_lwd = TRUE
-    lwd = NULL
-  }
+by_lwd = function(ngrps, type, lwd = NULL) {
+    lwd_base = par("lwd")
+    lwd_floor = lwd_base / min(5, max((ngrps - 1), 1))
+    lwd_ceiling = lwd_base * min(5, ngrps)
 
-  if (!no_lwd) {
-    if (!is.atomic(lwd) || !is.vector(lwd) || !is.numeric(lwd) || (length(lwd) != 1 && length(lwd) != ngrps)) {
-      stop(sprintf("`lwd` must be `NULL` or a numeric vector of length 1 or %s.", ngrps), call. = FALSE)
+    no_lwd = FALSE
+    # special "by" convenience keyword
+    if (!is.null(lwd) && length(lwd) == 1 && lwd == "by") {
+        no_lwd = TRUE # skip checks below
+        lwd = seq(lwd_floor, lwd_ceiling, length.out = ngrps)
+    } else if (is.null(lwd)) {
+        no_lwd = TRUE
+        lwd = NULL
     }
-    if (length(lwd) == 1) {
-      lwd = rep(lwd, ngrps)
+
+    if (!no_lwd) {
+        if (!is.atomic(lwd) || !is.vector(lwd) || !is.numeric(lwd) || (length(lwd) != 1 && length(lwd) != ngrps)) {
+            stop(sprintf("`lwd` must be `NULL` or a numeric vector of length 1 or %s.", ngrps), call. = FALSE)
+        }
+        if (length(lwd) == 1) {
+            lwd = rep(lwd, ngrps)
+        }
     }
-  }
-  
-  return(lwd)
+
+    return(lwd)
 }
 
 
 by_bg = function(
-  adjustcolor,
-  alpha,
-  bg,
-  by,
-  by_continuous,
-  by_ordered,
-  col,
-  fill,
-  ngrps,
-  palette,
-  ribbon.alpha,
-  type) {
-
-  if (is.null(bg) && !is.null(fill)) bg = fill
-  if (!is.null(bg) && length(bg) == 1 && is.numeric(bg) && bg >= 0 && bg <= 1) {
-    alpha = bg
-    bg = "by"
-  }
-  if (!is.null(bg) && length(bg) == 1 && bg == "by") {
-    bg = by_col(
-      ngrps = ngrps,
-      col = NULL,
-      palette = palette,
-      gradient = by_continuous,
-      ordered = by_ordered,
-      alpha = alpha
-    )
-  } else if (length(bg) != ngrps) {
-    bg = rep(bg, ngrps)
-  }
-  if (type == "ribbon" || (type == "boxplot" && !is.null(by))) {
-    if (!is.null(bg)) {
-      bg = adjustcolor(bg, ribbon.alpha)
-    } else if (!is.null(col)) {
-      bg = adjustcolor(col, ribbon.alpha)
+    adjustcolor,
+    alpha,
+    bg,
+    by,
+    by_continuous,
+    by_ordered,
+    col,
+    fill,
+    ngrps,
+    palette,
+    ribbon.alpha,
+    type) {
+    if (is.null(bg) && !is.null(fill)) bg = fill
+    if (!is.null(bg) && length(bg) == 1 && is.numeric(bg) && bg >= 0 && bg <= 1) {
+        alpha = bg
+        bg = "by"
+    }
+    if (!is.null(bg) && length(bg) == 1 && bg == "by") {
+        bg = by_col(
+            ngrps = ngrps,
+            col = NULL,
+            palette = palette,
+            gradient = by_continuous,
+            ordered = by_ordered,
+            alpha = alpha
+        )
+    } else if (length(bg) != ngrps) {
+        bg = rep(bg, ngrps)
+    }
+    if (type == "ribbon" || (type == "boxplot" && !is.null(by))) {
+        if (!is.null(bg)) {
+            bg = adjustcolor(bg, ribbon.alpha)
+        } else if (!is.null(col)) {
+            bg = adjustcolor(col, ribbon.alpha)
+        }
     }
-  }
 
-  return(bg)
+    return(bg)
 }
-
diff --git a/R/draw_elements.R b/R/draw_elements.R
index 72fcf427..0c895fbc 100644
--- a/R/draw_elements.R
+++ b/R/draw_elements.R
@@ -39,7 +39,6 @@ draw_elements = function(
           "polygon" = type_polygon()$draw,
           "rect" = draw_rect,
           "segments" = draw_segments,
-          "boxplot" = draw_boxplot,
           "p" = ,
           "points" = type_points()$draw,
           "l" = ,
@@ -109,50 +108,4 @@ draw_segments <- function(ixmin, iymin, ixmax, iymax, ilty, ilwd, icol, ...) {
 }
 
 
-draw_boxplot <- function(i, ix, iy, ipch, ilty, icol, ibg, dots, x_by = FALSE, facet_by = FALSE, split_data, ...) {
-
-  at_ix <- unique(ix)
-  horizontal <- if (!is.null(dots[["horizontal"]])) dots[["horizontal"]] else FALSE
-  range_ix <- if (!is.null(dots[["range"]])) dots[["range"]] else 1.5
-  boxwidth_ix <- if (!is.null(dots[["boxwidth"]])) dots[["boxwidth"]] else NULL
-  varwidth_ix <- if (!is.null(dots[["varwidth"]])) dots[["varwidth"]] else FALSE
-  notch_ix <- if (!is.null(dots[["notch"]])) dots[["notch"]] else FALSE
-  outline_ix <- if (!is.null(dots[["outline"]])) dots[["outline"]] else TRUE
-  boxwex_ix <- if (!is.null(dots[["boxwex"]])) dots[["boxwex"]] else 0.8
-  if (isTRUE(x_by)) boxwex_ix <- boxwex_ix * 2
-  staplewex_ix <- if (!is.null(dots[["staplewex"]])) dots[["staplewex"]] else 0.5
-  outwex_ix <- if (!is.null(dots[["outwex"]])) dots[["outwex"]] else 0.5
-
-  # Handle multiple groups
-  if (!is.null(split_data) && isFALSE(x_by) && isFALSE(facet_by) && length(split_data) > 1) {
-    boxwex_ix_orig <- boxwex_ix
-    boxwex_ix <- boxwex_ix / length(split_data) - 0.01
-    at_ix <- at_ix + seq(
-      -((boxwex_ix_orig - boxwex_ix) / 2),
-      ((boxwex_ix_orig - boxwex_ix) / 2),
-      length.out = length(split_data)
-    )[i]
-  }
-
-  boxplot(
-    formula = iy ~ ix,
-    pch = ipch,
-    lty = ilty,
-    border = icol,
-    col = ibg,
-    add = TRUE, axes = FALSE,
-    horizontal = horizontal,
-    at = at_ix,
-    range = range_ix,
-    width = boxwidth_ix,
-    varwidth = varwidth_ix,
-    notch = notch_ix,
-    outline = outline_ix,
-    boxwex = boxwex_ix,
-    staplewex = staplewex_ix,
-    outwex = outwex_ix
-  )
-
-}
-
 
diff --git a/R/facet.R b/R/facet.R
index 93283b26..bcf3408f 100644
--- a/R/facet.R
+++ b/R/facet.R
@@ -209,7 +209,7 @@ draw_facet_window = function(grid, ...) {
       ## Idea borrowed from here: https://stackoverflow.com/a/4128401/4115816
       pdots = dots[names(dots) %in% names(formals(plot.default))]
       ## catch for flipped boxplots...
-      if (type == "boxplot" && isTRUE(dots[["horizontal"]])) {
+      if (identical(type, "boxplot") && isTRUE(dots[["horizontal"]])) {
         log_flip = log
         if (!is.null(log)) {
           if (log == "x") log_flip = "y"
diff --git a/R/lim.R b/R/lim.R
index c0f83827..bab00f29 100644
--- a/R/lim.R
+++ b/R/lim.R
@@ -9,7 +9,7 @@ lim_args = function(datapoints, xlim, ylim, type) {
     ylim = range(c(datapoints[["y"]], datapoints[["ymin"]],
                    datapoints[["ymax"]]), finite = TRUE)
 
-  if (type == "boxplot") {
+  if (identical(type, "boxplot")) {
     xlim = xlim + c(-0.5, 0.5)
   }
 
diff --git a/R/sanitize.R b/R/sanitize.R
index 6860e572..737538f3 100644
--- a/R/sanitize.R
+++ b/R/sanitize.R
@@ -11,6 +11,19 @@ sanitize_type = function(type, x, y) {
         return(type)
     }
 
+    if (is.null(type)) {
+        # enforce boxplot type for y ~ factor(x)
+        if (!is.null(x) && is.factor(x) && !is.factor(y)) {
+            return(type_boxplot())
+        } else {
+            type = "p"
+        }
+    } else if (type %in% c("hist", "histogram")) {
+        type = "histogram"
+    } else if (type %in% c("j", "jitter")) {
+        type = return(type_jitter())
+    }
+
     if (identical(type, "points")) {
         return(type_points())
     } else if (identical(type, "polypath")) {
@@ -19,23 +32,12 @@ sanitize_type = function(type, x, y) {
         return(type_pointrange())
     } else if (identical(type, "errorbar")) {
         return(type_errorbar())
+    } else if (identical(type, "boxplot")) {
+        return(type_boxplot())
     } else if (isTRUE(type %in% c("j", "jitter"))) {
         return(type_jitter())
     }
 
-    if (is.null(type)) {
-        # enforce boxplot type for y ~ factor(x)
-        if (!is.null(x) && is.factor(x) && !is.factor(y)) {
-            type = "boxplot"
-        } else {
-            type = "p"
-        }
-    } else if (type %in% c("hist", "histogram")) {
-        type = "histogram"
-    } else if (type %in% c("j", "jitter")) {
-        type = "jitter"
-    }
-
     out = list(draw = NULL, data = NULL, name = type)
     return(out)
 }
diff --git a/R/tinyplot.R b/R/tinyplot.R
index aae34a85..c98616f4 100644
--- a/R/tinyplot.R
+++ b/R/tinyplot.R
@@ -654,7 +654,7 @@ tinyplot.default = function(
   if (is.null(bg) && !is.null(fill)) bg = fill
 
   # type-specific settings and arguments
-  if (type == "density") {
+  if (isTRUE(type == "density")) {
     fargs = mget(ls(environment(), sorted = FALSE))
     fargs = density_args(fargs = fargs, dots = dots, by_dep = by_dep)
     return(do.call(tinyplot.density, args = fargs))
@@ -670,7 +670,6 @@ tinyplot.default = function(
   type_dict = list(
     "histogram" = type_histogram,
     "area" = type_area,
-    "boxplot" = type_boxplot,
     "ribbon" = type_ribbon
   )
   if (!is.null(type_data) || isTRUE(type %in% names(type_dict))) {
@@ -836,7 +835,7 @@ tinyplot.default = function(
 
     has_sub = !is.null(sub)
 
-    if (isTRUE(was_area_type) || type == "rect") {
+    if (isTRUE(was_area_type) || isTRUE(type == "rect")) {
       legend_args[["pt.lwd"]] = par("lwd")
       legend_args[["lty"]] = 0
     }
@@ -1051,7 +1050,7 @@ tinyplot.default = function(
 
       # empty plot flag
       empty_plot = FALSE
-      if (isTRUE(empty) || type == "n" || ((length(xx) == 0) && !(type %in% c("rect", "segments")))) {
+      if (isTRUE(empty) || isTRUE(type == "n") || ((length(xx) == 0) && !(type %in% c("rect", "segments")))) {
         empty_plot = TRUE
       }
 
diff --git a/R/type_boxplot.R b/R/type_boxplot.R
index 0cda435e..ec0b0f70 100644
--- a/R/type_boxplot.R
+++ b/R/type_boxplot.R
@@ -1,50 +1,116 @@
-type_boxplot = function(datapoints, bg, col, palette, ...) {
-  # Convert x to factor if it's not already
-  datapoints$x = as.factor(datapoints$x)
-
-  # Handle factor levels and maintain order
-  xlvls = levels(datapoints$x)
-  xlabs = seq_along(xlvls)
-  names(xlabs) = xlvls
-  datapoints$x = as.integer(datapoints$x)
-  
-  # Handle ordering based on by and facet variables
-  null_by = length(unique(datapoints$by)) == 1
-  null_facet = length(unique(datapoints$facet)) == 1
-
-  if (null_by && null_facet) {
-    xord = order(datapoints$x)
-  } else if (null_facet) {
-    xord = order(datapoints$by, datapoints$x)
-  } else if (null_by) {
-    xord = order(datapoints$facet, datapoints$x)
-  } else {
-    xord = order(datapoints$by, datapoints$facet, datapoints$x)
-  }
-
-  if (length(unique(datapoints[["by"]])) == 1 && is.null(palette)) {
-    if (is.null(col)) col = par("fg")
-    if (is.null(bg)) bg = "lightgray"
-  } else {
-    bg = "by"
-  }
-
-  # Reorder x, y, ymin, and ymax based on the order determined
-  datapoints = datapoints[xord,]
-  
-  # Return the result as a list called 'out'
-  out = list(
-    x = datapoints$x,
-    y = datapoints$y,
-    ymin = datapoints$ymin,
-    ymax = datapoints$ymax,
-    xlabs = xlabs,
-    datapoints = datapoints,
-    col = col,
-    bg = bg)
-
-  if (length(unique(datapoints$by)) > 1) out[["by"]] = datapoints$by
-  if (length(unique(datapoints$facet)) > 1) out[["facet"]] = datapoints$facet
-
+type_boxplot = function() {
+  out <- list(
+    draw = draw_boxplot(),
+    data = data_boxplot(),
+    name = "boxplot"
+  )
+  class(out) <- "tinyplot_type"
   return(out)
 }
+
+
+data_boxplot = function() {
+    fun = function(datapoints, bg, col, palette, ...) {
+        # Convert x to factor if it's not already
+        datapoints$x = as.factor(datapoints$x)
+
+        # Handle factor levels and maintain order
+        xlvls = levels(datapoints$x)
+        xlabs = seq_along(xlvls)
+        names(xlabs) = xlvls
+        datapoints$x = as.integer(datapoints$x)
+
+        # Handle ordering based on by and facet variables
+        null_by = length(unique(datapoints$by)) == 1
+        null_facet = length(unique(datapoints$facet)) == 1
+
+        if (null_by && null_facet) {
+            xord = order(datapoints$x)
+        } else if (null_facet) {
+            xord = order(datapoints$by, datapoints$x)
+        } else if (null_by) {
+            xord = order(datapoints$facet, datapoints$x)
+        } else {
+            xord = order(datapoints$by, datapoints$facet, datapoints$x)
+        }
+
+        if (length(unique(datapoints[["by"]])) == 1 && is.null(palette)) {
+            if (is.null(col)) col = par("fg")
+            if (is.null(bg)) bg = "lightgray"
+        } else {
+            bg = "by"
+        }
+
+        # Reorder x, y, ymin, and ymax based on the order determined
+        datapoints = datapoints[xord,]
+
+        # Return the result as a list called 'out'
+        out = list(
+            x = datapoints$x,
+            y = datapoints$y,
+            ymin = datapoints$ymin,
+            ymax = datapoints$ymax,
+            xlabs = xlabs,
+            datapoints = datapoints,
+            col = col,
+            bg = bg)
+
+        if (length(unique(datapoints$by)) > 1) out[["by"]] = datapoints$by
+        if (length(unique(datapoints$facet)) > 1) out[["facet"]] = datapoints$facet
+
+        return(out)
+    }
+    return(fun)
+}
+
+
+
+draw_boxplot = function() {
+    fun = function(i, ix, iy, ipch, ilty, icol, ibg, dots, x_by = FALSE, facet_by = FALSE, split_data, ...) {
+
+        at_ix <- unique(ix)
+        horizontal <- if (!is.null(dots[["horizontal"]])) dots[["horizontal"]] else FALSE
+        range_ix <- if (!is.null(dots[["range"]])) dots[["range"]] else 1.5
+        boxwidth_ix <- if (!is.null(dots[["boxwidth"]])) dots[["boxwidth"]] else NULL
+        varwidth_ix <- if (!is.null(dots[["varwidth"]])) dots[["varwidth"]] else FALSE
+        notch_ix <- if (!is.null(dots[["notch"]])) dots[["notch"]] else FALSE
+        outline_ix <- if (!is.null(dots[["outline"]])) dots[["outline"]] else TRUE
+        boxwex_ix <- if (!is.null(dots[["boxwex"]])) dots[["boxwex"]] else 0.8
+        if (isTRUE(x_by)) boxwex_ix <- boxwex_ix * 2
+        staplewex_ix <- if (!is.null(dots[["staplewex"]])) dots[["staplewex"]] else 0.5
+        outwex_ix <- if (!is.null(dots[["outwex"]])) dots[["outwex"]] else 0.5
+
+        # Handle multiple groups
+        if (!is.null(split_data) && isFALSE(x_by) && isFALSE(facet_by) && length(split_data) > 1) {
+            boxwex_ix_orig <- boxwex_ix
+            boxwex_ix <- boxwex_ix / length(split_data) - 0.01
+            at_ix <- at_ix + seq(
+                -((boxwex_ix_orig - boxwex_ix) / 2),
+                ((boxwex_ix_orig - boxwex_ix) / 2),
+                length.out = length(split_data)
+            )[i]
+        }
+
+        boxplot(
+            formula = iy ~ ix,
+            pch = ipch,
+            lty = ilty,
+            border = icol,
+            col = ibg,
+            add = TRUE, axes = FALSE,
+            horizontal = horizontal,
+            at = at_ix,
+            range = range_ix,
+            width = boxwidth_ix,
+            varwidth = varwidth_ix,
+            notch = notch_ix,
+            outline = outline_ix,
+            boxwex = boxwex_ix,
+            staplewex = staplewex_ix,
+            outwex = outwex_ix
+        )
+    }
+    return(fun)
+}
+
+

From 743b0db4478e693d35c859f4049d4e0d3551ef6f Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 18:38:49 -0400
Subject: [PATCH 30/72] type_segments

---
 R/draw_elements.R |  9 ---------
 R/sanitize.R      |  2 ++
 R/type_segments.R | 22 ++++++++++++++++++++++
 3 files changed, 24 insertions(+), 9 deletions(-)
 create mode 100644 R/type_segments.R

diff --git a/R/draw_elements.R b/R/draw_elements.R
index 0c895fbc..c134ee36 100644
--- a/R/draw_elements.R
+++ b/R/draw_elements.R
@@ -38,7 +38,6 @@ draw_elements = function(
           "ribbon" = draw_ribbon,
           "polygon" = type_polygon()$draw,
           "rect" = draw_rect,
-          "segments" = draw_segments,
           "p" = ,
           "points" = type_points()$draw,
           "l" = ,
@@ -98,14 +97,6 @@ draw_rect <- function(ixmin, iymin, ixmax, iymax, ilty, ilwd, icol, ibg, ...) {
 }
 
 
-draw_segments <- function(ixmin, iymin, ixmax, iymax, ilty, ilwd, icol, ...) {
-  segments(
-    x0 = ixmin, y0 = iymin, x1 = ixmax, y1 = iymax,
-    lty = ilty,
-    lwd = ilwd,
-    col = icol
-  )
-}
 
 
 
diff --git a/R/sanitize.R b/R/sanitize.R
index 737538f3..0f1b8e3a 100644
--- a/R/sanitize.R
+++ b/R/sanitize.R
@@ -26,6 +26,8 @@ sanitize_type = function(type, x, y) {
 
     if (identical(type, "points")) {
         return(type_points())
+    } else if (identical(type, "segments")) {
+        return(type_segments())
     } else if (identical(type, "polypath")) {
         return(type_polypath())
     } else if (identical(type, "pointrange")) {
diff --git a/R/type_segments.R b/R/type_segments.R
new file mode 100644
index 00000000..6db3261b
--- /dev/null
+++ b/R/type_segments.R
@@ -0,0 +1,22 @@
+type_segments = function() {
+  out <- list(
+    draw = draw_segments(),
+    data = NULL,
+    name = "segments"
+  )
+  class(out) <- "tinyplot_type"
+  return(out)
+}
+
+
+draw_segments <- function() {
+    fun <- function(ixmin, iymin, ixmax, iymax, ilty, ilwd, icol, ...) {
+        segments(
+            x0 = ixmin, y0 = iymin, x1 = ixmax, y1 = iymax,
+            lty = ilty,
+            lwd = ilwd,
+            col = icol
+        )
+    }
+    return(fun)
+}

From b9aa2eb0f36b0f0348f2b6ef3db793c8ffc43f70 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 18:43:18 -0400
Subject: [PATCH 31/72] type_rect

---
 R/draw_elements.R | 11 +----------
 R/sanitize.R      |  2 ++
 R/type_rect.R     | 23 +++++++++++++++++++++++
 3 files changed, 26 insertions(+), 10 deletions(-)
 create mode 100644 R/type_rect.R

diff --git a/R/draw_elements.R b/R/draw_elements.R
index c134ee36..fb025872 100644
--- a/R/draw_elements.R
+++ b/R/draw_elements.R
@@ -37,7 +37,7 @@ draw_elements = function(
           type,
           "ribbon" = draw_ribbon,
           "polygon" = type_polygon()$draw,
-          "rect" = draw_rect,
+          "rect" = type_rect()$draw,
           "p" = ,
           "points" = type_points()$draw,
           "l" = ,
@@ -86,15 +86,6 @@ draw_ribbon <- function(ix, iy, ixmin, ixmax, iymin, iymax, ibg, ilty, ilwd, ico
 
 
 
-draw_rect <- function(ixmin, iymin, ixmax, iymax, ilty, ilwd, icol, ibg, ...) {
-  rect(
-    xleft = ixmin, ybottom = iymin, xright = ixmax, ytop = iymax,
-    lty = ilty,
-    lwd = ilwd,
-    border = icol,
-    col = ibg
-  )
-}
 
 
 
diff --git a/R/sanitize.R b/R/sanitize.R
index 0f1b8e3a..9a1f9c97 100644
--- a/R/sanitize.R
+++ b/R/sanitize.R
@@ -28,6 +28,8 @@ sanitize_type = function(type, x, y) {
         return(type_points())
     } else if (identical(type, "segments")) {
         return(type_segments())
+    } else if (identical(type, "rect")) {
+        return(type_rect())
     } else if (identical(type, "polypath")) {
         return(type_polypath())
     } else if (identical(type, "pointrange")) {
diff --git a/R/type_rect.R b/R/type_rect.R
new file mode 100644
index 00000000..5d2b848b
--- /dev/null
+++ b/R/type_rect.R
@@ -0,0 +1,23 @@
+type_rect = function() {
+  out <- list(
+    draw = draw_rect(),
+    data = NULL,
+    name = "rect"
+  )
+  class(out) <- "tinyplot_type"
+  return(out)
+}
+
+
+draw_rect <- function() {
+    fun <- function(ixmin, iymin, ixmax, iymax, ilty, ilwd, icol, ibg, ...) {
+        rect(
+            xleft = ixmin, ybottom = iymin, xright = ixmax, ytop = iymax,
+            lty = ilty,
+            lwd = ilwd,
+            border = icol,
+            col = ibg
+        )
+    }
+    return(fun)
+}

From 5993001dca6426f5d144f91506f04b3bbefe3154 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 18:47:02 -0400
Subject: [PATCH 32/72] type_ribbon

---
 R/draw_elements.R |  21 +--------
 R/sanitize.R      |   2 +
 R/type_ribbon.R   | 115 +++++++++++++++++++++++++++++-----------------
 3 files changed, 75 insertions(+), 63 deletions(-)

diff --git a/R/draw_elements.R b/R/draw_elements.R
index fb025872..274b8195 100644
--- a/R/draw_elements.R
+++ b/R/draw_elements.R
@@ -35,7 +35,7 @@ draw_elements = function(
       if (is.null(draw_fun)) {
         draw_fun = switch(
           type,
-          "ribbon" = draw_ribbon,
+          "ribbon" = type_ribbon()$draw,
           "polygon" = type_polygon()$draw,
           "rect" = type_rect()$draw,
           "p" = ,
@@ -72,22 +72,3 @@ draw_elements = function(
 }
 
 
-draw_ribbon <- function(ix, iy, ixmin, ixmax, iymin, iymax, ibg, ilty, ilwd, icol, ipch, i, flip = FALSE, ...) {
-    polyg = type_polygon()$draw
-    lin = type_lines()$draw
-    if (isFALSE(flip)) {
-        polyg(ix = c(ix, rev(ix)), iy = c(iymin, rev(iymax)), icol = NA, ibg = ibg)
-    } else {
-        polyg(c(ixmin, rev(ixmax)), iy = c(iy, rev(iy)), icol = NA, ibg = ibg)
-    }
-    lin(ix = ix, iy = iy, icol = icol, ipch = ipch, ilty = ilty, ilwd = ilwd, type = "l")
-}
-
-
-
-
-
-
-
-
-
diff --git a/R/sanitize.R b/R/sanitize.R
index 9a1f9c97..5a734ddd 100644
--- a/R/sanitize.R
+++ b/R/sanitize.R
@@ -38,6 +38,8 @@ sanitize_type = function(type, x, y) {
         return(type_errorbar())
     } else if (identical(type, "boxplot")) {
         return(type_boxplot())
+    } else if (identical(type, "ribbon")) {
+        return(type_ribbon())
     } else if (isTRUE(type %in% c("j", "jitter"))) {
         return(type_jitter())
     }
diff --git a/R/type_ribbon.R b/R/type_ribbon.R
index c1258b6d..6211f946 100644
--- a/R/type_ribbon.R
+++ b/R/type_ribbon.R
@@ -1,45 +1,74 @@
-type_ribbon = function(datapoints, xlabs, ...) {
-  # Convert x to factor if it's not already
-  if (is.character(datapoints$x)) {
-    datapoints$x = as.factor(datapoints$x)
-  }
-
-  if (is.factor(datapoints$x)) {
-    xlvls = levels(datapoints$x)
-    xlabs = seq_along(xlvls)
-    names(xlabs) = xlvls
-    datapoints$x = as.integer(datapoints$x)
-  } else {
-    xlabs = NULL
-  }
-
-  # Handle ordering based on by and facet variables
-  null_by = length(unique(datapoints$by)) == 1
-  null_facet = length(unique(datapoints$facet)) == 1
-
-  if (null_by && null_facet) {
-    xord = order(datapoints$x)
-  } else if (null_facet) {
-    xord = order(datapoints$by, datapoints$x)
-  } else if (null_by) {
-    xord = order(datapoints$facet, datapoints$x)
-  } else {
-    xord = order(datapoints$by, datapoints$facet, datapoints$x)
-  }
-  
-  # Reorder x, y, ymin, and ymax based on the order determined
-  datapoints = datapoints[xord,]
-  
-  out = list(
-    x = datapoints$x,
-    y = datapoints$y,
-    ymin = datapoints$ymin,
-    ymax = datapoints$ymax,
-    xlabs = xlabs,
-    datapoints = datapoints)
-
-  if (length(unique(datapoints$by)) > 1) out[["by"]] = datapoints$by
-  if (length(unique(datapoints$facet)) > 1) out[["facet"]] = datapoints$facet
-
+type_ribbon = function() {
+  out <- list(
+    draw = draw_ribbon(),
+    data = data_ribbon(),
+    name = "ribbon"
+  )
+  class(out) <- "tinyplot_type"
   return(out)
 }
+
+
+draw_ribbon <- function() {
+    fun = function(ix, iy, ixmin, ixmax, iymin, iymax, ibg, ilty, ilwd, icol, ipch, i, flip = FALSE, ...) {
+        polyg = type_polygon()$draw
+        lin = type_lines()$draw
+        if (isFALSE(flip)) {
+            polyg(ix = c(ix, rev(ix)), iy = c(iymin, rev(iymax)), icol = NA, ibg = ibg)
+        } else {
+            polyg(c(ixmin, rev(ixmax)), iy = c(iy, rev(iy)), icol = NA, ibg = ibg)
+        }
+        lin(ix = ix, iy = iy, icol = icol, ipch = ipch, ilty = ilty, ilwd = ilwd, type = "l")
+    }
+    return(fun)
+}
+
+
+data_ribbon = function() {
+    fun = function(datapoints, xlabs, ...) {
+        # Convert x to factor if it's not already
+        if (is.character(datapoints$x)) {
+            datapoints$x = as.factor(datapoints$x)
+        }
+
+        if (is.factor(datapoints$x)) {
+            xlvls = levels(datapoints$x)
+            xlabs = seq_along(xlvls)
+            names(xlabs) = xlvls
+            datapoints$x = as.integer(datapoints$x)
+        } else {
+            xlabs = NULL
+        }
+
+        # Handle ordering based on by and facet variables
+        null_by = length(unique(datapoints$by)) == 1
+        null_facet = length(unique(datapoints$facet)) == 1
+
+        if (null_by && null_facet) {
+            xord = order(datapoints$x)
+        } else if (null_facet) {
+            xord = order(datapoints$by, datapoints$x)
+        } else if (null_by) {
+            xord = order(datapoints$facet, datapoints$x)
+        } else {
+            xord = order(datapoints$by, datapoints$facet, datapoints$x)
+        }
+
+        # Reorder x, y, ymin, and ymax based on the order determined
+        datapoints = datapoints[xord,]
+
+        out = list(
+            x = datapoints$x,
+            y = datapoints$y,
+            ymin = datapoints$ymin,
+            ymax = datapoints$ymax,
+            xlabs = xlabs,
+            datapoints = datapoints)
+
+        if (length(unique(datapoints$by)) > 1) out[["by"]] = datapoints$by
+        if (length(unique(datapoints$facet)) > 1) out[["facet"]] = datapoints$facet
+
+        return(out)
+    }
+    return(fun)
+}

From c2efa3bf6b3c60ffeae2fab1a81c6c97890cda24 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 18:59:28 -0400
Subject: [PATCH 33/72] type_area

---
 R/draw_elements.R |  2 +-
 R/sanitize.R      |  2 ++
 R/tinyplot.R      |  4 +---
 R/type_area.R     | 32 +++++++++++++++++++++++---------
 4 files changed, 27 insertions(+), 13 deletions(-)

diff --git a/R/draw_elements.R b/R/draw_elements.R
index 274b8195..eb68d8bb 100644
--- a/R/draw_elements.R
+++ b/R/draw_elements.R
@@ -26,7 +26,7 @@ draw_elements = function(
     draw_fun = NULL
     ) {
 
-      types = c("boxplot", "ribbon", "pointrange", "errorbar", "polygon", "polypath", "rect", "segments", "p", "points", "l", "o", "b", "c", "h", "s", "S", "n")
+      types = c("area", "boxplot", "ribbon", "pointrange", "errorbar", "polygon", "polypath", "rect", "segments", "p", "points", "l", "o", "b", "c", "h", "s", "S", "n")
       assert_choice(type, types, null.ok = TRUE)
 
       ## polygons before lines, segments/arrows before points, etc.
diff --git a/R/sanitize.R b/R/sanitize.R
index 5a734ddd..66679b3f 100644
--- a/R/sanitize.R
+++ b/R/sanitize.R
@@ -28,6 +28,8 @@ sanitize_type = function(type, x, y) {
         return(type_points())
     } else if (identical(type, "segments")) {
         return(type_segments())
+    } else if (identical(type, "area")) {
+        return(type_area())
     } else if (identical(type, "rect")) {
         return(type_rect())
     } else if (identical(type, "polypath")) {
diff --git a/R/tinyplot.R b/R/tinyplot.R
index f8fbfb43..ce3fce99 100644
--- a/R/tinyplot.R
+++ b/R/tinyplot.R
@@ -668,9 +668,7 @@ tinyplot.default = function(
   datapoints[["by"]] = if (!is.null(by)) by else ""
 
   type_dict = list(
-    "histogram" = type_histogram,
-    "area" = type_area,
-    "ribbon" = type_ribbon
+    "histogram" = type_histogram
   )
   if (!is.null(type_data) || isTRUE(type %in% names(type_dict))) {
     fargs = list(
diff --git a/R/type_area.R b/R/type_area.R
index 5e3af315..d15140f4 100644
--- a/R/type_area.R
+++ b/R/type_area.R
@@ -1,11 +1,25 @@
-type_area = function(datapoints, ...) {
-  datapoints$ymax = datapoints$y
-  datapoints$ymin = rep.int(0, nrow(datapoints))
-  out = list(
-    datapoints = datapoints,
-    ymax = datapoints$ymax,
-    ymin = datapoints$ymin,
-    type = "ribbon"
+type_area = function() {
+  out <- list(
+    draw = NULL,
+    data = data_area(),
+    name = "area"
   )
+  class(out) <- "tinyplot_type"
   return(out)
-}
\ No newline at end of file
+}
+
+
+data_area = function() {
+    fun = function(datapoints, ...) {
+        datapoints$ymax = datapoints$y
+        datapoints$ymin = rep.int(0, nrow(datapoints))
+        out = list(
+            datapoints = datapoints,
+            ymax = datapoints$ymax,
+            ymin = datapoints$ymin,
+            type = "ribbon"
+        )
+        return(out)
+    }
+    return(fun)
+}

From 6bd1f67bbff6e603f2976aa699a626777fc42816 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 19:19:36 -0400
Subject: [PATCH 34/72] type_histgoram

---
 R/draw_elements.R  |   2 +-
 R/draw_legend.R    |   2 +-
 R/sanitize.R       |   2 +
 R/tinyplot.R       |  23 +++++-----
 R/type_histogram.R | 104 +++++++++++++++++++++++++--------------------
 5 files changed, 72 insertions(+), 61 deletions(-)

diff --git a/R/draw_elements.R b/R/draw_elements.R
index eb68d8bb..47457162 100644
--- a/R/draw_elements.R
+++ b/R/draw_elements.R
@@ -26,7 +26,7 @@ draw_elements = function(
     draw_fun = NULL
     ) {
 
-      types = c("area", "boxplot", "ribbon", "pointrange", "errorbar", "polygon", "polypath", "rect", "segments", "p", "points", "l", "o", "b", "c", "h", "s", "S", "n")
+      types = c("area", "boxplot", "ribbon", "pointrange", "histogram", "errorbar", "polygon", "polypath", "rect", "segments", "p", "points", "l", "o", "b", "c", "h", "s", "S", "n")
       assert_choice(type, types, null.ok = TRUE)
 
       ## polygons before lines, segments/arrows before points, etc.
diff --git a/R/draw_legend.R b/R/draw_legend.R
index b1b914c9..5570e6aa 100644
--- a/R/draw_legend.R
+++ b/R/draw_legend.R
@@ -166,7 +166,7 @@ draw_legend = function(
   ) {
     legend_args[["pt.cex"]] = cex
   }
-  if (type %in% c("rect", "ribbon", "polygon", "polypath", "boxplot") || isTRUE(gradient)) {
+  if (type %in% c("rect", "ribbon", "polygon", "polypath", "boxplot", "hist", "histogram") || isTRUE(gradient)) {
     legend_args[["pch"]] = 22
     if (is.null(legend_args[["pt.cex"]])) legend_args[["pt.cex"]] = 3.5
     if (is.null(legend_args[["pt.lwd"]]) && (!is.null(type) && !(type %in% c("rect", "polygon", "polypath", "boxplot")))) {
diff --git a/R/sanitize.R b/R/sanitize.R
index 66679b3f..0e6a100f 100644
--- a/R/sanitize.R
+++ b/R/sanitize.R
@@ -42,6 +42,8 @@ sanitize_type = function(type, x, y) {
         return(type_boxplot())
     } else if (identical(type, "ribbon")) {
         return(type_ribbon())
+    } else if (identical(type, "histogram")) {
+        return(type_histogram())
     } else if (isTRUE(type %in% c("j", "jitter"))) {
         return(type_jitter())
     }
diff --git a/R/tinyplot.R b/R/tinyplot.R
index ce3fce99..9b8c7e01 100644
--- a/R/tinyplot.R
+++ b/R/tinyplot.R
@@ -587,7 +587,7 @@ tinyplot.default = function(
   # Capture deparsed expressions early, before x, y and by are evaluated
   x_dep = if (!is.null(x)) {
     deparse1(substitute(x))
-  } else if (type %in% c("rect", "segments")) {
+  } else if (type %in% c("rect", "segments", "hist", "histogram")) {
     x = NULL
     NULL
   }
@@ -623,7 +623,7 @@ tinyplot.default = function(
 
   if (is.null(x)) {
     ## Special catch for rect and segment plots without a specified y-var
-    if (type %in% c("rect", "segments")) {
+    if (type %in% c("rect", "segments", "histogram", "hist")) {
       xmin_dep = deparse(substitute(xmin))
       xmax_dep = deparse(substitute(xmax))
       x_dep = paste0("[", xmin_dep, ", ", xmax_dep, "]")
@@ -667,10 +667,7 @@ tinyplot.default = function(
   datapoints[["facet"]] = if (!is.null(facet)) facet else ""
   datapoints[["by"]] = if (!is.null(by)) by else ""
 
-  type_dict = list(
-    "histogram" = type_histogram
-  )
-  if (!is.null(type_data) || isTRUE(type %in% names(type_dict))) {
+  if (!is.null(type_data)) {
     fargs = list(
       by = by,
       facet = facet,
@@ -681,10 +678,10 @@ tinyplot.default = function(
       ribbon.alpha = ribbon.alpha,
       xlabs = xlabs,
       datapoints = datapoints)
-    fun = if (is.null(type_data)) type_dict[[type]] else type_data
     fargs = c(fargs, dots)
-    list2env(do.call(fun, fargs), environment())
+    list2env(do.call(type_data, fargs), environment())
   }
+
   
   # swap x and y values if flip is TRUE
   assert_flag(flip)
@@ -723,9 +720,9 @@ tinyplot.default = function(
       dots[["horizontal"]] = TRUE
     }
   }
-  
-  
-  
+
+
+
   # plot limits
   fargs = lim_args(datapoints = datapoints, xlim = xlim, ylim = ylim, type = type)
   list2env(fargs, environment())
@@ -834,7 +831,7 @@ tinyplot.default = function(
 
     has_sub = !is.null(sub)
 
-    if (isTRUE(was_area_type) || isTRUE(type == "rect")) {
+    if (isTRUE(was_area_type) || isTRUE(type %in% c("rect", "histogram", "hist"))) {
       legend_args[["pt.lwd"]] = par("lwd")
       legend_args[["lty"]] = 0
     }
@@ -1049,7 +1046,7 @@ tinyplot.default = function(
 
       # empty plot flag
       empty_plot = FALSE
-      if (isTRUE(empty) || isTRUE(type == "n") || ((length(xx) == 0) && !(type %in% c("rect", "segments")))) {
+      if (isTRUE(empty) || isTRUE(type == "n") || ((length(xx) == 0) && !(type %in% c("histogram", "hist", "rect", "segments")))) {
         empty_plot = TRUE
       }
 
diff --git a/R/type_histogram.R b/R/type_histogram.R
index 43bdf1cc..de485401 100644
--- a/R/type_histogram.R
+++ b/R/type_histogram.R
@@ -1,49 +1,61 @@
-type_histogram = function(by, facet, ylab, col, bg, ribbon.alpha, datapoints, breaks = NULL, ...) {
-  hbreaks = ifelse(!is.null(breaks), breaks, "Sturges")
-  hist_list = hist(datapoints[["x"]], breaks = hbreaks, plot = FALSE)
-  
-  if (is.null(ylab)) ylab = "Frequency"
-  if (is.null(by) && is.null(palette)) {
-    if (is.null(col)) col = par("fg")
-    if (is.null(bg)) bg = "lightgray"
-  } else {
-    if (is.null(bg)) bg = ribbon.alpha
-  }
-  
-  type = "rect"
-
-  datapoints_breaks = hist(datapoints$x, breaks = hbreaks, plot = FALSE)
-  datapoints = split(datapoints, list(datapoints$by, datapoints$facet))
-  datapoints = Filter(function(k) nrow(k) > 0, datapoints)
-
-  datapoints = lapply(datapoints, function(k) {
-    h = hist(k$x, breaks = datapoints_breaks$breaks, plot = FALSE)
-    out = data.frame(
-      by = k$by[1], # already split
-      facet = k$facet[1], # already split
-      ymin = 0,
-      ymax = h$counts,
-      xmin = h$breaks[-1],
-      xmax = h$mids + (h$mids - h$breaks[-1])
+type_histogram = function() {
+    out <- list(
+        data = data_histogram(),
+        draw = draw_rect(),
+        name = "histogram"
     )
+    class(out) <- "tinyplot_type"
     return(out)
-  })
-  datapoints = do.call(rbind, datapoints)
-
-  out = list(
-    x = c(datapoints$xmin, datapoints$xmax), 
-    y = c(datapoints$ymin, datapoints$ymax),
-    ymin = datapoints$ymin, 
-    ymax = datapoints$ymax, 
-    xmin = datapoints$xmin, 
-    xmax = datapoints$xmax, 
-    ylab = ylab, 
-    col = col, 
-    bg = bg, 
-    type = type, 
-    datapoints = datapoints,
-    by = if (length(unique(datapoints$by)) == 1) by else datapoints$by, 
-    facet = if (length(unique(datapoints$facet)) == 1) facet else datapoints$facet
-  )
-  return(out)
 }
+
+
+data_histogram = function() {
+    fun = function(by, facet, ylab, col, bg, ribbon.alpha, datapoints, breaks = NULL, ...) {
+        hbreaks = ifelse(!is.null(breaks), breaks, "Sturges")
+
+        if (is.null(ylab)) ylab = "Frequency"
+        if (is.null(by) && is.null(palette)) {
+            if (is.null(col)) col = par("fg")
+            if (is.null(bg)) bg = "lightgray"
+        } else {
+            if (is.null(bg)) bg = ribbon.alpha
+        }
+
+        datapoints_breaks = hist(datapoints$x, breaks = hbreaks, plot = FALSE)
+        datapoints = split(datapoints, list(datapoints$by, datapoints$facet))
+        datapoints = Filter(function(k) nrow(k) > 0, datapoints)
+
+        datapoints = lapply(datapoints, function(k) {
+            h = hist(k$x, breaks = datapoints_breaks$breaks, plot = FALSE)
+            out = data.frame(
+                by = k$by[1], # already split
+                facet = k$facet[1], # already split
+                ymin = 0,
+                ymax = h$counts,
+                xmin = h$breaks[-1],
+                xmax = h$mids + (h$mids - h$breaks[-1])
+            )
+            return(out)
+        })
+        datapoints = do.call(rbind, datapoints)
+
+        out = list(
+            x = c(datapoints$xmin, datapoints$xmax), 
+            y = c(datapoints$ymin, datapoints$ymax),
+            ymin = datapoints$ymin, 
+            ymax = datapoints$ymax, 
+            xmin = datapoints$xmin, 
+            xmax = datapoints$xmax, 
+            ylab = ylab, 
+            col = col, 
+            bg = bg, 
+            datapoints = datapoints,
+            by = if (length(unique(datapoints$by)) == 1) by else datapoints$by, 
+            facet = if (length(unique(datapoints$facet)) == 1) facet else datapoints$facet
+        )
+        return(out)
+    }
+    return(fun)
+}
+
+

From b8b0098acbcad8aa67c55a0f4c1e7d0fbadba790 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 19:28:00 -0400
Subject: [PATCH 35/72] index

---
 R/tinyplot.R | 29 ++++++++++++++---------------
 1 file changed, 14 insertions(+), 15 deletions(-)

diff --git a/R/tinyplot.R b/R/tinyplot.R
index 9b8c7e01..8de67af7 100644
--- a/R/tinyplot.R
+++ b/R/tinyplot.R
@@ -535,7 +535,6 @@ tinyplot.default = function(
   
   # sanitize arguments
   ribbon.alpha = sanitize_ribbon.alpha(ribbon.alpha)
-  was_area_type = identical(type, "area") # flag to keep track for some legend adjustments below
 
 
   # type factories vs. strings
@@ -831,7 +830,7 @@ tinyplot.default = function(
 
     has_sub = !is.null(sub)
 
-    if (isTRUE(was_area_type) || isTRUE(type %in% c("rect", "histogram", "hist"))) {
+    if (isTRUE(type %in% c("area", "rect", "histogram", "hist"))) {
       legend_args[["pt.lwd"]] = par("lwd")
       legend_args[["lty"]] = 0
     }
@@ -1022,12 +1021,12 @@ tinyplot.default = function(
 
     ## Inner loop over the "facet" variables
     for (ii in seq_along(idata)) {
-      xx = idata[[ii]]$x
-      yy = idata[[ii]]$y
-      xxmin = idata[[ii]]$xmin
-      xxmax = idata[[ii]]$xmax
-      yymin = idata[[ii]]$ymin
-      yymax = idata[[ii]]$ymax
+      ix = idata[[ii]]$x
+      iy = idata[[ii]]$y
+      ixmin = idata[[ii]]$xmin
+      ixmax = idata[[ii]]$xmax
+      iymin = idata[[ii]]$ymin
+      iymax = idata[[ii]]$ymax
 
       if (isTRUE(by_continuous)) {
         icol = idata[[ii]]$col
@@ -1046,7 +1045,7 @@ tinyplot.default = function(
 
       # empty plot flag
       empty_plot = FALSE
-      if (isTRUE(empty) || isTRUE(type == "n") || ((length(xx) == 0) && !(type %in% c("histogram", "hist", "rect", "segments")))) {
+      if (isTRUE(empty) || isTRUE(type == "n") || ((length(ix) == 0) && !(type %in% c("histogram", "hist", "rect", "segments")))) {
         empty_plot = TRUE
       }
 
@@ -1054,12 +1053,12 @@ tinyplot.default = function(
       draw_elements(
         type = type,
         i = i,
-        ix = xx,
-        iy = yy,
-        ixmin = xxmin,
-        ixmax = xxmax,
-        iymin = yymin,
-        iymax = yymax, 
+        ix = ix,
+        iy = iy,
+        ixmin = ixmin,
+        ixmax = ixmax,
+        iymin = iymin,
+        iymax = iymax, 
         icol = icol,
         ilwd = ilwd,
         ipch = ipch,

From 783572bcefa67a63a10e05bd68e21b8955d9e703 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 20:04:54 -0400
Subject: [PATCH 36/72] errorbar + jitter docs

---
 NAMESPACE            |  2 ++
 R/type_errorbar.R    | 12 ++++++++----
 R/type_jitter.R      |  4 ++++
 man/type_errorbar.Rd | 14 ++++++++++++++
 man/type_jitter.Rd   | 20 ++++++++++++++++++++
 5 files changed, 48 insertions(+), 4 deletions(-)
 create mode 100644 man/type_errorbar.Rd
 create mode 100644 man/type_jitter.Rd

diff --git a/NAMESPACE b/NAMESPACE
index 0029cf7c..fd8f7b86 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -8,6 +8,8 @@ export(get_saved_par)
 export(plt)
 export(tinyplot)
 export(tpar)
+export(type_errorbar)
+export(type_jitter)
 importFrom(grDevices,adjustcolor)
 importFrom(grDevices,as.raster)
 importFrom(grDevices,colorRampPalette)
diff --git a/R/type_errorbar.R b/R/type_errorbar.R
index e5f1a8f6..d68d6d81 100644
--- a/R/type_errorbar.R
+++ b/R/type_errorbar.R
@@ -1,6 +1,10 @@
-type_errorbar = function() {
+#' Error bars
+#'
+#' @inheritParams graphics::arrows
+#' @export
+type_errorbar = function(length = 0.05) {
   out <- list(
-    draw = draw_errorbar(),
+    draw = draw_errorbar(length = length),
     data = data_pointrange(),
     name = "p"
   )
@@ -9,7 +13,7 @@ type_errorbar = function() {
 }
 
 
-draw_errorbar <- function() {
+draw_errorbar <- function(length = 0.05) {
     fun = function(ix, iy, ixmin, iymin, ixmax, iymax, icol, ibg, ipch, ilwd, cex, ...) {
         arrows(
             x0 = ixmin,
@@ -18,7 +22,7 @@ draw_errorbar <- function() {
             y1 = iymax,
             col = icol,
             lwd = ilwd,
-            length = 0.05,
+            length = length,
             angle = 90,
             code = 3
         )
diff --git a/R/type_jitter.R b/R/type_jitter.R
index 248270c1..0c63d93c 100644
--- a/R/type_jitter.R
+++ b/R/type_jitter.R
@@ -1,3 +1,7 @@
+#' Scatter plot with jittered points
+#'
+#' @inheritParams base::jitter
+#' @export
 type_jitter = function(factor = 1, amount = NULL) {
   out <- list(
     draw = draw_points(),
diff --git a/man/type_errorbar.Rd b/man/type_errorbar.Rd
new file mode 100644
index 00000000..dd3bb773
--- /dev/null
+++ b/man/type_errorbar.Rd
@@ -0,0 +1,14 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/type_errorbar.R
+\name{type_errorbar}
+\alias{type_errorbar}
+\title{Error bars}
+\usage{
+type_errorbar(length = 0.05)
+}
+\arguments{
+\item{length}{length of the edges of the arrow head (in inches).}
+}
+\description{
+Error bars
+}
diff --git a/man/type_jitter.Rd b/man/type_jitter.Rd
new file mode 100644
index 00000000..04feae74
--- /dev/null
+++ b/man/type_jitter.Rd
@@ -0,0 +1,20 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/type_jitter.R
+\name{type_jitter}
+\alias{type_jitter}
+\title{Scatter plot with jittered points}
+\usage{
+type_jitter(factor = 1, amount = NULL)
+}
+\arguments{
+\item{factor}{numeric.}
+
+\item{amount}{numeric; if positive, used as \emph{amount} (see below),
+    otherwise, if \code{= 0} the default is \code{factor * z/50}.
+
+    Default (\code{NULL}): \code{factor * d/5} where \code{d} is about
+    the smallest difference between \code{x} values.}
+}
+\description{
+Scatter plot with jittered points
+}

From 57db8f37f8b837e38671f93dd2ad3f505f3d16d1 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 20:33:29 -0400
Subject: [PATCH 37/72] boxplot type arguments

---
 R/type_boxplot.R             | 114 ++++++++++++++++++++---------------
 R/type_errorbar.R            |   2 +-
 R/type_jitter.R              |   2 +-
 inst/tinytest/test-boxplot.R |   4 +-
 man/type_boxplot.Rd          |  50 +++++++++++++++
 man/type_errorbar.Rd         |   4 +-
 man/type_jitter.Rd           |   4 +-
 7 files changed, 121 insertions(+), 59 deletions(-)
 create mode 100644 man/type_boxplot.Rd

diff --git a/R/type_boxplot.R b/R/type_boxplot.R
index ec0b0f70..01440b32 100644
--- a/R/type_boxplot.R
+++ b/R/type_boxplot.R
@@ -1,6 +1,25 @@
-type_boxplot = function() {
+#' Boxplot type
+#'
+#' @inheritParams graphics::boxplot
+type_boxplot = function(
+    range = 1.5,
+    boxwidth = NULL,
+    varwidth = FALSE,
+    notch = FALSE,
+    outline = TRUE,
+    boxwex = 0.8,
+    staplewex = 0.5,
+    outwex = 0.5) {
   out <- list(
-    draw = draw_boxplot(),
+    draw = draw_boxplot(
+      range = range,
+      boxwidth = boxwidth,
+      varwidth = varwidth,
+      notch = notch,
+      outline = outline,
+      boxwex = boxwex,
+      staplewex = staplewex,
+      outwex = outwex),
     data = data_boxplot(),
     name = "boxplot"
   )
@@ -9,6 +28,49 @@ type_boxplot = function() {
 }
 
 
+
+draw_boxplot = function(range, boxwidth, varwidth, notch, outline, boxwex, staplewex, outwex) {
+    fun = function(i, ix, iy, ipch, ilty, icol, ibg, dots, x_by = FALSE, facet_by = FALSE, split_data, ...) {
+
+        at_ix <- unique(ix)
+        horizontal <- if (!is.null(dots[["horizontal"]])) dots[["horizontal"]] else FALSE
+        if (isTRUE(x_by)) boxwex <- boxwex * 2
+
+        # Handle multiple groups
+        if (!is.null(split_data) && isFALSE(x_by) && isFALSE(facet_by) && length(split_data) > 1) {
+            boxwex_orig <- boxwex
+            boxwex <- boxwex / length(split_data) - 0.01
+            at_ix <- at_ix + seq(
+                -((boxwex_orig - boxwex) / 2),
+                ((boxwex_orig - boxwex) / 2),
+                length.out = length(split_data)
+            )[i]
+        }
+
+        boxplot(
+            formula = iy ~ ix,
+            pch = ipch,
+            lty = ilty,
+            border = icol,
+            col = ibg,
+            add = TRUE, axes = FALSE,
+            horizontal = horizontal,
+            at = at_ix,
+            range = range,
+            width = boxwidth,
+            varwidth = varwidth,
+            notch = notch,
+            outline = outline,
+            boxwex = boxwex,
+            staplewex = staplewex,
+            outwex = outwex
+        )
+    }
+    return(fun)
+}
+
+
+
 data_boxplot = function() {
     fun = function(datapoints, bg, col, palette, ...) {
         # Convert x to factor if it's not already
@@ -65,52 +127,4 @@ data_boxplot = function() {
 
 
 
-draw_boxplot = function() {
-    fun = function(i, ix, iy, ipch, ilty, icol, ibg, dots, x_by = FALSE, facet_by = FALSE, split_data, ...) {
-
-        at_ix <- unique(ix)
-        horizontal <- if (!is.null(dots[["horizontal"]])) dots[["horizontal"]] else FALSE
-        range_ix <- if (!is.null(dots[["range"]])) dots[["range"]] else 1.5
-        boxwidth_ix <- if (!is.null(dots[["boxwidth"]])) dots[["boxwidth"]] else NULL
-        varwidth_ix <- if (!is.null(dots[["varwidth"]])) dots[["varwidth"]] else FALSE
-        notch_ix <- if (!is.null(dots[["notch"]])) dots[["notch"]] else FALSE
-        outline_ix <- if (!is.null(dots[["outline"]])) dots[["outline"]] else TRUE
-        boxwex_ix <- if (!is.null(dots[["boxwex"]])) dots[["boxwex"]] else 0.8
-        if (isTRUE(x_by)) boxwex_ix <- boxwex_ix * 2
-        staplewex_ix <- if (!is.null(dots[["staplewex"]])) dots[["staplewex"]] else 0.5
-        outwex_ix <- if (!is.null(dots[["outwex"]])) dots[["outwex"]] else 0.5
-
-        # Handle multiple groups
-        if (!is.null(split_data) && isFALSE(x_by) && isFALSE(facet_by) && length(split_data) > 1) {
-            boxwex_ix_orig <- boxwex_ix
-            boxwex_ix <- boxwex_ix / length(split_data) - 0.01
-            at_ix <- at_ix + seq(
-                -((boxwex_ix_orig - boxwex_ix) / 2),
-                ((boxwex_ix_orig - boxwex_ix) / 2),
-                length.out = length(split_data)
-            )[i]
-        }
-
-        boxplot(
-            formula = iy ~ ix,
-            pch = ipch,
-            lty = ilty,
-            border = icol,
-            col = ibg,
-            add = TRUE, axes = FALSE,
-            horizontal = horizontal,
-            at = at_ix,
-            range = range_ix,
-            width = boxwidth_ix,
-            varwidth = varwidth_ix,
-            notch = notch_ix,
-            outline = outline_ix,
-            boxwex = boxwex_ix,
-            staplewex = staplewex_ix,
-            outwex = outwex_ix
-        )
-    }
-    return(fun)
-}
-
 
diff --git a/R/type_errorbar.R b/R/type_errorbar.R
index d68d6d81..43e5d071 100644
--- a/R/type_errorbar.R
+++ b/R/type_errorbar.R
@@ -1,4 +1,4 @@
-#' Error bars
+#' Error bars type
 #'
 #' @inheritParams graphics::arrows
 #' @export
diff --git a/R/type_jitter.R b/R/type_jitter.R
index 0c63d93c..84c8948f 100644
--- a/R/type_jitter.R
+++ b/R/type_jitter.R
@@ -1,4 +1,4 @@
-#' Scatter plot with jittered points
+#' Jittered points type
 #'
 #' @inheritParams base::jitter
 #' @export
diff --git a/inst/tinytest/test-boxplot.R b/inst/tinytest/test-boxplot.R
index cdac1beb..44afe62a 100644
--- a/inst/tinytest/test-boxplot.R
+++ b/inst/tinytest/test-boxplot.R
@@ -34,13 +34,11 @@ expect_snapshot_plot(f, label = "boxplot_groups")
 f = function() {
   plt(len ~ dose | factor(supp, labels = c("Ascorbic acid", "Orange juice")), 
       data = ToothGrowth,
-      boxwex = 0.5,
-      staplewex = 0,
       lty  = 1, pch = 16,
       main = "Guinea Pigs' Tooth Growth",
       xlab = "Vitamin C dose mg", ylab = "tooth length",
       ylim = c(0, 35),
-      type = "boxplot",
+      type = type_boxplot(boxwex = 0.5, staplewex = 0),
       legend = list(title = NULL),
       horizontal = TRUE
   )
diff --git a/man/type_boxplot.Rd b/man/type_boxplot.Rd
new file mode 100644
index 00000000..9ec3cf43
--- /dev/null
+++ b/man/type_boxplot.Rd
@@ -0,0 +1,50 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/type_boxplot.R
+\name{type_boxplot}
+\alias{type_boxplot}
+\title{Boxplot type}
+\usage{
+type_boxplot(
+  range = 1.5,
+  boxwidth = NULL,
+  varwidth = FALSE,
+  notch = FALSE,
+  outline = TRUE,
+  boxwex = 0.8,
+  staplewex = 0.5,
+  outwex = 0.5
+)
+}
+\arguments{
+\item{range}{this determines how far the plot whiskers extend out
+    from the box.  If \code{range} is positive, the whiskers extend
+    to the most extreme data point which is no more than
+    \code{range} times the interquartile range from the box. A value
+    of zero causes the whiskers to extend to the data extremes.}
+
+\item{varwidth}{if \code{varwidth} is \code{TRUE}, the boxes are
+    drawn with widths proportional to the square-roots of the number
+    of observations in the groups.}
+
+\item{notch}{if \code{notch} is \code{TRUE}, a notch is drawn in
+    each side of the boxes.  If the notches of two plots do not
+    overlap this is \sQuote{strong evidence} that the two medians differ
+    (Chambers \abbr{et al.}, 1983, p.\ifelse{latex}{\out{~}}{ }{}62).  See \code{\link{boxplot.stats}}
+    for the calculations used.}
+
+\item{outline}{if \code{outline} is not true, the outliers are
+    not drawn (as points whereas S+ uses lines).}
+
+\item{boxwex}{a scale factor to be applied to all boxes.  When there
+    are only a few groups, the appearance of the plot can be improved
+    by making the boxes narrower.}
+
+\item{staplewex}{staple line width expansion, proportional to box
+    width.}
+
+\item{outwex}{outlier line width expansion, proportional to box
+    width.}
+}
+\description{
+Boxplot type
+}
diff --git a/man/type_errorbar.Rd b/man/type_errorbar.Rd
index dd3bb773..344a84df 100644
--- a/man/type_errorbar.Rd
+++ b/man/type_errorbar.Rd
@@ -2,7 +2,7 @@
 % Please edit documentation in R/type_errorbar.R
 \name{type_errorbar}
 \alias{type_errorbar}
-\title{Error bars}
+\title{Error bars type}
 \usage{
 type_errorbar(length = 0.05)
 }
@@ -10,5 +10,5 @@ type_errorbar(length = 0.05)
 \item{length}{length of the edges of the arrow head (in inches).}
 }
 \description{
-Error bars
+Error bars type
 }
diff --git a/man/type_jitter.Rd b/man/type_jitter.Rd
index 04feae74..bb6a3b02 100644
--- a/man/type_jitter.Rd
+++ b/man/type_jitter.Rd
@@ -2,7 +2,7 @@
 % Please edit documentation in R/type_jitter.R
 \name{type_jitter}
 \alias{type_jitter}
-\title{Scatter plot with jittered points}
+\title{Jittered points type}
 \usage{
 type_jitter(factor = 1, amount = NULL)
 }
@@ -16,5 +16,5 @@ type_jitter(factor = 1, amount = NULL)
     the smallest difference between \code{x} values.}
 }
 \description{
-Scatter plot with jittered points
+Jittered points type
 }

From a43f85a66d36d5911e1e8ce7e6749c9fe4437661 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 21:37:06 -0400
Subject: [PATCH 38/72] type_glm

---
 NAMESPACE         |  2 ++
 R/draw_elements.R |  2 --
 R/sanitize.R      |  5 ++++
 R/type_boxplot.R  |  1 +
 R/type_glm.R      | 61 +++++++++++++++++++++++++++++++++++++++++++++++
 R/type_loess.R    | 36 ++++++++++++++++++++++++++++
 man/type_loess.Rd | 33 +++++++++++++++++++++++++
 7 files changed, 138 insertions(+), 2 deletions(-)
 create mode 100644 R/type_glm.R
 create mode 100644 R/type_loess.R
 create mode 100644 man/type_loess.Rd

diff --git a/NAMESPACE b/NAMESPACE
index fd8f7b86..beb4d6a8 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -8,8 +8,10 @@ export(get_saved_par)
 export(plt)
 export(tinyplot)
 export(tpar)
+export(type_boxplot)
 export(type_errorbar)
 export(type_jitter)
+export(type_loess)
 importFrom(grDevices,adjustcolor)
 importFrom(grDevices,as.raster)
 importFrom(grDevices,colorRampPalette)
diff --git a/R/draw_elements.R b/R/draw_elements.R
index 47457162..11645125 100644
--- a/R/draw_elements.R
+++ b/R/draw_elements.R
@@ -26,8 +26,6 @@ draw_elements = function(
     draw_fun = NULL
     ) {
 
-      types = c("area", "boxplot", "ribbon", "pointrange", "histogram", "errorbar", "polygon", "polypath", "rect", "segments", "p", "points", "l", "o", "b", "c", "h", "s", "S", "n")
-      assert_choice(type, types, null.ok = TRUE)
 
       ## polygons before lines, segments/arrows before points, etc.
       if (isTRUE(empty_plot)) return(invisible())
diff --git a/R/sanitize.R b/R/sanitize.R
index 0e6a100f..f407a969 100644
--- a/R/sanitize.R
+++ b/R/sanitize.R
@@ -11,6 +11,9 @@ sanitize_type = function(type, x, y) {
         return(type)
     }
 
+    types = c("area", "boxplot", "ribbon", "pointrange", "histogram", "errorbar", "polygon", "polypath", "loess", "rect", "segments", "p", "points", "l", "o", "b", "c", "h", "s", "S", "n")
+    assert_choice(type, types, null.ok = TRUE)
+
     if (is.null(type)) {
         # enforce boxplot type for y ~ factor(x)
         if (!is.null(x) && is.factor(x) && !is.factor(y)) {
@@ -28,6 +31,8 @@ sanitize_type = function(type, x, y) {
         return(type_points())
     } else if (identical(type, "segments")) {
         return(type_segments())
+    } else if (identical(type, "loess")) {
+        return(type_loess())
     } else if (identical(type, "area")) {
         return(type_area())
     } else if (identical(type, "rect")) {
diff --git a/R/type_boxplot.R b/R/type_boxplot.R
index 01440b32..7444b404 100644
--- a/R/type_boxplot.R
+++ b/R/type_boxplot.R
@@ -1,6 +1,7 @@
 #' Boxplot type
 #'
 #' @inheritParams graphics::boxplot
+#' @export
 type_boxplot = function(
     range = 1.5,
     boxwidth = NULL,
diff --git a/R/type_glm.R b/R/type_glm.R
new file mode 100644
index 00000000..bde92763
--- /dev/null
+++ b/R/type_glm.R
@@ -0,0 +1,61 @@
+#' GLM type
+#' 
+#' @param se logical. If TRUE, confidence intervals are drawn.
+#' @inheritParams stats::glm
+#' @inheritParams stats::predict.glm
+#' @export
+type_glm = function(family = "gaussian", se = FALSE, level = 0.95, type = "response", ...) {
+    assert_flag(se)
+    out <- list(
+        draw = draw_ribbon(),
+        data = data_glm(family = family, se = se, level = level, type = type),
+        name = if (isTRUE(se)) "ribbon" else "l"
+    )
+    class(out) <- "tinyplot_type"
+    return(out)
+}
+
+
+data_glm = function(family, se, level, type, ...) {
+    fun = function(datapoints, ...) {
+        dat = split(datapoints, list(datapoints$facet, datapoints$by))
+        dat = lapply(dat, function(x) {
+            fit = stats::glm(y ~ x, data = x, family = family)
+            nd = data.frame(x = seq(min(x$x), max(x$x), length.out = 100))
+            nd$by = x$by[1]
+            nd$facet = x$facet[1]
+            if (se == TRUE) {
+                if (identical(type, "response")) {
+                    p = stats::predict(fit, newdata = nd, type = "link", se.fit = TRUE)
+                    p = ci(p$fit, p$se.fit, conf.level = level, fit$df.residual, backtransform = stats::family(fit)$linkinv)
+                    nd$y = p$estimate
+                    nd$ymax = p$conf.high
+                    nd$ymin = p$conf.low
+                    
+                } else {
+                    nd$y = stats::predict(fit, newdata = nd, type = type)
+                    nd = ci(nd$y, nd$se, level, fit$df.residual, backtransform = stats::family(fit)$linkinv)
+                }
+            } else {
+                nd$y = stats::predict(fit, nd)
+            }
+            nd
+        })
+        datapoints = do.call(rbind, dat)
+        datapoints = datapoints[order(datapoints$facet, datapoints$by, datapoints$x), ]
+        out = list(datapoints = datapoints)
+        return(out)
+    }
+    return(fun)
+}
+
+
+ci = function(estimate, std.error, conf.level, df, backtransform = identity) {
+    crit = stats::qt(1 - (1 - conf.level) / 2, df)
+    out = list(
+        estimate = backtransform(estimate),
+        conf.low = backtransform(estimate - crit * std.error),
+        conf.high = backtransform(estimate + crit * std.error)
+    )
+    return(out)
+}
diff --git a/R/type_loess.R b/R/type_loess.R
new file mode 100644
index 00000000..2a7c406d
--- /dev/null
+++ b/R/type_loess.R
@@ -0,0 +1,36 @@
+#' LOESS type
+#' 
+#' @inheritParams stats::loess
+#' @export
+type_loess = function(
+    span = 0.75,
+    degree = 2,
+    family = "gaussian",
+    control = loess.control(),
+    ...) {
+    out <- list(
+        draw = draw_lines(),
+        data = data_loess(span = span, degree = degree, family = family, control = control),
+        name = "l"
+    )
+    class(out) <- "tinyplot_type"
+    return(out)
+}
+
+
+data_loess = function(span, degree, family, control, ...) {
+    fun = function(datapoints, ...) {
+        dat = split(datapoints, list(datapoints$facet, datapoints$by))
+        dat = lapply(dat, function(x) {
+            fit = stats::loess(y ~ x, data = x, span = span, degree = degree, family = family, control = control)
+            x$y = stats::predict(fit, x)
+            x
+        })
+        datapoints = do.call(rbind, dat)
+        datapoints = datapoints[order(datapoints$facet, datapoints$by, datapoints$x), ]
+        out = list(datapoints = datapoints)
+        return(out)
+    }
+    return(fun)
+}
+
diff --git a/man/type_loess.Rd b/man/type_loess.Rd
new file mode 100644
index 00000000..545a827f
--- /dev/null
+++ b/man/type_loess.Rd
@@ -0,0 +1,33 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/type_loess.R
+\name{type_loess}
+\alias{type_loess}
+\title{LOESS type}
+\usage{
+type_loess(
+  span = 0.75,
+  degree = 2,
+  family = "gaussian",
+  control = loess.control,
+  ...
+)
+}
+\arguments{
+\item{span}{the parameter \eqn{\alpha} which controls the degree of
+    smoothing.}
+
+\item{degree}{the degree of the polynomials to be used, normally 1 or
+    2. (Degree 0 is also allowed, but see the \sQuote{Note}.)}
+
+\item{family}{if \code{"gaussian"} fitting is by least-squares, and if
+    \code{"symmetric"} a re-descending M estimator is used with Tukey's
+    biweight function.  Can be abbreviated.}
+
+\item{control}{control parameters: see \code{\link[stats]{loess.control}}.}
+
+\item{...}{control parameters can also be supplied directly
+    (\emph{if} \code{control} is not specified).}
+}
+\description{
+LOESS type
+}

From 8d3ffe9a169e06850abbb2b8e43120a170d9f7b6 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 21:52:13 -0400
Subject: [PATCH 39/72] type_lm

---
 NAMESPACE         |  2 ++
 R/sanitize.R      | 11 ++++++++---
 R/type_glm.R      |  2 +-
 R/type_lm.R       | 43 +++++++++++++++++++++++++++++++++++++++++++
 man/type_glm.Rd   | 31 +++++++++++++++++++++++++++++++
 man/type_lm.Rd    | 21 +++++++++++++++++++++
 man/type_loess.Rd |  2 +-
 7 files changed, 107 insertions(+), 5 deletions(-)
 create mode 100644 R/type_lm.R
 create mode 100644 man/type_glm.Rd
 create mode 100644 man/type_lm.Rd

diff --git a/NAMESPACE b/NAMESPACE
index beb4d6a8..5a0c3c1a 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -10,7 +10,9 @@ export(tinyplot)
 export(tpar)
 export(type_boxplot)
 export(type_errorbar)
+export(type_glm)
 export(type_jitter)
+export(type_lm)
 export(type_loess)
 importFrom(grDevices,adjustcolor)
 importFrom(grDevices,as.raster)
diff --git a/R/sanitize.R b/R/sanitize.R
index f407a969..166fdeb7 100644
--- a/R/sanitize.R
+++ b/R/sanitize.R
@@ -11,7 +11,7 @@ sanitize_type = function(type, x, y) {
         return(type)
     }
 
-    types = c("area", "boxplot", "ribbon", "pointrange", "histogram", "errorbar", "polygon", "polypath", "loess", "rect", "segments", "p", "points", "l", "o", "b", "c", "h", "s", "S", "n")
+    types = c("area", "boxplot", "ribbon", "pointrange", "histogram", "errorbar", "polygon", "polypath", "rect", "segments", "points", "p", "l", "o", "b", "c", "h", "s", "S", "n", "loess", "lm", "glm")
     assert_choice(type, types, null.ok = TRUE)
 
     if (is.null(type)) {
@@ -31,8 +31,6 @@ sanitize_type = function(type, x, y) {
         return(type_points())
     } else if (identical(type, "segments")) {
         return(type_segments())
-    } else if (identical(type, "loess")) {
-        return(type_loess())
     } else if (identical(type, "area")) {
         return(type_area())
     } else if (identical(type, "rect")) {
@@ -51,6 +49,13 @@ sanitize_type = function(type, x, y) {
         return(type_histogram())
     } else if (isTRUE(type %in% c("j", "jitter"))) {
         return(type_jitter())
+    # statistical functions
+    } else if (identical(type, "loess")) {
+        return(type_loess())
+    } else if (identical(type, "glm")) {
+        return(type_glm())
+    } else if (identical(type, "lm")) {
+        return(type_lm())
     }
 
     out = list(draw = NULL, data = NULL, name = type)
diff --git a/R/type_glm.R b/R/type_glm.R
index bde92763..b09475b9 100644
--- a/R/type_glm.R
+++ b/R/type_glm.R
@@ -31,7 +31,7 @@ data_glm = function(family, se, level, type, ...) {
                     nd$y = p$estimate
                     nd$ymax = p$conf.high
                     nd$ymin = p$conf.low
-                    
+
                 } else {
                     nd$y = stats::predict(fit, newdata = nd, type = type)
                     nd = ci(nd$y, nd$se, level, fit$df.residual, backtransform = stats::family(fit)$linkinv)
diff --git a/R/type_lm.R b/R/type_lm.R
new file mode 100644
index 00000000..d1b89a4c
--- /dev/null
+++ b/R/type_lm.R
@@ -0,0 +1,43 @@
+#' LM type
+#' 
+#' @inheritParams type_glm
+#' @export
+type_lm = function(se = FALSE, level = 0.95, ...) {
+    assert_flag(se)
+    out <- list(
+        draw = draw_ribbon(),
+        data = data_lm(se = se, level = level),
+        name = if (isTRUE(se)) "ribbon" else "l"
+    )
+    class(out) <- "tinyplot_type"
+    return(out)
+}
+
+
+data_lm = function(se, level, ...) {
+    fun = function(datapoints, ...) {
+        dat = split(datapoints, list(datapoints$facet, datapoints$by))
+        dat = lapply(dat, function(x) {
+            fit = stats::lm(y ~ x, data = x)
+            nd = data.frame(x = seq(min(x$x), max(x$x), length.out = 100))
+            nd$by = x$by[1]
+            nd$facet = x$facet[1]
+            if (se == TRUE) {
+                p = stats::predict(fit, newdata = nd, se.fit = TRUE)
+                p = ci(p$fit, p$se.fit, conf.level = level, fit$df.residual)
+                nd$y = p$estimate
+                nd$ymax = p$conf.high
+                nd$ymin = p$conf.low
+            } else {
+                nd$y = stats::predict(fit, nd)
+            }
+            nd
+        })
+        datapoints = do.call(rbind, dat)
+        datapoints = datapoints[order(datapoints$facet, datapoints$by, datapoints$x), ]
+        out = list(datapoints = datapoints)
+        return(out)
+    }
+    return(fun)
+}
+
diff --git a/man/type_glm.Rd b/man/type_glm.Rd
new file mode 100644
index 00000000..ba9fd705
--- /dev/null
+++ b/man/type_glm.Rd
@@ -0,0 +1,31 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/type_glm.R
+\name{type_glm}
+\alias{type_glm}
+\title{GLM type}
+\usage{
+type_glm(family = "gaussian", se = FALSE, level = 0.95, type = "response", ...)
+}
+\arguments{
+\item{family}{a description of the error distribution and link
+    function to be used in the model.  For \code{glm} this can be a
+    character string naming a family function, a family function or the
+    result of a call to a family function.  For \code{glm.fit} only the
+    third option is supported.  (See \code{\link[stats]{family}} for details of
+    family functions.)}
+
+\item{se}{logical. If TRUE, confidence intervals are drawn.}
+
+\item{type}{character, partial matching allowed.  Type of weights to
+    extract from the fitted model object.  Can be abbreviated.}
+
+\item{...}{
+    For \code{glm}: arguments to be used to form the default
+    \code{control} argument if it is not supplied directly.
+
+    For \code{weights}: further arguments passed to or from other methods.
+  }
+}
+\description{
+GLM type
+}
diff --git a/man/type_lm.Rd b/man/type_lm.Rd
new file mode 100644
index 00000000..34ace16f
--- /dev/null
+++ b/man/type_lm.Rd
@@ -0,0 +1,21 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/type_lm.R
+\name{type_lm}
+\alias{type_lm}
+\title{LM type}
+\usage{
+type_lm(se = FALSE, level = 0.95, ...)
+}
+\arguments{
+\item{se}{logical. If TRUE, confidence intervals are drawn.}
+
+\item{...}{
+    For \code{glm}: arguments to be used to form the default
+    \code{control} argument if it is not supplied directly.
+
+    For \code{weights}: further arguments passed to or from other methods.
+  }
+}
+\description{
+LM type
+}
diff --git a/man/type_loess.Rd b/man/type_loess.Rd
index 545a827f..52a54407 100644
--- a/man/type_loess.Rd
+++ b/man/type_loess.Rd
@@ -8,7 +8,7 @@ type_loess(
   span = 0.75,
   degree = 2,
   family = "gaussian",
-  control = loess.control,
+  control = loess.control(),
   ...
 )
 }

From 9707269265106c639c5964c7145d1771ecfe8ea0 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 21:57:55 -0400
Subject: [PATCH 40/72] sanity checks

---
 R/sanitize.R | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/R/sanitize.R b/R/sanitize.R
index 166fdeb7..59ca357f 100644
--- a/R/sanitize.R
+++ b/R/sanitize.R
@@ -11,7 +11,7 @@ sanitize_type = function(type, x, y) {
         return(type)
     }
 
-    types = c("area", "boxplot", "ribbon", "pointrange", "histogram", "errorbar", "polygon", "polypath", "rect", "segments", "points", "p", "l", "o", "b", "c", "h", "s", "S", "n", "loess", "lm", "glm")
+    types = c("area", "boxplot", "density", "jitter", "ribbon", "pointrange", "hist", "histogram", "errorbar", "polygon", "polypath", "rect", "segments", "points", "p", "l", "o", "b", "c", "h", "j", "s", "S", "n", "loess", "lm", "glm")
     assert_choice(type, types, null.ok = TRUE)
 
     if (is.null(type)) {

From e0a0471e9828e91c00fa0f1e47ca4d5a0ea492d4 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 22:05:01 -0400
Subject: [PATCH 41/72] checks

---
 R/type_boxplot.R    | 8 ++++----
 R/type_glm.R        | 1 +
 R/type_loess.R      | 2 +-
 R/zzz.R             | 2 ++
 man/type_boxplot.Rd | 5 ++++-
 man/type_glm.Rd     | 2 ++
 man/type_lm.Rd      | 2 ++
 man/type_loess.Rd   | 2 +-
 8 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/R/type_boxplot.R b/R/type_boxplot.R
index 7444b404..1802fa23 100644
--- a/R/type_boxplot.R
+++ b/R/type_boxplot.R
@@ -4,7 +4,7 @@
 #' @export
 type_boxplot = function(
     range = 1.5,
-    boxwidth = NULL,
+    width = NULL,
     varwidth = FALSE,
     notch = FALSE,
     outline = TRUE,
@@ -14,7 +14,7 @@ type_boxplot = function(
   out <- list(
     draw = draw_boxplot(
       range = range,
-      boxwidth = boxwidth,
+      width = width,
       varwidth = varwidth,
       notch = notch,
       outline = outline,
@@ -30,7 +30,7 @@ type_boxplot = function(
 
 
 
-draw_boxplot = function(range, boxwidth, varwidth, notch, outline, boxwex, staplewex, outwex) {
+draw_boxplot = function(range, width, varwidth, notch, outline, boxwex, staplewex, outwex) {
     fun = function(i, ix, iy, ipch, ilty, icol, ibg, dots, x_by = FALSE, facet_by = FALSE, split_data, ...) {
 
         at_ix <- unique(ix)
@@ -58,7 +58,7 @@ draw_boxplot = function(range, boxwidth, varwidth, notch, outline, boxwex, stapl
             horizontal = horizontal,
             at = at_ix,
             range = range,
-            width = boxwidth,
+            width = width,
             varwidth = varwidth,
             notch = notch,
             outline = outline,
diff --git a/R/type_glm.R b/R/type_glm.R
index b09475b9..9f1e66c2 100644
--- a/R/type_glm.R
+++ b/R/type_glm.R
@@ -3,6 +3,7 @@
 #' @param se logical. If TRUE, confidence intervals are drawn.
 #' @inheritParams stats::glm
 #' @inheritParams stats::predict.glm
+#' @inheritParams stats::confint
 #' @export
 type_glm = function(family = "gaussian", se = FALSE, level = 0.95, type = "response", ...) {
     assert_flag(se)
diff --git a/R/type_loess.R b/R/type_loess.R
index 2a7c406d..a8395b25 100644
--- a/R/type_loess.R
+++ b/R/type_loess.R
@@ -6,7 +6,7 @@ type_loess = function(
     span = 0.75,
     degree = 2,
     family = "gaussian",
-    control = loess.control(),
+    control = stats::loess.control(),
     ...) {
     out <- list(
         draw = draw_lines(),
diff --git a/R/zzz.R b/R/zzz.R
index f928623c..e86e19f1 100644
--- a/R/zzz.R
+++ b/R/zzz.R
@@ -61,6 +61,7 @@
     "facet",
     "facets",
     "fill",
+    "flip",
     "frame.plot",
     "has_legend",
     "ifacet",
@@ -82,6 +83,7 @@
     "xmin",
     "y",
     "yaxt",
+    "ylabs",
     "ylim",
     "ymax",
     "ymin"
diff --git a/man/type_boxplot.Rd b/man/type_boxplot.Rd
index 9ec3cf43..19c0d73b 100644
--- a/man/type_boxplot.Rd
+++ b/man/type_boxplot.Rd
@@ -6,7 +6,7 @@
 \usage{
 type_boxplot(
   range = 1.5,
-  boxwidth = NULL,
+  width = NULL,
   varwidth = FALSE,
   notch = FALSE,
   outline = TRUE,
@@ -22,6 +22,9 @@ type_boxplot(
     \code{range} times the interquartile range from the box. A value
     of zero causes the whiskers to extend to the data extremes.}
 
+\item{width}{a vector giving the relative widths of the boxes making
+    up the plot.}
+
 \item{varwidth}{if \code{varwidth} is \code{TRUE}, the boxes are
     drawn with widths proportional to the square-roots of the number
     of observations in the groups.}
diff --git a/man/type_glm.Rd b/man/type_glm.Rd
index ba9fd705..42f78475 100644
--- a/man/type_glm.Rd
+++ b/man/type_glm.Rd
@@ -16,6 +16,8 @@ type_glm(family = "gaussian", se = FALSE, level = 0.95, type = "response", ...)
 
 \item{se}{logical. If TRUE, confidence intervals are drawn.}
 
+\item{level}{the confidence level required.}
+
 \item{type}{character, partial matching allowed.  Type of weights to
     extract from the fitted model object.  Can be abbreviated.}
 
diff --git a/man/type_lm.Rd b/man/type_lm.Rd
index 34ace16f..6ecdd545 100644
--- a/man/type_lm.Rd
+++ b/man/type_lm.Rd
@@ -9,6 +9,8 @@ type_lm(se = FALSE, level = 0.95, ...)
 \arguments{
 \item{se}{logical. If TRUE, confidence intervals are drawn.}
 
+\item{level}{the confidence level required.}
+
 \item{...}{
     For \code{glm}: arguments to be used to form the default
     \code{control} argument if it is not supplied directly.
diff --git a/man/type_loess.Rd b/man/type_loess.Rd
index 52a54407..173a4d82 100644
--- a/man/type_loess.Rd
+++ b/man/type_loess.Rd
@@ -8,7 +8,7 @@ type_loess(
   span = 0.75,
   degree = 2,
   family = "gaussian",
-  control = loess.control(),
+  control = stats::loess.control(),
   ...
 )
 }

From 3a8e151e8726fffe137e45e620e09b4622bf4d71 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 22:33:40 -0400
Subject: [PATCH 42/72] type

---
 R/type_area.R       |  4 ++--
 R/type_boxplot.R    | 16 ++++++++--------
 R/type_errorbar.R   |  6 +++---
 R/type_glm.R        |  4 ++--
 R/type_histogram.R  |  4 ++--
 R/type_jitter.R     |  4 ++--
 R/type_lines.R      |  6 +++---
 R/type_lm.R         |  4 ++--
 R/type_loess.R      |  4 ++--
 R/type_pointrange.R |  6 +++---
 R/type_points.R     |  4 ++--
 R/type_polygon.R    |  6 +++---
 R/type_polypath.R   |  8 ++++----
 R/type_rect.R       |  8 ++++----
 R/type_ribbon.R     |  6 +++---
 R/type_segments.R   |  8 ++++----
 16 files changed, 49 insertions(+), 49 deletions(-)

diff --git a/R/type_area.R b/R/type_area.R
index d15140f4..229d9eec 100644
--- a/R/type_area.R
+++ b/R/type_area.R
@@ -1,10 +1,10 @@
 type_area = function() {
-  out <- list(
+  out = list(
     draw = NULL,
     data = data_area(),
     name = "area"
   )
-  class(out) <- "tinyplot_type"
+  class(out) = "tinyplot_type"
   return(out)
 }
 
diff --git a/R/type_boxplot.R b/R/type_boxplot.R
index 1802fa23..afe9aa34 100644
--- a/R/type_boxplot.R
+++ b/R/type_boxplot.R
@@ -11,7 +11,7 @@ type_boxplot = function(
     boxwex = 0.8,
     staplewex = 0.5,
     outwex = 0.5) {
-  out <- list(
+  out = list(
     draw = draw_boxplot(
       range = range,
       width = width,
@@ -24,7 +24,7 @@ type_boxplot = function(
     data = data_boxplot(),
     name = "boxplot"
   )
-  class(out) <- "tinyplot_type"
+  class(out) = "tinyplot_type"
   return(out)
 }
 
@@ -33,15 +33,15 @@ type_boxplot = function(
 draw_boxplot = function(range, width, varwidth, notch, outline, boxwex, staplewex, outwex) {
     fun = function(i, ix, iy, ipch, ilty, icol, ibg, dots, x_by = FALSE, facet_by = FALSE, split_data, ...) {
 
-        at_ix <- unique(ix)
-        horizontal <- if (!is.null(dots[["horizontal"]])) dots[["horizontal"]] else FALSE
-        if (isTRUE(x_by)) boxwex <- boxwex * 2
+        at_ix = unique(ix)
+        horizontal = if (!is.null(dots[["horizontal"]])) dots[["horizontal"]] else FALSE
+        if (isTRUE(x_by)) boxwex = boxwex * 2
 
         # Handle multiple groups
         if (!is.null(split_data) && isFALSE(x_by) && isFALSE(facet_by) && length(split_data) > 1) {
-            boxwex_orig <- boxwex
-            boxwex <- boxwex / length(split_data) - 0.01
-            at_ix <- at_ix + seq(
+            boxwex_orig = boxwex
+            boxwex = boxwex / length(split_data) - 0.01
+            at_ix = at_ix + seq(
                 -((boxwex_orig - boxwex) / 2),
                 ((boxwex_orig - boxwex) / 2),
                 length.out = length(split_data)
diff --git a/R/type_errorbar.R b/R/type_errorbar.R
index 43e5d071..bb0e5f7d 100644
--- a/R/type_errorbar.R
+++ b/R/type_errorbar.R
@@ -3,17 +3,17 @@
 #' @inheritParams graphics::arrows
 #' @export
 type_errorbar = function(length = 0.05) {
-  out <- list(
+  out = list(
     draw = draw_errorbar(length = length),
     data = data_pointrange(),
     name = "p"
   )
-  class(out) <- "tinyplot_type"
+  class(out) = "tinyplot_type"
   return(out)
 }
 
 
-draw_errorbar <- function(length = 0.05) {
+draw_errorbar = function(length = 0.05) {
     fun = function(ix, iy, ixmin, iymin, ixmax, iymax, icol, ibg, ipch, ilwd, cex, ...) {
         arrows(
             x0 = ixmin,
diff --git a/R/type_glm.R b/R/type_glm.R
index 9f1e66c2..51448a45 100644
--- a/R/type_glm.R
+++ b/R/type_glm.R
@@ -7,12 +7,12 @@
 #' @export
 type_glm = function(family = "gaussian", se = FALSE, level = 0.95, type = "response", ...) {
     assert_flag(se)
-    out <- list(
+    out = list(
         draw = draw_ribbon(),
         data = data_glm(family = family, se = se, level = level, type = type),
         name = if (isTRUE(se)) "ribbon" else "l"
     )
-    class(out) <- "tinyplot_type"
+    class(out) = "tinyplot_type"
     return(out)
 }
 
diff --git a/R/type_histogram.R b/R/type_histogram.R
index de485401..0759c883 100644
--- a/R/type_histogram.R
+++ b/R/type_histogram.R
@@ -1,10 +1,10 @@
 type_histogram = function() {
-    out <- list(
+    out = list(
         data = data_histogram(),
         draw = draw_rect(),
         name = "histogram"
     )
-    class(out) <- "tinyplot_type"
+    class(out) = "tinyplot_type"
     return(out)
 }
 
diff --git a/R/type_jitter.R b/R/type_jitter.R
index 84c8948f..ffb6fee1 100644
--- a/R/type_jitter.R
+++ b/R/type_jitter.R
@@ -3,12 +3,12 @@
 #' @inheritParams base::jitter
 #' @export
 type_jitter = function(factor = 1, amount = NULL) {
-  out <- list(
+  out = list(
     draw = draw_points(),
     data = data_jitter(factor = factor, amount = amount),
     name = "p"
   )
-  class(out) <- "tinyplot_type"
+  class(out) = "tinyplot_type"
   return(out)
 }
 
diff --git a/R/type_lines.R b/R/type_lines.R
index 1fa4beee..72636595 100644
--- a/R/type_lines.R
+++ b/R/type_lines.R
@@ -1,15 +1,15 @@
 type_lines = function(type = "l") {
-  out <- list(
+  out = list(
     draw = draw_lines(type = type),
     data = NULL,
     name = type
   )
-  class(out) <- "tinyplot_type"
+  class(out) = "tinyplot_type"
   return(out)
 }
 
 
-draw_lines <- function(type = "l") {
+draw_lines = function(type = "l") {
     fun = function(ix, iy, icol, ipch, ilty, ilwd, ...) {
         lines(
             x = ix,
diff --git a/R/type_lm.R b/R/type_lm.R
index d1b89a4c..5e8350d7 100644
--- a/R/type_lm.R
+++ b/R/type_lm.R
@@ -4,12 +4,12 @@
 #' @export
 type_lm = function(se = FALSE, level = 0.95, ...) {
     assert_flag(se)
-    out <- list(
+    out = list(
         draw = draw_ribbon(),
         data = data_lm(se = se, level = level),
         name = if (isTRUE(se)) "ribbon" else "l"
     )
-    class(out) <- "tinyplot_type"
+    class(out) = "tinyplot_type"
     return(out)
 }
 
diff --git a/R/type_loess.R b/R/type_loess.R
index a8395b25..491a97ec 100644
--- a/R/type_loess.R
+++ b/R/type_loess.R
@@ -8,12 +8,12 @@ type_loess = function(
     family = "gaussian",
     control = stats::loess.control(),
     ...) {
-    out <- list(
+    out = list(
         draw = draw_lines(),
         data = data_loess(span = span, degree = degree, family = family, control = control),
         name = "l"
     )
-    class(out) <- "tinyplot_type"
+    class(out) = "tinyplot_type"
     return(out)
 }
 
diff --git a/R/type_pointrange.R b/R/type_pointrange.R
index 533d5a51..0fc3bf27 100644
--- a/R/type_pointrange.R
+++ b/R/type_pointrange.R
@@ -1,16 +1,16 @@
 type_pointrange = function() {
-  out <- list(
+  out = list(
     draw = draw_pointrange(),
     data = data_pointrange(),
     name = "p"
   )
-  class(out) <- "tinyplot_type"
+  class(out) = "tinyplot_type"
   return(out)
 }
 
 
 
-draw_pointrange <- function() {
+draw_pointrange = function() {
     fun = function(ix, iy, ixmin, iymin, ixmax, iymax, icol, ibg, ipch, ilwd, cex, ...) {
         segments(
             x0 = ixmin,
diff --git a/R/type_points.R b/R/type_points.R
index c9da70fc..70232793 100644
--- a/R/type_points.R
+++ b/R/type_points.R
@@ -1,10 +1,10 @@
 type_points = function() {
-  out <- list(
+  out = list(
     draw = draw_points(),
     data = NULL,
     name = "p"
   )
-  class(out) <- "tinyplot_type"
+  class(out) = "tinyplot_type"
   return(out)
 }
 
diff --git a/R/type_polygon.R b/R/type_polygon.R
index 616f0bd0..b4918cb1 100644
--- a/R/type_polygon.R
+++ b/R/type_polygon.R
@@ -1,15 +1,15 @@
 type_polygon = function() {
-  out <- list(
+  out = list(
     draw = draw_polygon(),
     data = NULL,
     name = "polygon"
   )
-  class(out) <- "tinyplot_type"
+  class(out) = "tinyplot_type"
   return(out)
 }
 
 
-draw_polygon <- function() {
+draw_polygon = function() {
     fun = function(ix, iy, icol, ibg, ilty = par("lty"), ilwd = par("lwd"), ...) {
         polygon(
             x = ix,
diff --git a/R/type_polypath.R b/R/type_polypath.R
index cbbc8aa9..7e40f8fc 100644
--- a/R/type_polypath.R
+++ b/R/type_polypath.R
@@ -1,17 +1,17 @@
 type_polypath = function() {
-  out <- list(
+  out = list(
     draw = draw_polypath(),
     data = NULL,
     name = "polypath"
   )
-  class(out) <- "tinyplot_type"
+  class(out) = "tinyplot_type"
   return(out)
 }
 
 
-draw_polypath <- function() {
+draw_polypath = function() {
     fun =  function(ix, iy, icol, ibg, ilty, ilwd, dots, ...) {
-        irule <- ifelse(!is.null(dots[["rule"]]), dots[["rule"]], "winding")
+        irule = ifelse(!is.null(dots[["rule"]]), dots[["rule"]], "winding")
         polypath(
             x = ix,
             y = iy,
diff --git a/R/type_rect.R b/R/type_rect.R
index 5d2b848b..4db4d1d2 100644
--- a/R/type_rect.R
+++ b/R/type_rect.R
@@ -1,16 +1,16 @@
 type_rect = function() {
-  out <- list(
+  out = list(
     draw = draw_rect(),
     data = NULL,
     name = "rect"
   )
-  class(out) <- "tinyplot_type"
+  class(out) = "tinyplot_type"
   return(out)
 }
 
 
-draw_rect <- function() {
-    fun <- function(ixmin, iymin, ixmax, iymax, ilty, ilwd, icol, ibg, ...) {
+draw_rect = function() {
+    fun = function(ixmin, iymin, ixmax, iymax, ilty, ilwd, icol, ibg, ...) {
         rect(
             xleft = ixmin, ybottom = iymin, xright = ixmax, ytop = iymax,
             lty = ilty,
diff --git a/R/type_ribbon.R b/R/type_ribbon.R
index 6211f946..abe1630c 100644
--- a/R/type_ribbon.R
+++ b/R/type_ribbon.R
@@ -1,15 +1,15 @@
 type_ribbon = function() {
-  out <- list(
+  out = list(
     draw = draw_ribbon(),
     data = data_ribbon(),
     name = "ribbon"
   )
-  class(out) <- "tinyplot_type"
+  class(out) = "tinyplot_type"
   return(out)
 }
 
 
-draw_ribbon <- function() {
+draw_ribbon = function() {
     fun = function(ix, iy, ixmin, ixmax, iymin, iymax, ibg, ilty, ilwd, icol, ipch, i, flip = FALSE, ...) {
         polyg = type_polygon()$draw
         lin = type_lines()$draw
diff --git a/R/type_segments.R b/R/type_segments.R
index 6db3261b..c75624ee 100644
--- a/R/type_segments.R
+++ b/R/type_segments.R
@@ -1,16 +1,16 @@
 type_segments = function() {
-  out <- list(
+  out = list(
     draw = draw_segments(),
     data = NULL,
     name = "segments"
   )
-  class(out) <- "tinyplot_type"
+  class(out) = "tinyplot_type"
   return(out)
 }
 
 
-draw_segments <- function() {
-    fun <- function(ixmin, iymin, ixmax, iymax, ilty, ilwd, icol, ...) {
+draw_segments = function() {
+    fun = function(ixmin, iymin, ixmax, iymax, ilty, ilwd, icol, ...) {
         segments(
             x0 = ixmin, y0 = iymin, x1 = ixmax, y1 = iymax,
             lty = ilty,

From 0ef54bb379ff5e7d3403cf8c073101fd3d8df3bc Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sat, 5 Oct 2024 22:51:57 -0400
Subject: [PATCH 43/72] drop draw_elements

---
 R/draw_elements.R | 72 -----------------------------------------------
 R/tinyplot.R      | 61 ++++++++++++++++++++++++---------------
 2 files changed, 38 insertions(+), 95 deletions(-)
 delete mode 100644 R/draw_elements.R

diff --git a/R/draw_elements.R b/R/draw_elements.R
deleted file mode 100644
index 11645125..00000000
--- a/R/draw_elements.R
+++ /dev/null
@@ -1,72 +0,0 @@
-# Draw plot draw plot elements
-#
-# This function is called by `tinyplot()` to draw plot elements such as lines, polygons and points.
-#
-draw_elements = function(
-    type,
-    ix,
-    iy,
-    ixmin,
-    ixmax,
-    iymin,
-    iymax,
-    icol,
-    ilwd,
-    ipch,
-    ibg,
-    ilty,
-    i,
-    cex,
-    dots,
-    empty_plot,
-    facet_by,
-    split_data,
-    x_by = FALSE,
-    flip = FALSE,
-    draw_fun = NULL
-    ) {
-
-
-      ## polygons before lines, segments/arrows before points, etc.
-      if (isTRUE(empty_plot)) return(invisible())
-
-      if (is.null(draw_fun)) {
-        draw_fun = switch(
-          type,
-          "ribbon" = type_ribbon()$draw,
-          "polygon" = type_polygon()$draw,
-          "rect" = type_rect()$draw,
-          "p" = ,
-          "points" = type_points()$draw,
-          "l" = ,
-          "o" = ,
-          "b" = ,
-          "c" = ,
-          "h" = ,
-          "s" = ,
-          "S" = type_lines(type = type)$draw)
-      }
-      draw_fun(
-        ibg = ibg,
-        icol = icol,
-        ilty = ilty,
-        ilwd = ilwd,
-        ipch = ipch,
-        ix = ix,
-        ixmax = ixmax,
-        ixmin = ixmin,
-        iy = iy,
-        iymax = iymax,
-        iymin = iymin,
-        cex = cex,
-        dots = dots,
-        type = type,
-        x_by = x_by,
-        i = i,
-        facet_by = facet_by,
-        split_data = split_data,
-        flip = flip)
-
-}
-
-
diff --git a/R/tinyplot.R b/R/tinyplot.R
index 8de67af7..7f6be63d 100644
--- a/R/tinyplot.R
+++ b/R/tinyplot.R
@@ -1050,29 +1050,44 @@ tinyplot.default = function(
       }
 
       # Draw the individual plot elements...
-      draw_elements(
-        type = type,
-        i = i,
-        ix = ix,
-        iy = iy,
-        ixmin = ixmin,
-        ixmax = ixmax,
-        iymin = iymin,
-        iymax = iymax, 
-        icol = icol,
-        ilwd = ilwd,
-        ipch = ipch,
-        ibg = ibg,
-        ilty = ilty,
-        cex = cex,
-        dots = dots,
-        empty_plot = empty_plot,
-        facet_by = facet_by,
-        split_data = split_data,
-        x_by = x_by,
-        flip = flip,
-        draw_fun = type_draw
-      )
+      if (!isTRUE(empty_plot)) {
+        if (is.null(type_draw)) {
+            type_draw = switch(
+            type,
+            "ribbon" = type_ribbon()$draw,
+            "polygon" = type_polygon()$draw,
+            "rect" = type_rect()$draw,
+            "p" = ,
+            "points" = type_points()$draw,
+            "l" = ,
+            "o" = ,
+            "b" = ,
+            "c" = ,
+            "h" = ,
+            "s" = ,
+            "S" = type_lines(type = type)$draw)
+        }
+        type_draw(
+            ibg = ibg,
+            icol = icol,
+            ilty = ilty,
+            ilwd = ilwd,
+            ipch = ipch,
+            ix = ix,
+            ixmax = ixmax,
+            ixmin = ixmin,
+            iy = iy,
+            iymax = iymax,
+            iymin = iymin,
+            cex = cex,
+            dots = dots,
+            type = type,
+            x_by = x_by,
+            i = i,
+            facet_by = facet_by,
+            split_data = split_data,
+            flip = flip)
+      }
     }
   }
 

From 9d12ac04a233b793d1702454292b00909a7b32a4 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sun, 6 Oct 2024 07:40:27 -0400
Subject: [PATCH 44/72] docs

---
 Makefile                             |   3 +++
 R/type_glm.R                         |   2 +-
 R/type_lm.R                          |   2 +-
 R/type_loess.R                       |   3 +--
 man/figures/README-quickstart2-1.png | Bin 190441 -> 254803 bytes
 man/figures/README-quickstart3-1.png | Bin 127395 -> 235262 bytes
 man/figures/README-quickstart4-1.png | Bin 160797 -> 238410 bytes
 man/figures/README-quickstart5-1.png | Bin 208103 -> 263901 bytes
 man/type_glm.Rd                      |   9 +--------
 man/type_lm.Rd                       |   9 +--------
 man/type_loess.Rd                    |   6 +-----
 11 files changed, 9 insertions(+), 25 deletions(-)

diff --git a/Makefile b/Makefile
index a253676f..82bec2dd 100644
--- a/Makefile
+++ b/Makefile
@@ -16,6 +16,9 @@ document: ## altdoc::render_docs()
 check: document ## devtools::check()
 	R CMD check .
 
+website: website ## altdoc::render_docs()
+	Rscript -e "pkgload::load_all();altdoc::render_docs()"
+
 install: document ## devtools::install(dependencies = FALSE)
 	R CMD INSTALL .
 
diff --git a/R/type_glm.R b/R/type_glm.R
index 51448a45..e2c2964a 100644
--- a/R/type_glm.R
+++ b/R/type_glm.R
@@ -5,7 +5,7 @@
 #' @inheritParams stats::predict.glm
 #' @inheritParams stats::confint
 #' @export
-type_glm = function(family = "gaussian", se = FALSE, level = 0.95, type = "response", ...) {
+type_glm = function(family = "gaussian", se = FALSE, level = 0.95, type = "response") {
     assert_flag(se)
     out = list(
         draw = draw_ribbon(),
diff --git a/R/type_lm.R b/R/type_lm.R
index 5e8350d7..41ff6ff2 100644
--- a/R/type_lm.R
+++ b/R/type_lm.R
@@ -2,7 +2,7 @@
 #' 
 #' @inheritParams type_glm
 #' @export
-type_lm = function(se = FALSE, level = 0.95, ...) {
+type_lm = function(se = FALSE, level = 0.95) {
     assert_flag(se)
     out = list(
         draw = draw_ribbon(),
diff --git a/R/type_loess.R b/R/type_loess.R
index 491a97ec..bc094390 100644
--- a/R/type_loess.R
+++ b/R/type_loess.R
@@ -6,8 +6,7 @@ type_loess = function(
     span = 0.75,
     degree = 2,
     family = "gaussian",
-    control = stats::loess.control(),
-    ...) {
+    control = stats::loess.control()) {
     out = list(
         draw = draw_lines(),
         data = data_loess(span = span, degree = degree, family = family, control = control),
diff --git a/man/figures/README-quickstart2-1.png b/man/figures/README-quickstart2-1.png
index d91ee9eb73562431ac8f49bb62a5b219d9f5f150..524fdb3337ff467f7eea2802ccbc1e5056f74b30 100644
GIT binary patch
diff --git a/man/figures/README-quickstart3-1.png b/man/figures/README-quickstart3-1.png
index e4527d66d6bcc33e0b2a35263bce7999d7a5fe9e..be9edd7c1a5dd2c727f708fe8a65fb77cd0c19be 100644
GIT binary patch
diff --git a/man/figures/README-quickstart4-1.png b/man/figures/README-quickstart4-1.png
index 4d11bb2d8d86cb172b0ebcb70aeb5f9b257f67ad..a87ec6df4f1dceefd9709c23410f62189bf394b8 100644
GIT binary patch
diff --git a/man/figures/README-quickstart5-1.png b/man/figures/README-quickstart5-1.png
index ed53420d7216aa309bec0a5126eb891c4f3f7f2e..6c5b230ccc4e365140b7e7505129b9af99c10fc4 100644
GIT binary patch
diff --git a/man/type_glm.Rd b/man/type_glm.Rd
index 42f78475..0d0fa5af 100644
--- a/man/type_glm.Rd
+++ b/man/type_glm.Rd
@@ -4,7 +4,7 @@
 \alias{type_glm}
 \title{GLM type}
 \usage{
-type_glm(family = "gaussian", se = FALSE, level = 0.95, type = "response", ...)
+type_glm(family = "gaussian", se = FALSE, level = 0.95, type = "response")
 }
 \arguments{
 \item{family}{a description of the error distribution and link
@@ -20,13 +20,6 @@ type_glm(family = "gaussian", se = FALSE, level = 0.95, type = "response", ...)
 
 \item{type}{character, partial matching allowed.  Type of weights to
     extract from the fitted model object.  Can be abbreviated.}
-
-\item{...}{
-    For \code{glm}: arguments to be used to form the default
-    \code{control} argument if it is not supplied directly.
-
-    For \code{weights}: further arguments passed to or from other methods.
-  }
 }
 \description{
 GLM type
diff --git a/man/type_lm.Rd b/man/type_lm.Rd
index 6ecdd545..9ea8a1cb 100644
--- a/man/type_lm.Rd
+++ b/man/type_lm.Rd
@@ -4,19 +4,12 @@
 \alias{type_lm}
 \title{LM type}
 \usage{
-type_lm(se = FALSE, level = 0.95, ...)
+type_lm(se = FALSE, level = 0.95)
 }
 \arguments{
 \item{se}{logical. If TRUE, confidence intervals are drawn.}
 
 \item{level}{the confidence level required.}
-
-\item{...}{
-    For \code{glm}: arguments to be used to form the default
-    \code{control} argument if it is not supplied directly.
-
-    For \code{weights}: further arguments passed to or from other methods.
-  }
 }
 \description{
 LM type
diff --git a/man/type_loess.Rd b/man/type_loess.Rd
index 173a4d82..4f9c8991 100644
--- a/man/type_loess.Rd
+++ b/man/type_loess.Rd
@@ -8,8 +8,7 @@ type_loess(
   span = 0.75,
   degree = 2,
   family = "gaussian",
-  control = stats::loess.control(),
-  ...
+  control = stats::loess.control()
 )
 }
 \arguments{
@@ -24,9 +23,6 @@ type_loess(
     biweight function.  Can be abbreviated.}
 
 \item{control}{control parameters: see \code{\link[stats]{loess.control}}.}
-
-\item{...}{control parameters can also be supplied directly
-    (\emph{if} \code{control} is not specified).}
 }
 \description{
 LOESS type

From 7783ee82ae30606c4a2c3e2879ccd73df2eb392a Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sun, 6 Oct 2024 08:39:05 -0400
Subject: [PATCH 45/72] type vignette

---
 R/type_glm.R              |   4 +-
 R/type_lm.R               |   2 +-
 altdoc/quarto_website.yml |   2 +
 man/type_glm.Rd           |   2 +-
 man/type_lm.Rd            |   2 +-
 vignettes/type.qmd        | 176 ++++++++++++++++++++++++++++++++++++++
 6 files changed, 183 insertions(+), 5 deletions(-)
 create mode 100644 vignettes/type.qmd

diff --git a/R/type_glm.R b/R/type_glm.R
index e2c2964a..7c63816b 100644
--- a/R/type_glm.R
+++ b/R/type_glm.R
@@ -5,7 +5,7 @@
 #' @inheritParams stats::predict.glm
 #' @inheritParams stats::confint
 #' @export
-type_glm = function(family = "gaussian", se = FALSE, level = 0.95, type = "response") {
+type_glm = function(family = "gaussian", se = TRUE, level = 0.95, type = "response") {
     assert_flag(se)
     out = list(
         draw = draw_ribbon(),
@@ -38,7 +38,7 @@ data_glm = function(family, se, level, type, ...) {
                     nd = ci(nd$y, nd$se, level, fit$df.residual, backtransform = stats::family(fit)$linkinv)
                 }
             } else {
-                nd$y = stats::predict(fit, nd)
+                nd$y = stats::predict(fit, nd, type = type)
             }
             nd
         })
diff --git a/R/type_lm.R b/R/type_lm.R
index 41ff6ff2..2dbb6b53 100644
--- a/R/type_lm.R
+++ b/R/type_lm.R
@@ -2,7 +2,7 @@
 #' 
 #' @inheritParams type_glm
 #' @export
-type_lm = function(se = FALSE, level = 0.95) {
+type_lm = function(se = TRUE, level = 0.95) {
     assert_flag(se)
     out = list(
         draw = draw_ribbon(),
diff --git a/altdoc/quarto_website.yml b/altdoc/quarto_website.yml
index 3222787a..f47064a2 100644
--- a/altdoc/quarto_website.yml
+++ b/altdoc/quarto_website.yml
@@ -17,6 +17,8 @@ website:
         file: index.qmd
       - text: Tutorial
         file: vignettes/intro_tutorial.qmd
+      - text: Plot types
+        file: vignettes/type.qmd
       - text: Gallery
         file: vignettes/gallery.qmd
       - section: $ALTDOC_MAN_BLOCK
diff --git a/man/type_glm.Rd b/man/type_glm.Rd
index 0d0fa5af..59247e1f 100644
--- a/man/type_glm.Rd
+++ b/man/type_glm.Rd
@@ -4,7 +4,7 @@
 \alias{type_glm}
 \title{GLM type}
 \usage{
-type_glm(family = "gaussian", se = FALSE, level = 0.95, type = "response")
+type_glm(family = "gaussian", se = TRUE, level = 0.95, type = "response")
 }
 \arguments{
 \item{family}{a description of the error distribution and link
diff --git a/man/type_lm.Rd b/man/type_lm.Rd
index 9ea8a1cb..d21a0c7d 100644
--- a/man/type_lm.Rd
+++ b/man/type_lm.Rd
@@ -4,7 +4,7 @@
 \alias{type_lm}
 \title{LM type}
 \usage{
-type_lm(se = FALSE, level = 0.95)
+type_lm(se = TRUE, level = 0.95)
 }
 \arguments{
 \item{se}{logical. If TRUE, confidence intervals are drawn.}
diff --git a/vignettes/type.qmd b/vignettes/type.qmd
new file mode 100644
index 00000000..543db173
--- /dev/null
+++ b/vignettes/type.qmd
@@ -0,0 +1,176 @@
+---
+title: "Plot types"
+---
+
+`tinyplot` is a lightweight extension of R's base plotting system, designed to simplify and enhance data visualization. One of its key features is the `type` argument, which allows you to specify different types of plots easily. This tutorial will guide you through the various plot types available in `tinyplot`, demonstrating how to use the `type` argument to create a wide range of visualizations.
+
+We will consider three categories of plot types:
+
+1. Base types
+2. `tinyplot` types
+3. Custom types
+
+We will use the built-in `airquality` dataset for our examples:
+
+```{r}
+library(tinyplot)
+
+aq = transform(
+  airquality,
+  Month = factor(Month, labels = month.abb[unique(Month)]),
+  Hot = Temp > median(Temp)
+)
+```
+
+# Base types
+
+The `type` argument in `tinyplot` supports all the standard plot types from base R's `plot` function. These are specified using single-character strings.
+
+The default plot type is `"p"`, which creates a scatter plot of points.
+
+```{r}
+plt(Temp ~ Day | Month, data = aq, type = "p", main = "Points")
+```
+
+Use `"l"` to connect data points with lines.
+
+```{r}
+plt(Temp ~ Day | Month, data = aq, type = "l", main = "Lines")
+```
+
+* `b` (Points and Lines): Combines points and lines in the plot.
+* `c` (Empty Points Joined by Lines): Plots empty points connected by lines.
+* `o` (Overplotted Points and Lines): Overlaps points and lines.
+* `s` and `S` (Stair Steps): Creates a step plot.
+* `h` (Histogram-like Vertical Lines): Plots vertical lines resembling a histogram.
+* `n` (Empty Plot): Creates an empty plot frame without data.
+
+# `tinyplot` types
+
+Beyond the base types, `tinyplot` introduces additional plot types for more advanced visualizations. 
+
+Models:
+
+- `loess`, `type_loess()`: Local regression curve.
+- `lm`, `type_lm()`: Linear regression line.
+- `glm`, `type_glm()`: Generalized linear model fit.
+
+Shapes:
+
+- `segments`: Draws line segments between pairs of points.
+- `polygon`: Draws filled polygons.
+- `errorbar`: Adds error bars to points; requires ymin and ymax.
+- `pointrange`: Combines points with error bars.
+- `ribbon`: Creates a filled area between ymin and ymax.
+- `area`: Plots the area under the curve from y = 0 to y = f(x).
+- `rect`: Draws rectangles; requires `xmin`, `xmax`, `ymin`, and `ymax`.
+
+Visualizations:
+
+- `jitter`, `type_jitter()`: Jittered points.
+- `boxplot`, `type_boxplot()`: Creates a box-and-whisker plot.
+- `histogram`: Creates a histogram of a single variable.
+- `density`: Plots the density estimate of a variable.
+
+There are two main ways to use `tinyplot` types. First, we can specify the type directly using a string shortcut in the `type` argument, such as `type="boxplot"`. For example, to create a box plot, use `type = "boxplot"`. 
+
+Second, many `tinyplot` types are implemented by a `type_*()` function which includes arguments that allow us to customize the plot further. For example, the `type_jitter()` function includes arguments to control the amount of jittering, and the `type_glm()` includes an argument to control the width of the confidence interval to display. To see what arguments are available for each type, simply consult the type-specific documentation:
+
+```r
+?type_jitter
+?type_glm
+```
+
+For example, we can add noise to data points using the `"jitter"` type. This allows us to avoid overplotting and can be useful to visualize discrete variables. On the left, we use the string shortcut with default settings. On the right, we use the `type_jitter()` function to select a smaller amount of jittering:
+
+```{r}
+#| layout-ncol: 2
+plt(Temp ~ Month, data = aq, main = "Default jittering", 
+    type = "jitter")
+
+plt(Temp ~ Month, data = aq, main = "Modest jittering",
+    type = type_jitter(amount = 0.05))
+```
+
+In this example, we use `type_glm()` to fit a logit regression model to the data, and display different confidence interval sizes:
+
+```{r}
+#| layout-ncol: 2
+plt(Hot ~ Wind, data = aq, main = "Logit with 95% interval",
+    type = type_glm(family = "binomial"))
+
+plt(Hot ~ Wind, data = aq, main = "Logit with 50% interval",
+    type = type_glm(family = "binomial", level = 0.5))
+```
+
+Most `tinyplot` types support grouping and faceting:
+
+```{r}
+plt(Temp ~ Wind | Month, data = aq, type = type_lm(se = FALSE))
+```
+
+# Custom types
+
+It is easy to add custom types to `tinyplot`. To do this, we need to define 3 functions:
+
+1. `data_*()`: Function factory.
+    - Accepts a list of internal objects
+        - Inputs must include `...`
+        - `datapoints` Is the most important object. It is a data frame with the datapoints to plot. 
+        - Other objects that can be modified by `data_*()` include: `by`, `facet`, `ylab`, `palette`
+    - Returns a named list with modified versions of those objects.
+2. `draw_*()`: Function factory.
+    - Accepts information about data point values and aesthetics. 
+        - Inputs must include `...`
+        - The `i` prefix in argument names indicates that we are operating on a subgroup of the data, identified by `facet` or using the `|` operator in a formula.
+        - Available arguments are: "ibg", "icol", "ilty", "ilwd", "ipch", "ix", "ixmax", "ixmin", "iy", "iymax", "iymin", "cex", "dots", "type", "x_by", "i", "facet_by", "split_data", "flip"
+    - Returns a function which can call base R to draw the plot.
+3. `type_*()`: A wrapper function that returns a named list with three elements:
+    - `draw`
+    - `data`
+    - `name`
+
+Here is a minimalist example of a custom type that logs both `x` and `y` and plots lines:
+
+```{r}
+type_log = function(base = exp(1)) {
+  out = list(
+    draw = draw_log(),
+    data = data_log(base = base),
+    name = "log"
+  )
+  class(out) = "tinyplot_type"
+  return(out)
+}
+
+data_log = function(base) {
+    fun = function(datapoints, ...) {
+        datapoints$x = log(datapoints$x, base = base)
+        datapoints$y = log(datapoints$y, base = base)
+        datapoints = datapoints[order(datapoints$x), ]
+        return(list(datapoints = datapoints, ...))
+    }
+    return(fun)
+}
+
+draw_log = function() {
+    fun = function(ix, iy, icol, ...) {
+        points(
+            x = ix,
+            y = iy,
+            col = icol
+        )
+    }
+    return(fun)
+}
+
+plt(mpg ~ wt | factor(am), data = mtcars,
+    type = "p", main = "Raw")
+
+plt(mpg ~ wt | factor(am), data = mtcars,
+    type = type_log(), main = "Ln")
+
+plt(mpg ~ wt | factor(am), data = mtcars,
+    type = type_log(base = 10), main = "Log 10")
+```
+

From 5ae1dbfd1f0a931841e5bc36bc0f2df04d0b1f5e Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Sun, 6 Oct 2024 15:38:58 -0400
Subject: [PATCH 46/72] type lexical scoping

---
 vignettes/type.qmd | 47 +++++++++++++++++++++++-----------------------
 1 file changed, 24 insertions(+), 23 deletions(-)

diff --git a/vignettes/type.qmd b/vignettes/type.qmd
index 543db173..f7b8b92c 100644
--- a/vignettes/type.qmd
+++ b/vignettes/type.qmd
@@ -134,43 +134,44 @@ Here is a minimalist example of a custom type that logs both `x` and `y` and plo
 
 ```{r}
 type_log = function(base = exp(1)) {
-  out = list(
-    draw = draw_log(),
-    data = data_log(base = base),
-    name = "log"
-  )
-  class(out) = "tinyplot_type"
-  return(out)
-}
 
-data_log = function(base) {
+  data_log = function() {
     fun = function(datapoints, ...) {
-        datapoints$x = log(datapoints$x, base = base)
-        datapoints$y = log(datapoints$y, base = base)
-        datapoints = datapoints[order(datapoints$x), ]
-        return(list(datapoints = datapoints, ...))
+      datapoints$x = log(datapoints$x, base = base)
+      datapoints$y = log(datapoints$y, base = base)
+      datapoints = datapoints[order(datapoints$x), ]
+      return(list(datapoints = datapoints, ...))
     }
     return(fun)
-}
+  }
 
-draw_log = function() {
+  draw_log = function() {
     fun = function(ix, iy, icol, ...) {
-        points(
-            x = ix,
-            y = iy,
-            col = icol
-        )
+      points(
+        x = ix,
+        y = iy,
+        col = icol
+      )
     }
     return(fun)
+  }
+
+  out = list(
+    draw = draw_log(),
+    data = data_log(),
+    name = "log"
+  )
+  class(out) = "tinyplot_type"
+  return(out)
 }
 
 plt(mpg ~ wt | factor(am), data = mtcars,
-    type = "p", main = "Raw")
+  type = "p", main = "Raw")
 
 plt(mpg ~ wt | factor(am), data = mtcars,
-    type = type_log(), main = "Ln")
+  type = type_log(), main = "Ln")
 
 plt(mpg ~ wt | factor(am), data = mtcars,
-    type = type_log(base = 10), main = "Log 10")
+  type = type_log(base = 10), main = "Log 10")
 ```
 

From d19bff3d55c520cd251f8130aafc1d842baa1765 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Mon, 7 Oct 2024 11:41:21 -0400
Subject: [PATCH 47/72] type_data gets xlim/xaxt/ylim/yaxt arguments

---
 R/tinyplot.R | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/R/tinyplot.R b/R/tinyplot.R
index 7f6be63d..b055b1a8 100644
--- a/R/tinyplot.R
+++ b/R/tinyplot.R
@@ -668,15 +668,19 @@ tinyplot.default = function(
 
   if (!is.null(type_data)) {
     fargs = list(
+      datapoints = datapoints,
+      bg = bg,
       by = by,
-      facet = facet,
-      ylab = ylab,
       col = col,
-      bg = bg,
+      facet = facet,
       palette = palette,
       ribbon.alpha = ribbon.alpha,
+      xaxt = xaxt,
       xlabs = xlabs,
-      datapoints = datapoints)
+      xlim = xlim,
+      yaxt = yaxt,
+      ylab = ylab,
+      ylim = ylim)
     fargs = c(fargs, dots)
     list2env(do.call(type_data, fargs), environment())
   }

From 9c941064e3ce945019f10b21357287d9fb189550 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Mon, 7 Oct 2024 16:09:48 -0400
Subject: [PATCH 48/72] fixup

---
 R/tinyplot.R | 10 ++--------
 1 file changed, 2 insertions(+), 8 deletions(-)

diff --git a/R/tinyplot.R b/R/tinyplot.R
index d5afb564..943db3ef 100644
--- a/R/tinyplot.R
+++ b/R/tinyplot.R
@@ -726,11 +726,6 @@ tinyplot.default = function(
       rm(xlim_cp, xlab_cp, xlabs_cp, xaxt_cp, x_cp, xmin_cp, xmax_cp) 
     } else {
       dots[["horizontal"]] = TRUE
-    }
-  }
-
-
-
       # We'll let boxplot(..., horizontal = TRUE) handle most of the adjustments
       # and just catch a few elements that we draw beforehand.
       xlab_cp = xlab
@@ -739,9 +734,8 @@ tinyplot.default = function(
       rm(xlab_cp)
     }
   }
-  
-  
-  
+
+
   # plot limits
   fargs = lim_args(datapoints = datapoints, xlim = xlim, ylim = ylim, type = type)
   list2env(fargs, environment())

From 9fb412afccbefb0c3c7ddb20fd724db8ffecd69e Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Mon, 7 Oct 2024 16:13:31 -0400
Subject: [PATCH 49/72] cruft

---
 R/draw_elements.R | 178 ----------------------------------------------
 1 file changed, 178 deletions(-)
 delete mode 100644 R/draw_elements.R

diff --git a/R/draw_elements.R b/R/draw_elements.R
deleted file mode 100644
index 2495b947..00000000
--- a/R/draw_elements.R
+++ /dev/null
@@ -1,178 +0,0 @@
-# Draw plot draw plot elements
-#
-# This function is called by `tinyplot()` to draw plot elements such as lines, polygons and points.
-#
-draw_elements = function(
-    type,
-    xx,
-    yy,
-    xxmin,
-    xxmax,
-    yymin,
-    yymax,
-    bg,
-    icol,
-    ilwd,
-    ipch,
-    ibg,
-    ilty,
-    cex,
-    dots,
-    empty_plot,
-    facet_by,
-    split_data,
-    i = 1,
-    x_by = FALSE,
-    flip = FALSE
-    ) {
-
-      ## polygons before lines, segments/arrows before points, etc.
-      if (isTRUE(empty_plot)) {
-
-      } else if (type == "ribbon") {
-        if (isFALSE(flip)) {
-          polygon(
-            x = c(xx, rev(xx)),
-            y = c(yymin, rev(yymax)),
-            col = bg[i],
-            border = FALSE
-          )
-        } else {
-          polygon(
-            x = c(xxmin, rev(xxmax)),
-            y = c(yy, rev(yy)),
-            col = bg[i],
-            border = FALSE
-          )
-          
-        }
-        
-      } else if (type == "pointrange") {
-        segments(
-          x0 = xxmin,
-          y0 = yymin,
-          x1 = xxmax,
-          y1 = yymax,
-          col = icol,
-          # lty = ilty,
-          lwd = ilwd
-        )
-      } else if (type == "errorbar") {
-        arrows(
-          x0 = xxmin,
-          y0 = yymin,
-          x1 = xxmax,
-          y1 = yymax,
-          col = icol,
-          # lty = ilty,
-          lwd = ilwd,
-          length = 0.05,
-          angle = 90,
-          code = 3
-        )
-      }
-
-      ## now draw the points/lines/polygons/etc
-      if (isTRUE(empty_plot)) {
-        # empty plot
-      } else if (type %in% c("p", "pointrange", "errorbar")) {
-        points(
-          x = xx,
-          y = yy,
-          col = icol,
-          bg = ibg,
-          ## rather hardcode "p" to avoid warning message about "pointrange"
-          type = "p",
-          pch = ipch,
-          # lty = ilty,
-          lwd = ilwd,
-          cex = cex
-        )
-      } else if (type %in% c("l", "o", "b", "c", "h", "s", "S", "ribbon")) {
-        rtype = type == "ribbon"
-        if (rtype) type = "l"
-        lines(
-          x = xx,
-          y = yy,
-          col = icol,
-          type = type,
-          pch = ipch,
-          lty = ilty,
-          lwd = ilwd
-        )
-        if (rtype) type = "ribbon"
-      } else if (type == "polygon") {
-        polygon(
-          x = xx,
-          y = yy,
-          border = icol,
-          col = ibg,
-          lty = ilty,
-          lwd = ilwd
-        )
-      } else if (type == "polypath") {
-        irule = ifelse(!is.null(dots[["rule"]]), dots[["rule"]], "winding")
-        polypath(
-          x = xx,
-          y = yy,
-          border = icol,
-          col = ibg,
-          lty = ilty,
-          lwd = ilwd,
-          rule = irule
-        )
-      } else if (type == "boxplot") {
-        at_xx = unique(xx)
-        horizontal = flip
-        range_xx = ifelse(!is.null(dots[["range"]]), dots[["range"]], 1.5)
-        boxwidth_xx = NULL
-        if (!is.null(dots[["boxwidth"]])) boxwidth_xx = dots[["boxwidth"]]
-        varwidth_xx = ifelse(!is.null(dots[["varwidth"]]), dots[["varwidth"]], FALSE)
-        notch_xx = ifelse(!is.null(dots[["notch"]]), dots[["notch"]], FALSE)
-        outline_xx = ifelse(!is.null(dots[["outline"]]), dots[["outline"]], TRUE)
-        boxwex_xx = ifelse(!is.null(dots[["boxwex"]]), dots[["boxwex"]], 0.8)
-        if (isTRUE(x_by)) boxwex_xx = boxwex_xx * 2
-        staplewex_xx = ifelse(!is.null(dots[["staplewex"]]), dots[["staplewex"]], 0.5)
-        outwex_xx = ifelse(!is.null(dots[["outwex"]]), dots[["outwex"]], 0.5)
-        if (!is.null(by) && isFALSE(x_by) && isFALSE(facet_by) && length(split_data) > 1) {
-          boxwex_xx_orig = boxwex_xx
-          boxwex_xx = boxwex_xx / length(split_data) - 0.01
-          at_xx = at_xx + seq(-((boxwex_xx_orig - boxwex_xx) / 2), ((boxwex_xx_orig - boxwex_xx) / 2), length.out = length(split_data))[i]
-        }
-        boxplot(
-          formula = yy ~ xx,
-          pch = ipch,
-          lty = ilty,
-          border = icol,
-          col = ibg,
-          add = TRUE, axes = FALSE,
-          horizontal = horizontal,
-          at = at_xx,
-          range = range_xx,
-          width = boxwidth_xx,
-          varwidth = varwidth_xx,
-          notch = notch_xx,
-          outline = outline_xx,
-          boxwex = boxwex_xx,
-          staplewex = staplewex_xx,
-          outwex = outwex_xx
-        )
-      } else if (type == "rect") {
-        rect(
-          xleft = xxmin, ybottom = yymin, xright = xxmax, ytop = yymax,
-          lty = ilty,
-          lwd = ilwd,
-          border = icol,
-          col = ibg
-        )
-      } else if (type == "segments") {
-        segments(
-          x0 = xxmin, y0 = yymin, x1 = xxmax, y1 = yymax,
-          lty = ilty,
-          lwd = ilwd,
-          col = icol
-        )
-      } else {
-        stop("`type` argument not supported.", call. = FALSE)
-      }
-}

From 56095a8b34043c4be40d04ad21f5e3c26c1a7f1f Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Mon, 7 Oct 2024 17:03:47 -0400
Subject: [PATCH 50/72] type_draw has access to facet splits

---
 R/tinyplot.R       |  6 ++++--
 R/type_boxplot.R   | 10 +++++-----
 vignettes/type.qmd |  4 ++--
 3 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/R/tinyplot.R b/R/tinyplot.R
index 943db3ef..19f828bd 100644
--- a/R/tinyplot.R
+++ b/R/tinyplot.R
@@ -1097,9 +1097,11 @@ tinyplot.default = function(
             dots = dots,
             type = type,
             x_by = x_by,
-            i = i,
+            iby = i,
+            ifacet = ii,
             facet_by = facet_by,
-            split_data = split_data,
+            data_facet = idata,
+            data_by = split_data,
             flip = flip)
       }
     }
diff --git a/R/type_boxplot.R b/R/type_boxplot.R
index afe9aa34..3086277d 100644
--- a/R/type_boxplot.R
+++ b/R/type_boxplot.R
@@ -31,21 +31,21 @@ type_boxplot = function(
 
 
 draw_boxplot = function(range, width, varwidth, notch, outline, boxwex, staplewex, outwex) {
-    fun = function(i, ix, iy, ipch, ilty, icol, ibg, dots, x_by = FALSE, facet_by = FALSE, split_data, ...) {
+    fun = function(iby, ix, iy, ipch, ilty, icol, ibg, dots, x_by = FALSE, facet_by = FALSE, data_by, ...) {
 
         at_ix = unique(ix)
         horizontal = if (!is.null(dots[["horizontal"]])) dots[["horizontal"]] else FALSE
         if (isTRUE(x_by)) boxwex = boxwex * 2
 
         # Handle multiple groups
-        if (!is.null(split_data) && isFALSE(x_by) && isFALSE(facet_by) && length(split_data) > 1) {
+        if (!is.null(data_by) && isFALSE(x_by) && isFALSE(facet_by) && length(data_by) > 1) {
             boxwex_orig = boxwex
-            boxwex = boxwex / length(split_data) - 0.01
+            boxwex = boxwex / length(data_by) - 0.01
             at_ix = at_ix + seq(
                 -((boxwex_orig - boxwex) / 2),
                 ((boxwex_orig - boxwex) / 2),
-                length.out = length(split_data)
-            )[i]
+                length.out = length(data_by)
+            )[iby]
         }
 
         boxplot(
diff --git a/vignettes/type.qmd b/vignettes/type.qmd
index f7b8b92c..a12c0e26 100644
--- a/vignettes/type.qmd
+++ b/vignettes/type.qmd
@@ -72,7 +72,7 @@ Visualizations:
 - `histogram`: Creates a histogram of a single variable.
 - `density`: Plots the density estimate of a variable.
 
-There are two main ways to use `tinyplot` types. First, we can specify the type directly using a string shortcut in the `type` argument, such as `type="boxplot"`. For example, to create a box plot, use `type = "boxplot"`. 
+There are two main ways to use `tinyplot` types. First, we can specify the type directly using a string shortcut in the `type` argument, such as `type="boxplot"`.
 
 Second, many `tinyplot` types are implemented by a `type_*()` function which includes arguments that allow us to customize the plot further. For example, the `type_jitter()` function includes arguments to control the amount of jittering, and the `type_glm()` includes an argument to control the width of the confidence interval to display. To see what arguments are available for each type, simply consult the type-specific documentation:
 
@@ -123,7 +123,7 @@ It is easy to add custom types to `tinyplot`. To do this, we need to define 3 fu
     - Accepts information about data point values and aesthetics. 
         - Inputs must include `...`
         - The `i` prefix in argument names indicates that we are operating on a subgroup of the data, identified by `facet` or using the `|` operator in a formula.
-        - Available arguments are: "ibg", "icol", "ilty", "ilwd", "ipch", "ix", "ixmax", "ixmin", "iy", "iymax", "iymin", "cex", "dots", "type", "x_by", "i", "facet_by", "split_data", "flip"
+        - Available arguments are: `ibg`, `icol`, `ilty`, `ilwd`, `ipch`, `ix`, `ixmax`, `ixmin`, `iy`, `iymax`, `iymin`, `cex`, `dots`, `type`, `x_by`, `i`, `facet_by`, `by_data`, `facet_data`, `flip`
     - Returns a function which can call base R to draw the plot.
 3. `type_*()`: A wrapper function that returns a named list with three elements:
     - `draw`

From 4c4a5aa426e9ad7e0b96281e1d743431d6fcd51a Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Mon, 7 Oct 2024 19:22:30 -0400
Subject: [PATCH 51/72] :: -> @importFrom

---
 NAMESPACE         |  6 ++++++
 R/type_glm.R      | 15 ++++++++-------
 R/type_lm.R       |  7 ++++---
 R/type_loess.R    |  7 ++++---
 man/type_loess.Rd |  2 +-
 5 files changed, 23 insertions(+), 14 deletions(-)

diff --git a/NAMESPACE b/NAMESPACE
index 5a0c3c1a..081e63d4 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -59,8 +59,14 @@ importFrom(graphics,title)
 importFrom(methods,as)
 importFrom(stats,as.formula)
 importFrom(stats,density)
+importFrom(stats,family)
+importFrom(stats,glm)
+importFrom(stats,lm)
+importFrom(stats,loess)
+importFrom(stats,loess.control)
 importFrom(stats,model.frame)
 importFrom(stats,na.omit)
+importFrom(stats,predict)
 importFrom(stats,terms)
 importFrom(stats,update)
 importFrom(tools,file_ext)
diff --git a/R/type_glm.R b/R/type_glm.R
index 7c63816b..95ed9db5 100644
--- a/R/type_glm.R
+++ b/R/type_glm.R
@@ -4,6 +4,7 @@
 #' @inheritParams stats::glm
 #' @inheritParams stats::predict.glm
 #' @inheritParams stats::confint
+#' @importFrom stats glm predict family
 #' @export
 type_glm = function(family = "gaussian", se = TRUE, level = 0.95, type = "response") {
     assert_flag(se)
@@ -21,24 +22,24 @@ data_glm = function(family, se, level, type, ...) {
     fun = function(datapoints, ...) {
         dat = split(datapoints, list(datapoints$facet, datapoints$by))
         dat = lapply(dat, function(x) {
-            fit = stats::glm(y ~ x, data = x, family = family)
+            fit = glm(y ~ x, data = x, family = family)
             nd = data.frame(x = seq(min(x$x), max(x$x), length.out = 100))
             nd$by = x$by[1]
             nd$facet = x$facet[1]
             if (se == TRUE) {
                 if (identical(type, "response")) {
-                    p = stats::predict(fit, newdata = nd, type = "link", se.fit = TRUE)
-                    p = ci(p$fit, p$se.fit, conf.level = level, fit$df.residual, backtransform = stats::family(fit)$linkinv)
+                    p = predict(fit, newdata = nd, type = "link", se.fit = TRUE)
+                    p = ci(p$fit, p$se.fit, conf.level = level, fit$df.residual, backtransform = family(fit)$linkinv)
                     nd$y = p$estimate
                     nd$ymax = p$conf.high
                     nd$ymin = p$conf.low
 
                 } else {
-                    nd$y = stats::predict(fit, newdata = nd, type = type)
-                    nd = ci(nd$y, nd$se, level, fit$df.residual, backtransform = stats::family(fit)$linkinv)
+                    nd$y = predict(fit, newdata = nd, type = type)
+                    nd = ci(nd$y, nd$se, level, fit$df.residual, backtransform = family(fit)$linkinv)
                 }
             } else {
-                nd$y = stats::predict(fit, nd, type = type)
+                nd$y = predict(fit, nd, type = type)
             }
             nd
         })
@@ -52,7 +53,7 @@ data_glm = function(family, se, level, type, ...) {
 
 
 ci = function(estimate, std.error, conf.level, df, backtransform = identity) {
-    crit = stats::qt(1 - (1 - conf.level) / 2, df)
+    crit = qt(1 - (1 - conf.level) / 2, df)
     out = list(
         estimate = backtransform(estimate),
         conf.low = backtransform(estimate - crit * std.error),
diff --git a/R/type_lm.R b/R/type_lm.R
index 2dbb6b53..353c95d9 100644
--- a/R/type_lm.R
+++ b/R/type_lm.R
@@ -1,6 +1,7 @@
 #' LM type
 #' 
 #' @inheritParams type_glm
+#' @importFrom stats lm predict
 #' @export
 type_lm = function(se = TRUE, level = 0.95) {
     assert_flag(se)
@@ -18,18 +19,18 @@ data_lm = function(se, level, ...) {
     fun = function(datapoints, ...) {
         dat = split(datapoints, list(datapoints$facet, datapoints$by))
         dat = lapply(dat, function(x) {
-            fit = stats::lm(y ~ x, data = x)
+            fit = lm(y ~ x, data = x)
             nd = data.frame(x = seq(min(x$x), max(x$x), length.out = 100))
             nd$by = x$by[1]
             nd$facet = x$facet[1]
             if (se == TRUE) {
-                p = stats::predict(fit, newdata = nd, se.fit = TRUE)
+                p = predict(fit, newdata = nd, se.fit = TRUE)
                 p = ci(p$fit, p$se.fit, conf.level = level, fit$df.residual)
                 nd$y = p$estimate
                 nd$ymax = p$conf.high
                 nd$ymin = p$conf.low
             } else {
-                nd$y = stats::predict(fit, nd)
+                nd$y = predict(fit, nd)
             }
             nd
         })
diff --git a/R/type_loess.R b/R/type_loess.R
index bc094390..9166620c 100644
--- a/R/type_loess.R
+++ b/R/type_loess.R
@@ -1,12 +1,13 @@
 #' LOESS type
 #' 
 #' @inheritParams stats::loess
+#' @importFrom stats loess loess.control predict
 #' @export
 type_loess = function(
     span = 0.75,
     degree = 2,
     family = "gaussian",
-    control = stats::loess.control()) {
+    control = loess.control()) {
     out = list(
         draw = draw_lines(),
         data = data_loess(span = span, degree = degree, family = family, control = control),
@@ -21,8 +22,8 @@ data_loess = function(span, degree, family, control, ...) {
     fun = function(datapoints, ...) {
         dat = split(datapoints, list(datapoints$facet, datapoints$by))
         dat = lapply(dat, function(x) {
-            fit = stats::loess(y ~ x, data = x, span = span, degree = degree, family = family, control = control)
-            x$y = stats::predict(fit, x)
+            fit = loess(y ~ x, data = x, span = span, degree = degree, family = family, control = control)
+            x$y = predict(fit, x)
             x
         })
         datapoints = do.call(rbind, dat)
diff --git a/man/type_loess.Rd b/man/type_loess.Rd
index 4f9c8991..cf1d67c5 100644
--- a/man/type_loess.Rd
+++ b/man/type_loess.Rd
@@ -8,7 +8,7 @@ type_loess(
   span = 0.75,
   degree = 2,
   family = "gaussian",
-  control = stats::loess.control()
+  control = loess.control()
 )
 }
 \arguments{

From 1e911d12dbca7b87b4df09477957aab07de8a596 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Mon, 7 Oct 2024 19:32:11 -0400
Subject: [PATCH 52/72] type_polypath(rule) argument

---
 R/type_polypath.R            | 47 ++++++++++++++++++------------------
 inst/tinytest/test-polygon.R | 15 ++++--------
 2 files changed, 28 insertions(+), 34 deletions(-)

diff --git a/R/type_polypath.R b/R/type_polypath.R
index 7e40f8fc..0e502618 100644
--- a/R/type_polypath.R
+++ b/R/type_polypath.R
@@ -1,26 +1,25 @@
-type_polypath = function() {
-  out = list(
-    draw = draw_polypath(),
-    data = NULL,
-    name = "polypath"
-  )
-  class(out) = "tinyplot_type"
-  return(out)
-}
-
-
-draw_polypath = function() {
-    fun =  function(ix, iy, icol, ibg, ilty, ilwd, dots, ...) {
-        irule = ifelse(!is.null(dots[["rule"]]), dots[["rule"]], "winding")
-        polypath(
-            x = ix,
-            y = iy,
-            border = icol,
-            col = ibg,
-            lty = ilty,
-            lwd = ilwd,
-            rule = irule
-        )
+type_polypath = function(rule = "winding") {
+    draw_polypath = function() {
+        fun =  function(ix, iy, icol, ibg, ilty, ilwd, dots, ...) {
+            polypath(
+                x = ix,
+                y = iy,
+                border = icol,
+                col = ibg,
+                lty = ilty,
+                lwd = ilwd,
+                rule = rule
+            )
+        }
+        return(fun)
     }
-    return(fun)
+
+    out = list(
+        draw = draw_polypath(),
+        data = NULL,
+        name = "polypath"
+    )
+    class(out) = "tinyplot_type"
+    return(out)
 }
+
diff --git a/inst/tinytest/test-polygon.R b/inst/tinytest/test-polygon.R
index 728bb97a..06bf60a8 100644
--- a/inst/tinytest/test-polygon.R
+++ b/inst/tinytest/test-polygon.R
@@ -27,8 +27,7 @@ for (rrule in c("winding", "evenodd")) {
       c(.1, .1, .9, .9, NA, .2, .2, .8, .8),
       c(.1, .9, .9, .1, NA, .2, .8, .8, .2),
       main = "Nested rectangles, both clockwise",
-      type = "polypath",
-      rule = rrule,
+      type = type_polypath(rule = rrule),
       fill = "grey",
       axes = FALSE, xlab = NA, ylab = NA
     )
@@ -41,8 +40,7 @@ for (rrule in c("winding", "evenodd")) {
       c(.1, .1, .9, .9, NA, .2, .8, .8, .2),
       c(.1, .9, .9, .1, NA, .2, .2, .8, .8),
       main = "Nested rectangles, outer clockwise, inner anti-clockwise",
-      type = "polypath",
-      rule = rrule,
+      type = type_polypath(rule = rrule),
       fill = "grey",
       axes = FALSE, xlab = NA, ylab = NA
     )
@@ -55,8 +53,7 @@ for (rrule in c("winding", "evenodd")) {
       c(.1, .1, .4, .4, NA, .6, .9, .9, .6),
       c(.1, .4, .4, .1, NA, .6, .6, .9, .9),
       main = "Disjoint rectangles",
-      type = "polypath",
-      rule = rrule,
+      type = type_polypath(rule = rrule),
       fill = "grey",
       axes = FALSE, xlab = NA, ylab = NA
     )
@@ -69,8 +66,7 @@ for (rrule in c("winding", "evenodd")) {
       c(.1, .1, .6, .6, NA, .4, .4, .9, .9),
       c(.1, .6, .6, .1, NA, .4, .9, .9, .4),
       main = "Overlapping rectangles, both clockwise",
-      type = "polypath",
-      rule = rrule,
+      type = type_polypath(rule = rrule),
       fill = "grey",
       axes = FALSE, xlab = NA, ylab = NA
     )
@@ -83,8 +79,7 @@ for (rrule in c("winding", "evenodd")) {
       c(.1, .1, .6, .6, NA, .4, .9, .9, .4),
       c(.1, .6, .6, .1, NA, .4, .4, .9, .9),
       main = "Overlapping rectangles, one clockwise, other anti-clockwise",
-      type = "polypath",
-      rule = rrule,
+      type = type_polypath(rule = rrule),
       fill = "grey",
       axes = FALSE, xlab = NA, ylab = NA
     )

From a55af018d95f3bb8ed80fcb57b1ff3b2c2abfbb5 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Mon, 7 Oct 2024 19:47:34 -0400
Subject: [PATCH 53/72] vignettes + type_glm namespace fix

---
 R/type_glm.R                 |  6 +++---
 vignettes/intro_tutorial.qmd | 31 ++++++++++---------------------
 vignettes/type.qmd           | 26 +++++++++++++++-----------
 3 files changed, 28 insertions(+), 35 deletions(-)

diff --git a/R/type_glm.R b/R/type_glm.R
index 95ed9db5..af45a0cc 100644
--- a/R/type_glm.R
+++ b/R/type_glm.R
@@ -4,7 +4,7 @@
 #' @inheritParams stats::glm
 #' @inheritParams stats::predict.glm
 #' @inheritParams stats::confint
-#' @importFrom stats glm predict family
+#' @importFrom stats glm predict
 #' @export
 type_glm = function(family = "gaussian", se = TRUE, level = 0.95, type = "response") {
     assert_flag(se)
@@ -29,14 +29,14 @@ data_glm = function(family, se, level, type, ...) {
             if (se == TRUE) {
                 if (identical(type, "response")) {
                     p = predict(fit, newdata = nd, type = "link", se.fit = TRUE)
-                    p = ci(p$fit, p$se.fit, conf.level = level, fit$df.residual, backtransform = family(fit)$linkinv)
+                    p = ci(p$fit, p$se.fit, conf.level = level, fit$df.residual, backtransform = stats::family(fit)$linkinv)
                     nd$y = p$estimate
                     nd$ymax = p$conf.high
                     nd$ymin = p$conf.low
 
                 } else {
                     nd$y = predict(fit, newdata = nd, type = type)
-                    nd = ci(nd$y, nd$se, level, fit$df.residual, backtransform = family(fit)$linkinv)
+                    nd = ci(nd$y, nd$se, level, fit$df.residual, backtransform = stats::family(fit)$linkinv)
                 }
             } else {
                 nd$y = predict(fit, nd, type = type)
diff --git a/vignettes/intro_tutorial.qmd b/vignettes/intro_tutorial.qmd
index 12290ecf..b5e41605 100644
--- a/vignettes/intro_tutorial.qmd
+++ b/vignettes/intro_tutorial.qmd
@@ -292,27 +292,8 @@ or by checking the
 documentation.
 
 For example, **tinyplot** support interval plots via the `"pointrange"`,
-`"errorbar"`, `"ribbon"` type arguments. A canonical use-case is regression
-analysis and prediction.
-
-```{r ribbon_pred}
-mod = lm(Temp ~ 0 + Month / Day, data = aq)
-aq = cbind(aq, predict(mod, interval = "confidence"))
-
-with(
-  aq,
-  tinyplot(
-    x = Day, y = fit,
-    ymin = lwr, ymax = upr,
-    by = Month,
-    type = "ribbon",
-    grid = TRUE,
-    main = "Model predictions"
-  )
-)
-```
-
-Similarly, we can grab the model estimates to produce nice coefficient plots.
+`"errorbar"`, `"ribbon"` type arguments. A canonical use-case is coefficient
+plots: 
 
 ```{r pointrange, warning = FALSE}
 # grab coefs of interest
@@ -338,6 +319,14 @@ with(
 )
 ```
 
+**tinyplot** also supports special types to fit models and display their predictions, along with confidence intervals. Here's an example where we fit a logistic regression model:
+
+```{r ribbon_pred}
+tinyplot(
+  I(Temp > 80) ~ Wind, data = aq,
+  type = type_glm(family = binomial))
+```
+
 ## Facets
 
 Alongside the standard "by" grouping approach that we have seen thus far,
diff --git a/vignettes/type.qmd b/vignettes/type.qmd
index a12c0e26..c5c13326 100644
--- a/vignettes/type.qmd
+++ b/vignettes/type.qmd
@@ -29,13 +29,13 @@ The `type` argument in `tinyplot` supports all the standard plot types from base
 The default plot type is `"p"`, which creates a scatter plot of points.
 
 ```{r}
-plt(Temp ~ Day | Month, data = aq, type = "p", main = "Points")
+tinyplot(Temp ~ Day | Month, data = aq, type = "p", main = "Points")
 ```
 
 Use `"l"` to connect data points with lines.
 
 ```{r}
-plt(Temp ~ Day | Month, data = aq, type = "l", main = "Lines")
+tinyplot(Temp ~ Day | Month, data = aq, type = "l", main = "Lines")
 ```
 
 * `b` (Points and Lines): Combines points and lines in the plot.
@@ -85,10 +85,10 @@ For example, we can add noise to data points using the `"jitter"` type. This all
 
 ```{r}
 #| layout-ncol: 2
-plt(Temp ~ Month, data = aq, main = "Default jittering", 
+tinyplot(Temp ~ Month, data = aq, main = "Default jittering", 
     type = "jitter")
 
-plt(Temp ~ Month, data = aq, main = "Modest jittering",
+tinyplot(Temp ~ Month, data = aq, main = "Modest jittering",
     type = type_jitter(amount = 0.05))
 ```
 
@@ -96,22 +96,26 @@ In this example, we use `type_glm()` to fit a logit regression model to the data
 
 ```{r}
 #| layout-ncol: 2
-plt(Hot ~ Wind, data = aq, main = "Logit with 95% interval",
+tinyplot(Hot ~ Wind, data = aq, main = "Logit with 95% interval",
     type = type_glm(family = "binomial"))
 
-plt(Hot ~ Wind, data = aq, main = "Logit with 50% interval",
+tinyplot(Hot ~ Wind, data = aq, main = "Logit with 50% interval",
     type = type_glm(family = "binomial", level = 0.5))
 ```
 
 Most `tinyplot` types support grouping and faceting:
 
 ```{r}
-plt(Temp ~ Wind | Month, data = aq, type = type_lm(se = FALSE))
+tinyplot(Temp ~ Wind | Month, data = aq, type = type_lm(se = FALSE))
 ```
 
 # Custom types
 
-It is easy to add custom types to `tinyplot`. To do this, we need to define 3 functions:
+It is easy to add custom types to `tinyplot`. Users who need highly customized plots, or developers who want to add support to their package or functions, only need to define three simple functions: `data_typename()`, `draw_typename()`, and `type_typename()`.
+
+In this section, we explain the role of each of these functions and present a minimalist example of a custom type. Interested readers may refer to [the `tinyplot` source code](https://github.com/grantmcdermott/tinyplot) to see many more examples, since each `tinyplot` type is itself implemented as a custom type.
+
+The three functions that we need to define for a new type are:
 
 1. `data_*()`: Function factory.
     - Accepts a list of internal objects
@@ -165,13 +169,13 @@ type_log = function(base = exp(1)) {
   return(out)
 }
 
-plt(mpg ~ wt | factor(am), data = mtcars,
+tinyplot(mpg ~ wt | factor(am), data = mtcars,
   type = "p", main = "Raw")
 
-plt(mpg ~ wt | factor(am), data = mtcars,
+tinyplot(mpg ~ wt | factor(am), data = mtcars,
   type = type_log(), main = "Ln")
 
-plt(mpg ~ wt | factor(am), data = mtcars,
+tinyplot(mpg ~ wt | factor(am), data = mtcars,
   type = type_log(base = 10), main = "Log 10")
 ```
 

From 374d5bc015c56be403ad9f03ad3037de96675762 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Mon, 7 Oct 2024 19:58:46 -0400
Subject: [PATCH 54/72] boxplot: horizontal -> flip

---
 R/tinyplot.R                 | 2 --
 R/type_boxplot.R             | 5 ++---
 inst/tinytest/test-boxplot.R | 6 +++---
 3 files changed, 5 insertions(+), 8 deletions(-)

diff --git a/R/tinyplot.R b/R/tinyplot.R
index 19f828bd..b8287122 100644
--- a/R/tinyplot.R
+++ b/R/tinyplot.R
@@ -691,7 +691,6 @@ tinyplot.default = function(
   # swap x and y values if flip is TRUE
   assert_flag(flip)
   # extra catch for boxplots
-  if (type == "boxplot" && !is.null(dots[["horizontal"]])) flip = dots[["horizontal"]]
   # now swap the values
   if (isTRUE(flip)) {
     if (type != "boxplot") {
@@ -725,7 +724,6 @@ tinyplot.default = function(
       # clean up
       rm(xlim_cp, xlab_cp, xlabs_cp, xaxt_cp, x_cp, xmin_cp, xmax_cp) 
     } else {
-      dots[["horizontal"]] = TRUE
       # We'll let boxplot(..., horizontal = TRUE) handle most of the adjustments
       # and just catch a few elements that we draw beforehand.
       xlab_cp = xlab
diff --git a/R/type_boxplot.R b/R/type_boxplot.R
index 3086277d..608f1871 100644
--- a/R/type_boxplot.R
+++ b/R/type_boxplot.R
@@ -31,10 +31,9 @@ type_boxplot = function(
 
 
 draw_boxplot = function(range, width, varwidth, notch, outline, boxwex, staplewex, outwex) {
-    fun = function(iby, ix, iy, ipch, ilty, icol, ibg, dots, x_by = FALSE, facet_by = FALSE, data_by, ...) {
+    fun = function(iby, ix, iy, ipch, ilty, icol, ibg, x_by = FALSE, facet_by = FALSE, data_by, flip, ...) {
 
         at_ix = unique(ix)
-        horizontal = if (!is.null(dots[["horizontal"]])) dots[["horizontal"]] else FALSE
         if (isTRUE(x_by)) boxwex = boxwex * 2
 
         # Handle multiple groups
@@ -54,8 +53,8 @@ draw_boxplot = function(range, width, varwidth, notch, outline, boxwex, staplewe
             lty = ilty,
             border = icol,
             col = ibg,
+            horizontal = flip,
             add = TRUE, axes = FALSE,
-            horizontal = horizontal,
             at = at_ix,
             range = range,
             width = width,
diff --git a/inst/tinytest/test-boxplot.R b/inst/tinytest/test-boxplot.R
index 44afe62a..9219d7d6 100644
--- a/inst/tinytest/test-boxplot.R
+++ b/inst/tinytest/test-boxplot.R
@@ -10,14 +10,14 @@ f = function() {
 expect_snapshot_plot(f, label = "boxplot_simple")
 
 f = function() {
-  plt(count ~ spray, data = InsectSprays, type = "boxplot", horizontal = TRUE)
+  plt(count ~ spray, data = InsectSprays, type = "boxplot", flip = TRUE)
 }
 expect_snapshot_plot(f, label = "boxplot_simple_horizontal")
 
 f = function() {
   plt(
     decrease ~ treatment, data = OrchardSprays, fill = "bisque",
-    log = "y", type = "boxplot", horizontal = TRUE
+    log = "y", type = "boxplot", flip = TRUE
   )
 }
 expect_snapshot_plot(f, label = "boxplot_log_horizontal")
@@ -40,7 +40,7 @@ f = function() {
       ylim = c(0, 35),
       type = type_boxplot(boxwex = 0.5, staplewex = 0),
       legend = list(title = NULL),
-      horizontal = TRUE
+      flip = TRUE
   )
 }
 expect_snapshot_plot(f, label = "boxplot_groups_argpass")

From 361aefae441df0b86c446799dcc8d88d86735b2b Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Mon, 7 Oct 2024 20:02:42 -0400
Subject: [PATCH 55/72] type_ribbon: catch up to flip PR

---
 R/type_ribbon.R | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/R/type_ribbon.R b/R/type_ribbon.R
index abe1630c..691c7fed 100644
--- a/R/type_ribbon.R
+++ b/R/type_ribbon.R
@@ -57,6 +57,10 @@ data_ribbon = function() {
         # Reorder x, y, ymin, and ymax based on the order determined
         datapoints = datapoints[xord,]
 
+        # Catch for missing ymin and ymax 
+        if (is.null(datapoints$ymin)) datapoints$ymin = datapoints$y 
+        if (is.null(datapoints$ymax)) datapoints$ymax = datapoints$y
+
         out = list(
             x = datapoints$x,
             y = datapoints$y,

From 39d29c2bc30ae62230dc7e5cf9d00057db8f0600 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Mon, 7 Oct 2024 20:10:36 -0400
Subject: [PATCH 56/72] 80 char

---
 R/sanitize.R | 54 ++++++++++++++++++++++------------------------------
 1 file changed, 23 insertions(+), 31 deletions(-)

diff --git a/R/sanitize.R b/R/sanitize.R
index 59ca357f..c1ba599a 100644
--- a/R/sanitize.R
+++ b/R/sanitize.R
@@ -11,7 +11,9 @@ sanitize_type = function(type, x, y) {
         return(type)
     }
 
-    types = c("area", "boxplot", "density", "jitter", "ribbon", "pointrange", "hist", "histogram", "errorbar", "polygon", "polypath", "rect", "segments", "points", "p", "l", "o", "b", "c", "h", "j", "s", "S", "n", "loess", "lm", "glm")
+    types = c("area", "boxplot", "density", "jitter", "ribbon", "pointrange", "hist", 
+        "histogram", "errorbar", "polygon", "polypath", "rect", "segments", "points", 
+        "p", "l", "o", "b", "c", "h", "j", "s", "S", "n", "loess", "lm", "glm")
     assert_choice(type, types, null.ok = TRUE)
 
     if (is.null(type)) {
@@ -27,36 +29,26 @@ sanitize_type = function(type, x, y) {
         type = return(type_jitter())
     }
 
-    if (identical(type, "points")) {
-        return(type_points())
-    } else if (identical(type, "segments")) {
-        return(type_segments())
-    } else if (identical(type, "area")) {
-        return(type_area())
-    } else if (identical(type, "rect")) {
-        return(type_rect())
-    } else if (identical(type, "polypath")) {
-        return(type_polypath())
-    } else if (identical(type, "pointrange")) {
-        return(type_pointrange())
-    } else if (identical(type, "errorbar")) {
-        return(type_errorbar())
-    } else if (identical(type, "boxplot")) {
-        return(type_boxplot())
-    } else if (identical(type, "ribbon")) {
-        return(type_ribbon())
-    } else if (identical(type, "histogram")) {
-        return(type_histogram())
-    } else if (isTRUE(type %in% c("j", "jitter"))) {
-        return(type_jitter())
-    # statistical functions
-    } else if (identical(type, "loess")) {
-        return(type_loess())
-    } else if (identical(type, "glm")) {
-        return(type_glm())
-    } else if (identical(type, "lm")) {
-        return(type_lm())
-    }
+    type_fun = switch(type,
+        "points" = type_points(),
+        "segments" = type_segments(),
+        "area" = type_area(),
+        "rect" = type_rect(),
+        "polypath" = type_polypath(),
+        "polygon" = type_polygon(),
+        "pointrange" = type_pointrange(),
+        "errorbar" = type_errorbar(),
+        "boxplot" = type_boxplot(),
+        "ribbon" = type_ribbon(),
+        "histogram" = type_histogram(),
+        "j" = type_jitter(),
+        "jitter" = type_jitter(),
+        "loess" = type_loess(),
+        "glm" = type_glm(),
+        "lm" = type_lm(),
+        NULL  # Default case
+    )
+    if (inherits(type_fun, "tinyplot_type")) return(type_fun)
 
     out = list(draw = NULL, data = NULL, name = type)
     return(out)

From 10745ed1135a4e026dba0681f8ea8ee37caa8480 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Mon, 7 Oct 2024 20:11:34 -0400
Subject: [PATCH 57/72] rollback useless change

---
 R/tinyplot.R | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/R/tinyplot.R b/R/tinyplot.R
index b8287122..1938f4b6 100644
--- a/R/tinyplot.R
+++ b/R/tinyplot.R
@@ -588,7 +588,7 @@ tinyplot.default = function(
   # Capture deparsed expressions early, before x, y and by are evaluated
   x_dep = if (!is.null(x)) {
     deparse1(substitute(x))
-  } else if (type %in% c("rect", "segments", "hist", "histogram")) {
+  } else if (type %in% c("rect", "segments")) {
     x = NULL
     NULL
   }

From cd8a8442bfd558513a77af66d19416f365a63b58 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Mon, 7 Oct 2024 20:12:48 -0400
Subject: [PATCH 58/72] rollback useless change

---
 R/tinyplot.R | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/R/tinyplot.R b/R/tinyplot.R
index 1938f4b6..5926bcd2 100644
--- a/R/tinyplot.R
+++ b/R/tinyplot.R
@@ -624,7 +624,7 @@ tinyplot.default = function(
 
   if (is.null(x)) {
     ## Special catch for rect and segment plots without a specified y-var
-    if (type %in% c("rect", "segments", "histogram", "hist")) {
+    if (type %in% c("rect", "segments")) {
       xmin_dep = deparse(substitute(xmin))
       xmax_dep = deparse(substitute(xmax))
       x_dep = paste0("[", xmin_dep, ", ", xmax_dep, "]")

From 708c887927e07d2c62923416abfb2ddfc4f2f527 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Mon, 7 Oct 2024 20:24:59 -0400
Subject: [PATCH 59/72] was_area_type

---
 R/tinyplot.R | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/R/tinyplot.R b/R/tinyplot.R
index 5926bcd2..9586a274 100644
--- a/R/tinyplot.R
+++ b/R/tinyplot.R
@@ -542,8 +542,8 @@ tinyplot.default = function(
   type_data = type$data
   type_draw = type$draw
   type = type$name
+  was_area_type = identical(type, "area")
 
-  was_area_type = identical(type, "area") # flag to keep track for some legend adjustments below
   assert_flag(flip)
 
   palette = substitute(palette)
@@ -842,7 +842,7 @@ tinyplot.default = function(
 
     has_sub = !is.null(sub)
 
-    if (isTRUE(type %in% c("area", "rect", "histogram", "hist"))) {
+    if (isTRUE(was_area_type) || isTRUE(type %in% c("area", "rect", "hist", "histogram"))) {
       legend_args[["pt.lwd"]] = par("lwd")
       legend_args[["lty"]] = 0
     }

From 2cc799b935b667c984648d02f7b3555564091a32 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Mon, 7 Oct 2024 20:34:29 -0400
Subject: [PATCH 60/72] indentation

---
 R/by_aesthetics.R | 444 +++++++++++++++++++++++-----------------------
 1 file changed, 222 insertions(+), 222 deletions(-)

diff --git a/R/by_aesthetics.R b/R/by_aesthetics.R
index 10f75ccb..e04c31fe 100755
--- a/R/by_aesthetics.R
+++ b/R/by_aesthetics.R
@@ -1,274 +1,274 @@
 by_col = function(ngrps = 1L, col = NULL, palette = NULL, gradient = NULL, ordered = NULL, alpha = NULL) {
-    if (is.null(ordered)) ordered = FALSE
-    if (is.null(alpha)) alpha = 1
-    if (is.null(gradient)) gradient = FALSE
-    if (isTRUE(gradient)) {
-        ngrps = 100L
-    }
+  if (is.null(ordered)) ordered = FALSE
+  if (is.null(alpha)) alpha = 1
+  if (is.null(gradient)) gradient = FALSE
+  if (isTRUE(gradient)) {
+    ngrps = 100L
+  }
+
+  # palette = substitute(palette, env = parent.env(environment()))
 
-    # palette = substitute(palette, env = parent.env(environment()))
+  # special "by" convenience keyword (will treat as NULL & handle grouping below)
+  if (!anyNA(col) && !is.null(col) && length(col) == 1 && col == "by") col = NULL
 
-    # special "by" convenience keyword (will treat as NULL & handle grouping below)
-    if (!anyNA(col) && !is.null(col) && length(col) == 1 && col == "by") col = NULL
+  if (is.null(col) && is.null(palette)) {
+    col = seq_len(ngrps)
+  }
 
-    if (is.null(col) && is.null(palette)) {
-        col = seq_len(ngrps)
+  if (is.atomic(col) && is.vector(col)) {
+    if (length(col) == 1) {
+      col = rep(col, ngrps)
+    } else if (length(col) != ngrps) {
+      if (isFALSE(gradient)) {
+        stop(sprintf("`col` must be of length 1 or %s.", ngrps), call. = FALSE)
+      } else {
+        # interpolate gradient colors
+        col = colorRampPalette(colors = col, alpha = TRUE)(ngrps)
+      }
+    }
+    if (isTRUE(gradient)) {
+      col = rev(col)
+    }
+    if (anyNA(col) || is.character(col)) {
+      return(col)
     }
+  }
 
-    if (is.atomic(col) && is.vector(col)) {
-        if (length(col) == 1) {
-            col = rep(col, ngrps)
-        } else if (length(col) != ngrps) {
-            if (isFALSE(gradient)) {
-                stop(sprintf("`col` must be of length 1 or %s.", ngrps), call. = FALSE)
-            } else {
-                # interpolate gradient colors
-                col = colorRampPalette(colors = col, alpha = TRUE)(ngrps)
-            }
+  if (is.null(palette)) {
+    if (ngrps <= length(palette()) && isFALSE(ordered) && isFALSE(gradient)) {
+      palette_fun = function(alpha) adjustcolor(palette(), alpha) # must be function to avoid arg ambiguity
+      args = list(alpha = alpha)
+    } else {
+      if (ngrps <= 8 && isFALSE(ordered)) { # ngrps < 100 so we know gradient is FALSE too
+        palette = "R4"
+        palette_fun = palette.colors
+      } else {
+        palette = "Viridis"
+        if (isFALSE(gradient) && isFALSE(ordered)) {
+          palette_fun = hcl.colors
+        } else {
+          palette_fun_gradient = function(n, palette, from = 0.1, to = 0.9, alpha = 1) {
+            colorRampPalette(
+              hcl.colors(n = 100, palette = palette, alpha = alpha)[(100 * from + 1):(100 * to)],
+              alpha = TRUE
+            )(n)
+          }
+          palette_fun = palette_fun_gradient
         }
+      }
+      args = list(n = ngrps, palette = palette, alpha = alpha)
+    }
+  } else {
+    if (is.character(palette)) {
+      fx = function(x) tolower(gsub("[-, _, \\,, (, ), \\ , \\.]", "", x))
+      pal_match = charmatch(fx(palette), fx(palette.pals()))
+      if (!is.na(pal_match)) {
+        if (pal_match < 1L) stop("'palette' is ambiguous")
+        palette_fun = palette.colors
         if (isTRUE(gradient)) {
-            col = rev(col)
+          palette_fun2 = function(n, palette, alpha) colorRampPalette(palette.colors(palette = palette, alpha = alpha))(n)
+          palette_fun = palette_fun2
         }
-        if (anyNA(col) || is.character(col)) {
-            return(col)
-        }
-    }
-
-    if (is.null(palette)) {
-        if (ngrps <= length(palette()) && isFALSE(ordered) && isFALSE(gradient)) {
-            palette_fun = function(alpha) adjustcolor(palette(), alpha) # must be function to avoid arg ambiguity
-            args = list(alpha = alpha)
+      } else {
+        pal_match = charmatch(fx(palette), fx(hcl.pals()))
+        if (!is.na(pal_match)) {
+          if (pal_match < 1L) stop("'palette' is ambiguous")
+          palette_fun = hcl.colors
         } else {
-            if (ngrps <= 8 && isFALSE(ordered)) { # ngrps < 100 so we know gradient is FALSE too
-                palette = "R4"
-                palette_fun = palette.colors
-            } else {
-                palette = "Viridis"
-                if (isFALSE(gradient) && isFALSE(ordered)) {
-                    palette_fun = hcl.colors
-                } else {
-                    palette_fun_gradient = function(n, palette, from = 0.1, to = 0.9, alpha = 1) {
-                        colorRampPalette(
-                            hcl.colors(n = 100, palette = palette, alpha = alpha)[(100 * from + 1):(100 * to)],
-                            alpha = TRUE
-                        )(n)
-                    }
-                    palette_fun = palette_fun_gradient
-                }
-            }
-            args = list(n = ngrps, palette = palette, alpha = alpha)
+          stop(
+            "\nPalette string not recogized. Must be a value produced by either",
+            "`palette.pals()` or `hcl.pals()`.\n",
+            call. = FALSE
+          )
         }
+      }
+      args = list(n = ngrps, palette = palette, alpha = alpha)
+    } else if (class(palette) %in% c("call", "name")) {
+      args = as.list(palette)
+      palette_fun = paste(args[[1]])
+      args[[1]] = NULL
+      args[["n"]] = ngrps
+      # remove unnamed arguments to prevent unintentional argument sliding
+      if (any(names(args) == "")) args[[which(names(args) == "")]] = NULL
     } else {
-        if (is.character(palette)) {
-            fx = function(x) tolower(gsub("[-, _, \\,, (, ), \\ , \\.]", "", x))
-            pal_match = charmatch(fx(palette), fx(palette.pals()))
-            if (!is.na(pal_match)) {
-                if (pal_match < 1L) stop("'palette' is ambiguous")
-                palette_fun = palette.colors
-                if (isTRUE(gradient)) {
-                    palette_fun2 = function(n, palette, alpha) colorRampPalette(palette.colors(palette = palette, alpha = alpha))(n)
-                    palette_fun = palette_fun2
-                }
-            } else {
-                pal_match = charmatch(fx(palette), fx(hcl.pals()))
-                if (!is.na(pal_match)) {
-                    if (pal_match < 1L) stop("'palette' is ambiguous")
-                    palette_fun = hcl.colors
-                } else {
-                    stop(
-                        "\nPalette string not recogized. Must be a value produced by either",
-                        "`palette.pals()` or `hcl.pals()`.\n",
-                        call. = FALSE
-                    )
-                }
-            }
-            args = list(n = ngrps, palette = palette, alpha = alpha)
-        } else if (class(palette) %in% c("call", "name")) {
-            args = as.list(palette)
-            palette_fun = paste(args[[1]])
-            args[[1]] = NULL
-            args[["n"]] = ngrps
-            # remove unnamed arguments to prevent unintentional argument sliding
-            if (any(names(args) == "")) args[[which(names(args) == "")]] = NULL
-        } else {
-            stop(
-                "\nInvalid palette argument. Must be a recognized keyword, or a",
-                "palette-generating function with named arguments.\n"
-            )
-        }
+      stop(
+        "\nInvalid palette argument. Must be a recognized keyword, or a",
+        "palette-generating function with named arguments.\n"
+      )
     }
+  }
 
-    cols = tryCatch(
-        do.call(palette_fun, args),
-        error = function(e) do.call(eval(palette), args) # catch for bespoke palette generating funcs
-    )
+  cols = tryCatch(
+    do.call(palette_fun, args),
+    error = function(e) do.call(eval(palette), args) # catch for bespoke palette generating funcs
+  )
 
-    if (length(cols) > ngrps) cols = cols[1:ngrps]
+  if (length(cols) > ngrps) cols = cols[1:ngrps]
 
-    # For gradient and ordered colors, we'll run high to low
-    if (isTRUE(gradient) || isTRUE(ordered)) cols = rev(cols)
+  # For gradient and ordered colors, we'll run high to low
+  if (isTRUE(gradient) || isTRUE(ordered)) cols = rev(cols)
 
-    return(cols)
+  return(cols)
 }
 
 
 by_pch = function(ngrps, type, pch = NULL) {
-    no_pch = FALSE
-    if (!type %in% c("p", "b", "o", "pointrange", "errorbar", "boxplot")) {
-        no_pch = TRUE
-        pch = NULL
+  no_pch = FALSE
+  if (!type %in% c("p", "b", "o", "pointrange", "errorbar", "boxplot")) {
+    no_pch = TRUE
+    pch = NULL
 
-        # special "by" convenience keyword
-    } else if (!is.null(pch) && length(pch) == 1 && pch == "by") {
-        no_pch = TRUE # skip checks below
-        pch = 1:ngrps + par("pch") - 1
-        # correctly recycle if over max pch type
-        pch_ceiling = 25 # see ?pch
-        if (max(pch) > pch_ceiling) {
-            pch_below = pch[pch <= pch_ceiling]
-            pch_above = pch[pch > pch_ceiling]
-            pch_above = rep_len(0:pch_ceiling, length(pch_above))
-            pch = c(pch_below, pch_above)
-        }
-
-        # return NULL if not a valid point type
-    } else if (is.null(pch)) {
-        pch = par("pch")
+    # special "by" convenience keyword
+  } else if (!is.null(pch) && length(pch) == 1 && pch == "by") {
+    no_pch = TRUE # skip checks below
+    pch = 1:ngrps + par("pch") - 1
+    # correctly recycle if over max pch type
+    pch_ceiling = 25 # see ?pch
+    if (max(pch) > pch_ceiling) {
+      pch_below = pch[pch <= pch_ceiling]
+      pch_above = pch[pch > pch_ceiling]
+      pch_above = rep_len(0:pch_ceiling, length(pch_above))
+      pch = c(pch_below, pch_above)
     }
 
-    if (!no_pch) {
-        if (!is.atomic(pch) || !is.vector(pch) || !is.numeric(pch) || (length(pch) != 1 && length(pch) != ngrps)) {
-            stop(sprintf("`pch` must be `NULL` or a numeric vector of length 1 or %s.", ngrps), call. = FALSE)
-        }
+    # return NULL if not a valid point type
+  } else if (is.null(pch)) {
+    pch = par("pch")
+  }
 
-        if (length(pch) == 1) {
-            pch = rep(pch, ngrps)
-        }
+  if (!no_pch) {
+    if (!is.atomic(pch) || !is.vector(pch) || !is.numeric(pch) || (length(pch) != 1 && length(pch) != ngrps)) {
+      stop(sprintf("`pch` must be `NULL` or a numeric vector of length 1 or %s.", ngrps), call. = FALSE)
     }
 
-    return(pch)
+    if (length(pch) == 1) {
+      pch = rep(pch, ngrps)
+    }
+  }
+
+  return(pch)
 }
 
 
 by_lty = function(ngrps, type, lty = NULL) {
-    # We only care about line types, otherwise return NULL
-    if (!type %in% c("l", "b", "o", "c", "h", "s", "S", "ribbon", "boxplot", "rect", "segments")) {
-        out = NULL
+  # We only care about line types, otherwise return NULL
+  if (!type %in% c("l", "b", "o", "c", "h", "s", "S", "ribbon", "boxplot", "rect", "segments")) {
+    out = NULL
 
-        # special "by" convenience keyword
-    } else if (!is.null(lty) && length(lty) == 1 && lty == "by") {
-        lty_dict = c("solid", "dashed", "dotted", "dotdash", "longdash", "twodash")
-        par_lty = par("lty")
+    # special "by" convenience keyword
+  } else if (!is.null(lty) && length(lty) == 1 && lty == "by") {
+    lty_dict = c("solid", "dashed", "dotted", "dotdash", "longdash", "twodash")
+    par_lty = par("lty")
 
-        if (!par_lty %in% lty_dict) {
-            warning(
-                "\nBesoke lty specifications (i.e., using string combinations) are not",
-                "currently supported alongside the lty='by' keyword argument.",
-                "Defaulting to 1 and looping from there.\n"
-            )
-            par_lty = 1
-        } else {
-            par_lty = which(par_lty == lty_dict)
-        }
-        out = 1:ngrps + par_lty - 1
-        # correctly recycle if over max pch type
-        lty_ceiling = 6 # see ?pch
-        if (max(out) > lty_ceiling) {
-            lty_below = out[out <= lty_ceiling]
-            lty_above = out[out > lty_ceiling]
-            lty_above = rep_len(1:lty_ceiling, length(lty_above))
-            out = c(lty_below, lty_above)
-        }
+    if (!par_lty %in% lty_dict) {
+      warning(
+        "\nBesoke lty specifications (i.e., using string combinations) are not",
+        "currently supported alongside the lty='by' keyword argument.",
+        "Defaulting to 1 and looping from there.\n"
+      )
+      par_lty = 1
+    } else {
+      par_lty = which(par_lty == lty_dict)
+    }
+    out = 1:ngrps + par_lty - 1
+    # correctly recycle if over max pch type
+    lty_ceiling = 6 # see ?pch
+    if (max(out) > lty_ceiling) {
+      lty_below = out[out <= lty_ceiling]
+      lty_above = out[out > lty_ceiling]
+      lty_above = rep_len(1:lty_ceiling, length(lty_above))
+      out = c(lty_below, lty_above)
+    }
 
-        # NULL -> solid (or default) line
-    } else if (is.null(lty)) {
-        if (identical(type, "boxplot")) {
-            out = NULL
-        } else {
-            out = rep(par("lty"), ngrps)
-        }
+    # NULL -> solid (or default) line
+  } else if (is.null(lty)) {
+    if (identical(type, "boxplot")) {
+      out = NULL
+    } else {
+      out = rep(par("lty"), ngrps)
+    }
 
-        # atomic vector: sanity check length
-    } else if (is.atomic(lty) && is.vector(lty)) {
-        if (length(lty) == 1) {
-            out = rep(lty, ngrps)
-        } else {
-            if (length(lty) != ngrps) {
-                stop(sprintf("`lty` must be `NULL` or a numeric vector of length 1 or %s.", ngrps), call. = FALSE)
-            }
-            out = lty
-        }
+    # atomic vector: sanity check length
+  } else if (is.atomic(lty) && is.vector(lty)) {
+    if (length(lty) == 1) {
+      out = rep(lty, ngrps)
+    } else {
+      if (length(lty) != ngrps) {
+        stop(sprintf("`lty` must be `NULL` or a numeric vector of length 1 or %s.", ngrps), call. = FALSE)
+      }
+      out = lty
     }
+  }
 
-    return(out)
+  return(out)
 }
 
 
 by_lwd = function(ngrps, type, lwd = NULL) {
-    lwd_base = par("lwd")
-    lwd_floor = lwd_base / min(5, max((ngrps - 1), 1))
-    lwd_ceiling = lwd_base * min(5, ngrps)
+  lwd_base = par("lwd")
+  lwd_floor = lwd_base / min(5, max((ngrps - 1), 1))
+  lwd_ceiling = lwd_base * min(5, ngrps)
 
-    no_lwd = FALSE
-    # special "by" convenience keyword
-    if (!is.null(lwd) && length(lwd) == 1 && lwd == "by") {
-        no_lwd = TRUE # skip checks below
-        lwd = seq(lwd_floor, lwd_ceiling, length.out = ngrps)
-    } else if (is.null(lwd)) {
-        no_lwd = TRUE
-        lwd = NULL
-    }
+  no_lwd = FALSE
+  # special "by" convenience keyword
+  if (!is.null(lwd) && length(lwd) == 1 && lwd == "by") {
+    no_lwd = TRUE # skip checks below
+    lwd = seq(lwd_floor, lwd_ceiling, length.out = ngrps)
+  } else if (is.null(lwd)) {
+    no_lwd = TRUE
+    lwd = NULL
+  }
 
-    if (!no_lwd) {
-        if (!is.atomic(lwd) || !is.vector(lwd) || !is.numeric(lwd) || (length(lwd) != 1 && length(lwd) != ngrps)) {
-            stop(sprintf("`lwd` must be `NULL` or a numeric vector of length 1 or %s.", ngrps), call. = FALSE)
-        }
-        if (length(lwd) == 1) {
-            lwd = rep(lwd, ngrps)
-        }
+  if (!no_lwd) {
+    if (!is.atomic(lwd) || !is.vector(lwd) || !is.numeric(lwd) || (length(lwd) != 1 && length(lwd) != ngrps)) {
+      stop(sprintf("`lwd` must be `NULL` or a numeric vector of length 1 or %s.", ngrps), call. = FALSE)
     }
+    if (length(lwd) == 1) {
+      lwd = rep(lwd, ngrps)
+    }
+  }
 
-    return(lwd)
+  return(lwd)
 }
 
 
 by_bg = function(
-    adjustcolor,
-    alpha,
-    bg,
-    by,
-    by_continuous,
-    by_ordered,
-    col,
-    fill,
-    ngrps,
-    palette,
-    ribbon.alpha,
-    type) {
-    if (is.null(bg) && !is.null(fill)) bg = fill
-    if (!is.null(bg) && length(bg) == 1 && is.numeric(bg) && bg >= 0 && bg <= 1) {
-        alpha = bg
-        bg = "by"
-    }
-    if (!is.null(bg) && length(bg) == 1 && bg == "by") {
-        bg = by_col(
-            ngrps = ngrps,
-            col = NULL,
-            palette = palette,
-            gradient = by_continuous,
-            ordered = by_ordered,
-            alpha = alpha
-        )
-    } else if (length(bg) != ngrps) {
-        bg = rep(bg, ngrps)
-    }
-    if (type == "ribbon" || (type == "boxplot" && !is.null(by))) {
-        if (!is.null(bg)) {
-            bg = adjustcolor(bg, ribbon.alpha)
-        } else if (!is.null(col)) {
-            bg = adjustcolor(col, ribbon.alpha)
-        }
+  adjustcolor,
+  alpha,
+  bg,
+  by,
+  by_continuous,
+  by_ordered,
+  col,
+  fill,
+  ngrps,
+  palette,
+  ribbon.alpha,
+  type) {
+  if (is.null(bg) && !is.null(fill)) bg = fill
+  if (!is.null(bg) && length(bg) == 1 && is.numeric(bg) && bg >= 0 && bg <= 1) {
+    alpha = bg
+    bg = "by"
+  }
+  if (!is.null(bg) && length(bg) == 1 && bg == "by") {
+    bg = by_col(
+      ngrps = ngrps,
+      col = NULL,
+      palette = palette,
+      gradient = by_continuous,
+      ordered = by_ordered,
+      alpha = alpha
+    )
+  } else if (length(bg) != ngrps) {
+    bg = rep(bg, ngrps)
+  }
+  if (type == "ribbon" || (type == "boxplot" && !is.null(by))) {
+    if (!is.null(bg)) {
+      bg = adjustcolor(bg, ribbon.alpha)
+    } else if (!is.null(col)) {
+      bg = adjustcolor(col, ribbon.alpha)
     }
+  }
 
-    return(bg)
+  return(bg)
 }

From 8b7667130bab1264db59d95ab2eec7a5246bd680 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Mon, 7 Oct 2024 20:37:33 -0400
Subject: [PATCH 61/72] namespace

---
 Makefile     |  2 +-
 NAMESPACE    |  2 +-
 R/type_glm.R |  3 +++
 man/ci.Rd    | 12 ++++++++++++
 4 files changed, 17 insertions(+), 2 deletions(-)
 create mode 100644 man/ci.Rd

diff --git a/Makefile b/Makefile
index 82bec2dd..1b7a9813 100644
--- a/Makefile
+++ b/Makefile
@@ -14,7 +14,7 @@ document: ## altdoc::render_docs()
 	Rscript -e "devtools::document()"
 
 check: document ## devtools::check()
-	R CMD check .
+	Rscript -e "devtools::check()"
 
 website: website ## altdoc::render_docs()
 	Rscript -e "pkgload::load_all();altdoc::render_docs()"
diff --git a/NAMESPACE b/NAMESPACE
index 081e63d4..b83731c8 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -59,7 +59,6 @@ importFrom(graphics,title)
 importFrom(methods,as)
 importFrom(stats,as.formula)
 importFrom(stats,density)
-importFrom(stats,family)
 importFrom(stats,glm)
 importFrom(stats,lm)
 importFrom(stats,loess)
@@ -67,6 +66,7 @@ importFrom(stats,loess.control)
 importFrom(stats,model.frame)
 importFrom(stats,na.omit)
 importFrom(stats,predict)
+importFrom(stats,qt)
 importFrom(stats,terms)
 importFrom(stats,update)
 importFrom(tools,file_ext)
diff --git a/R/type_glm.R b/R/type_glm.R
index af45a0cc..51b14bbe 100644
--- a/R/type_glm.R
+++ b/R/type_glm.R
@@ -52,6 +52,9 @@ data_glm = function(family, se, level, type, ...) {
 }
 
 
+#' Calculate confidence intervals
+#' @importFrom stats qt
+#' @keywords internal
 ci = function(estimate, std.error, conf.level, df, backtransform = identity) {
     crit = qt(1 - (1 - conf.level) / 2, df)
     out = list(
diff --git a/man/ci.Rd b/man/ci.Rd
new file mode 100644
index 00000000..6587c6b8
--- /dev/null
+++ b/man/ci.Rd
@@ -0,0 +1,12 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/type_glm.R
+\name{ci}
+\alias{ci}
+\title{Calculate confidence intervals}
+\usage{
+ci(estimate, std.error, conf.level, df, backtransform = identity)
+}
+\description{
+Calculate confidence intervals
+}
+\keyword{internal}

From 828dacdc53956a0c3fa75f3aa9b2a68840f56a2b Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Mon, 7 Oct 2024 20:41:28 -0400
Subject: [PATCH 62/72] export type_polypath

---
 NAMESPACE            |  1 +
 R/type_polypath.R    |  4 ++++
 man/type_polypath.Rd | 15 +++++++++++++++
 3 files changed, 20 insertions(+)
 create mode 100644 man/type_polypath.Rd

diff --git a/NAMESPACE b/NAMESPACE
index b83731c8..fa189445 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -14,6 +14,7 @@ export(type_glm)
 export(type_jitter)
 export(type_lm)
 export(type_loess)
+export(type_polypath)
 importFrom(grDevices,adjustcolor)
 importFrom(grDevices,as.raster)
 importFrom(grDevices,colorRampPalette)
diff --git a/R/type_polypath.R b/R/type_polypath.R
index 0e502618..beb3edb4 100644
--- a/R/type_polypath.R
+++ b/R/type_polypath.R
@@ -1,3 +1,7 @@
+#' Polypath type
+#' 
+#' @inheritParams graphics::polypath
+#' @export
 type_polypath = function(rule = "winding") {
     draw_polypath = function() {
         fun =  function(ix, iy, icol, ibg, ilty, ilwd, dots, ...) {
diff --git a/man/type_polypath.Rd b/man/type_polypath.Rd
new file mode 100644
index 00000000..1674dbcf
--- /dev/null
+++ b/man/type_polypath.Rd
@@ -0,0 +1,15 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/type_polypath.R
+\name{type_polypath}
+\alias{type_polypath}
+\title{Polypath type}
+\usage{
+type_polypath(rule = "winding")
+}
+\arguments{
+\item{rule}{character value specifying the path fill mode: either
+    \code{"winding"} or \code{"evenodd"}.}
+}
+\description{
+Polypath type
+}

From 18deba231777e82e830884ae09f309d8a6de9138 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Mon, 7 Oct 2024 21:24:27 -0400
Subject: [PATCH 63/72] vignette fixes

---
 R/type_glm.R                 |  5 +++
 R/type_lm.R                  |  5 +++
 vignettes/intro_tutorial.qmd | 78 +++++++++++++++++++-----------------
 3 files changed, 51 insertions(+), 37 deletions(-)

diff --git a/R/type_glm.R b/R/type_glm.R
index 51b14bbe..c4ce7b76 100644
--- a/R/type_glm.R
+++ b/R/type_glm.R
@@ -22,6 +22,11 @@ data_glm = function(family, se, level, type, ...) {
     fun = function(datapoints, ...) {
         dat = split(datapoints, list(datapoints$facet, datapoints$by))
         dat = lapply(dat, function(x) {
+            if (nrow(x) == 0) return(x)
+            if (nrow(x) < 3) {
+                x$y = NA
+                return(x)
+            }
             fit = glm(y ~ x, data = x, family = family)
             nd = data.frame(x = seq(min(x$x), max(x$x), length.out = 100))
             nd$by = x$by[1]
diff --git a/R/type_lm.R b/R/type_lm.R
index 353c95d9..e13fb586 100644
--- a/R/type_lm.R
+++ b/R/type_lm.R
@@ -19,6 +19,11 @@ data_lm = function(se, level, ...) {
     fun = function(datapoints, ...) {
         dat = split(datapoints, list(datapoints$facet, datapoints$by))
         dat = lapply(dat, function(x) {
+            if (nrow(x) == 0) return(x)
+            if (nrow(x) < 3) {
+                x$y = NA
+                return(x)
+            }
             fit = lm(y ~ x, data = x)
             nd = data.frame(x = seq(min(x$x), max(x$x), length.out = 100))
             nd$by = x$by[1]
diff --git a/vignettes/intro_tutorial.qmd b/vignettes/intro_tutorial.qmd
index b5e41605..6a1eca72 100644
--- a/vignettes/intro_tutorial.qmd
+++ b/vignettes/intro_tutorial.qmd
@@ -296,6 +296,8 @@ For example, **tinyplot** support interval plots via the `"pointrange"`,
 plots: 
 
 ```{r pointrange, warning = FALSE}
+mod = lm(Temp ~ 0 + Month / Day, data = aq)
+
 # grab coefs of interest
 monthcoefs = data.frame(
   gsub("Month", "", names(coef(mod))),
@@ -322,9 +324,11 @@ with(
 **tinyplot** also supports special types to fit models and display their predictions, along with confidence intervals. Here's an example where we fit a logistic regression model:
 
 ```{r ribbon_pred}
-tinyplot(
-  I(Temp > 80) ~ Wind, data = aq,
-  type = type_glm(family = binomial))
+with(aq,
+  tinyplot(
+    I(Temp > 80) ~ Wind,
+    type = type_glm(family = binomial))
+)
 ```
 
 ## Facets
@@ -334,16 +338,11 @@ Alongside the standard "by" grouping approach that we have seen thus far,
 `facet` argument accepts both atomic and formula methods.
 
 ```{r facet_simple}
-with(
-  aq,
+with(aq,
   tinyplot(
-    x = Day, y = fit,
-    ymin = lwr, ymax = upr,
-    type = "ribbon",
-    facet = Month, ## <= facet, not by
-    grid = TRUE,
-    main = "Predicted air temperatures"
-  )
+    Temp ~ Wind,
+    facet = Month,
+    type = type_lm())
 )
 ```
 
@@ -354,17 +353,13 @@ between individual facets can also be adjusted via the `fmar` argument.) Note
 that we can also reduce axis label redundancy by turning off the plot frame.
 
 ```{r facet_nrow}
-with(
-  aq,
+with(aq,
   tinyplot(
-    x = Day, y = fit,
-    ymin = lwr, ymax = upr,
-    type = "ribbon",
+    x = Wind, y = Temp,
     facet = Month,
     facet.args = list(nrow = 1),
     grid = TRUE, frame = FALSE,
-    main = "Predicted air temperatures"
-  )
+    type = type_lm())
 )
 ```
 
@@ -376,30 +371,39 @@ as the colour grouping. But you can easily specify different `by` and `facet`
 variables if that's what your data support.
 
 ```{r facet_fancy}
-# Plot the original points 
-with(
-  aq,
+with(aq,
   tinyplot(
-    x = Day, y = Temp,
+    y = Temp, x = Wind,
     by = Month,
-    facet = "by", facet.args = list(bg = "grey90"),
+    facet = "by",
+    facet.args = list(nrow = 1, list(bg = "grey90")),
     palette = "dark2",
-    grid = TRUE, frame = FALSE, ylim = c(50, 100),
-    main = "Actual and predicted air temperatures"
-  )
+    grid = TRUE, frame = FALSE,
+    type = type_lm())
 )
-# Add the model predictions to the same plot 
-with(
-  aq,
+```
+
+# Add the original points 
+
+```{r}
+with(aq, {
   tinyplot(
-    x = Day, y = fit,
-    ymin = lwr, ymax = upr,
-    by = Month, facet = "by",
-    type = "ribbon",
+    y = Temp, x = Wind,
+    by = Month,
+    facet = "by",
+    facet.args = list(nrow = 1, list(bg = "grey90")),
     palette = "dark2",
-    add = TRUE
-  )
-)
+    grid = TRUE, frame = FALSE,
+    type = type_lm())
+  tinyplot(
+    x = Day, y = Temp,
+    by = Month,
+    facet = "by", facet.args = list(bg = "grey90"),
+    palette = "dark2",
+    grid = TRUE, frame = FALSE, ylim = c(50, 100),
+    main = "Actual and predicted air temperatures",
+    add = TRUE)
+})
 ```
 
 Again, the `facet` argument also accepts a formula interface. One particular use

From b328e950b3c70cb605ee82fb32d71ae324253171 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Tue, 8 Oct 2024 06:22:48 -0400
Subject: [PATCH 64/72] news: new types

---
 NEWS.md | 21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

diff --git a/NEWS.md b/NEWS.md
index 23c2732a..5acf2e1c 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -6,12 +6,25 @@ where the formatting is also better._
 
 ## 0.2.1.99 (dev version)
 
+Breaking changes:
+
+* Type-specific arguments are no longer passed through the main function via
+`...`. Instead, they are now passed through a dedicated `type_*()` functions in
+the `type` argument.
+
 New features:
 
 - The new `flip` argument allows for easily flipping (swapping) the orientation
-of the x and y axes. This should work regardless of plot type, e.g.
-`plt(~Sepal.Length | Species, data = iris, type = "density", flip = TRUE)`.
-(#216 @grantmcdermott)
+  of the x and y axes. This should work regardless of plot type, e.g.
+  `plt(~Sepal.Length | Species, data = iris, type = "density", flip = TRUE)`.
+  (#216 @grantmcdermott)
+- New plot types added in #222:
+    - `type_glm()` (shortcut: `"glm"`
+    - `type_lm()` (shortcut: `"lm"`
+    - `type_loess()` (shortcut: `"loess"`
+- Custom types can now be defined by users by creating `type_typename()`
+  functions. (#222 @vincentarelbundock)
+- Types vignette on the website. (#222 @vincentarelbundock)
 
 Bug fixes:
 
@@ -30,6 +43,8 @@ Internals:
 
 - Continued modularization/abstraction of the code logic. (#214
 @vincentarelbundock)
+- Major internal refactor of the type drawing and data processing. (#222
+@vincentarelbundock)
 
 Misc:
 

From 2d9df69b8fd26c30574f1be8de87a784de0ec4e9 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Tue, 8 Oct 2024 06:34:33 -0400
Subject: [PATCH 65/72] vignette

---
 vignettes/intro_tutorial.qmd | 71 ++++++++++++++++++------------------
 1 file changed, 35 insertions(+), 36 deletions(-)

diff --git a/vignettes/intro_tutorial.qmd b/vignettes/intro_tutorial.qmd
index 6a1eca72..acd61e0a 100644
--- a/vignettes/intro_tutorial.qmd
+++ b/vignettes/intro_tutorial.qmd
@@ -26,11 +26,9 @@ don't try to cover everything, but you should come away with a good
 understanding of how the package works and how it can integrate with your own
 projects.
 
-## Preliminaries
-
-Start by loading the package. For the examples in this tutorial, we'll be using
-a slightly modified version of the `airquality` dataset that comes bundled with
-base R. So let's go ahead and create that now too.
+We start this tutorial by loading the package and a slightly modified version
+of the `airquality` dataset that comes bundled with base R:
+and create that now too.
 
 ```{r aq}
 library(tinyplot)
@@ -331,6 +329,8 @@ with(aq,
 )
 ```
 
+We will see examples of more plot types below, including a other model prediction types. Please also take a look at [the dedicated Plot Types vignette](types.qmd) for explicit details on all of the different plot types that tinyplot supports, as well as how to create your own custom types.
+
 ## Facets
 
 Alongside the standard "by" grouping approach that we have seen thus far,
@@ -350,7 +350,6 @@ By default, facets will be arranged in a square configuration if more than
 three facets are detected. Users can override this behaviour by supplying
 `nrow` or `ncol` in the "facet.args" helper function. (The margin padding
 between individual facets can also be adjusted via the `fmar` argument.) Note
-that we can also reduce axis label redundancy by turning off the plot frame.
 
 ```{r facet_nrow}
 with(aq,
@@ -358,17 +357,17 @@ with(aq,
     x = Wind, y = Temp,
     facet = Month,
     facet.args = list(nrow = 1),
-    grid = TRUE, frame = FALSE,
     type = type_lm())
 )
 ```
 
 Here's a slightly fancier version where we combine facets with (by) colour
-grouping, add a background fill to the facet text, and also add back the
-original values to our model predictions. For this particular example, we'll use
-the `facet = "by"` convenience shorthand to facet along the same month variable
-as the colour grouping. But you can easily specify different `by` and `facet`
-variables if that's what your data support.
+grouping, add a background fill to the facet text, add back the original values
+to our model predictions, and reduce axis label redundancy by turning off the
+plot frame. For this particular example, we'll use the `facet = "by"`
+convenience shorthand to facet along the same month variable as the colour
+grouping. But you can easily specify different `by` and `facet` variables if
+that's what your data support.
 
 ```{r facet_fancy}
 with(aq,
@@ -383,7 +382,29 @@ with(aq,
 )
 ```
 
-# Add the original points 
+The `facet` argument also accepts a formula interface. One particular use
+case is for two-sided formulas, which arranges the facet layout in a fixed grid
+arrangement. Here's a simple (if contrived) example.
+
+```{r facet_grid}
+aq$hot = ifelse(aq$Temp>=75, "hot", "cold")
+aq$windy = ifelse(aq$Wind>=15, "windy", "calm")
+
+tinyplot(
+ Temp ~ Day, data = aq,
+ facet = windy ~ hot,
+ # the rest of these arguments are optional...
+ facet.args = list(col = "white", bg = "black"),
+ pch = 16, col = "dodgerblue",
+ grid = TRUE, frame = FALSE, ylim = c(50, 100),
+ main = "Daily temperatures vs. wind"
+)
+```
+
+The `facet.args` customizations can also be set globally via the `tpar()`
+function, which provides a nice segue to our final section.
+
+## Overlay plots
 
 ```{r}
 with(aq, {
@@ -406,29 +427,7 @@ with(aq, {
 })
 ```
 
-Again, the `facet` argument also accepts a formula interface. One particular use
-case is for two-sided formulas, which arranges the facet layout in a fixed grid
-arrangement. Here's a simple (if contrived) example.
-
-```{r facet_grid}
-aq$hot = ifelse(aq$Temp>=75, "hot", "cold")
-aq$windy = ifelse(aq$Wind>=15, "windy", "calm")
-
-tinyplot(
- Temp ~ Day, data = aq,
- facet = windy ~ hot,
- # the rest of these arguments are optional...
- facet.args = list(col = "white", bg = "black"),
- pch = 16, col = "dodgerblue",
- grid = TRUE, frame = FALSE, ylim = c(50, 100),
- main = "Daily temperatures vs. wind"
-)
-```
-
-The `facet.args` customizations can also be set globally via the `tpar()`
-function, which provides a nice segue to our final section.
-
-## Customization
+## Themes
 
 Customizing your plots further is straightforward, whether that is done directly
 by changing `tinyplot` arguments for a single plot, or by setting global

From d9be3388bd59c353061c0300a5352bb0b18f47bc Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Tue, 8 Oct 2024 06:53:16 -0400
Subject: [PATCH 66/72] type argument doc

---
 R/tinyplot.R    | 45 +++++++++++++++++++++++++--------------------
 man/tinyplot.Rd | 47 +++++++++++++++++++++++++++--------------------
 2 files changed, 52 insertions(+), 40 deletions(-)

diff --git a/R/tinyplot.R b/R/tinyplot.R
index 9586a274..58c66725 100644
--- a/R/tinyplot.R
+++ b/R/tinyplot.R
@@ -71,26 +71,31 @@
 #'   `formula` and `x` arguments should not be specified in the same call.
 #' @param data a data.frame (or list) from which the variables in formula
 #'   should be taken. A matrix is converted to a data frame.
-#' @param type character string giving the type of plot desired. If no argument
-#'   is provided, then the plot type will default to something sensible for the
-#'   type of `x` and `y` inputs (i.e., usually `"p"`). Options are:
-#'   - The same set of 1-character values supported by
-#'   \code{\link[graphics]{plot}}: `"p"` for points, `"l"` for lines, `"b"` for
-#'   both points and lines, `"c"` for empty points joined by lines, `"o"` for
-#'   overplotted points and lines, `"s"` and `"S"` for stair steps, and `"h"`
-#'   for histogram-like vertical lines. Specifying `"n"` produces an empty plot
-#'   over the extent of the data, but with no internal elements (see also the
-#'   `empty` argument below).
-#'   - Additional tinyplot types:
-#'      - `"jitter"` (alias `"j"`) for jittered points.
-#'      - `"rect"`, `"segments"`, `"polygon"`, or `"polypath"`, which are all
-#'      equivalent to their base counterparts, but don't require an existing
-#'      plot window.
-#'      - `"boxplot"`, `"histogram"` (alias `"hist"`), or `"density"` for
-#'      distribution plots.
-#'      - `"pointrange"` or `"errorbar"` for segment intervals, and `"ribbon"`
-#'      or `"area"` for polygon intervals (where area plots are a special case
-#'      of ribbon plots with `ymin` set to 0 and `ymax` set to `y`; see below).
+#' @param type character string or call to a `type_*()` function giving the 
+#'   type of plot desired.
+#'   - NULL (default): Choose a sensible type for the type of `x` and `y` inputs 
+#'     (i.e., usually `"p"`).
+#'   - 1-character values supported by \code{\link[graphics]{plot}}: 
+#'     - `"p"` Points
+#'     - `"l"` Lines
+#'     - `"b"` Both points and lines
+#'     - `"c"` Empty points joined by lines
+#'     - `"o"` Overplotted points and lines
+#'     - `"s"` Stair steps
+#'     - `"S"` Stair steps
+#'     - `"h"` Histogram-like vertical lines
+#'     - `"n"` Empty plot over the extent of the data
+#'   - `tinyplot` types:
+#'      - `"rect"`, `"segments"`, or `"polygon"`: Equivalent to base `R`
+#'      - `"density"`: Kernel density plot
+#'      - `"jitter"` or `type_jitter()`: Jittered points
+#'      - `"polypath"` or `type_polypath()`
+#'      - `"boxplot"` or `type_boxplot()`
+#'      - `"histogram"` or `type_histogram()`
+#'      - `"pointrange"` or `"errorbar"`: segment intervals
+#'      - `"ribbon"` or `"area"` for polygon intervals (where area plots 
+#'        are a special case of ribbon plots with `ymin` set to 0 and `ymax` 
+#'        set to `y`; see below).
 #' @param xmin,xmax,ymin,ymax minimum and maximum coordinates of relevant area
 #'   or interval plot types. Only used when the `type` argument is one of
 #'   `"rect"` or `"segments"` (where all four min-max coordinates are required),
diff --git a/man/tinyplot.Rd b/man/tinyplot.Rd
index 54f6fe41..4f7d6f76 100644
--- a/man/tinyplot.Rd
+++ b/man/tinyplot.Rd
@@ -186,28 +186,35 @@ features globally for all \code{tinyplot} plots.
 \item{data}{a data.frame (or list) from which the variables in formula
 should be taken. A matrix is converted to a data frame.}
 
-\item{type}{character string giving the type of plot desired. If no argument
-is provided, then the plot type will default to something sensible for the
-type of \code{x} and \code{y} inputs (i.e., usually \code{"p"}). Options are:
+\item{type}{character string or call to a \verb{type_*()} function giving the
+type of plot desired.
 \itemize{
-\item The same set of 1-character values supported by
-\code{\link[graphics]{plot}}: \code{"p"} for points, \code{"l"} for lines, \code{"b"} for
-both points and lines, \code{"c"} for empty points joined by lines, \code{"o"} for
-overplotted points and lines, \code{"s"} and \code{"S"} for stair steps, and \code{"h"}
-for histogram-like vertical lines. Specifying \code{"n"} produces an empty plot
-over the extent of the data, but with no internal elements (see also the
-\code{empty} argument below).
-\item Additional tinyplot types:
+\item NULL (default): Choose a sensible type for the type of \code{x} and \code{y} inputs
+(i.e., usually \code{"p"}).
+\item 1-character values supported by \code{\link[graphics]{plot}}:
 \itemize{
-\item \code{"jitter"} (alias \code{"j"}) for jittered points.
-\item \code{"rect"}, \code{"segments"}, \code{"polygon"}, or \code{"polypath"}, which are all
-equivalent to their base counterparts, but don't require an existing
-plot window.
-\item \code{"boxplot"}, \code{"histogram"} (alias \code{"hist"}), or \code{"density"} for
-distribution plots.
-\item \code{"pointrange"} or \code{"errorbar"} for segment intervals, and \code{"ribbon"}
-or \code{"area"} for polygon intervals (where area plots are a special case
-of ribbon plots with \code{ymin} set to 0 and \code{ymax} set to \code{y}; see below).
+\item \code{"p"} Points
+\item \code{"l"} Lines
+\item \code{"b"} Both points and lines
+\item \code{"c"} Empty points joined by lines
+\item \code{"o"} Overplotted points and lines
+\item \code{"s"} Stair steps
+\item \code{"S"} Stair steps
+\item \code{"h"} Histogram-like vertical lines
+\item \code{"n"} Empty plot over the extent of the data
+}
+\item \code{tinyplot} types:
+\itemize{
+\item \code{"rect"}, \code{"segments"}, or \code{"polygon"}: Equivalent to base \code{R}
+\item \code{"density"}: Kernel density plot
+\item \code{"jitter"} or \code{type_jitter()}: Jittered points
+\item \code{"polypath"} or \code{type_polypath()}
+\item \code{"boxplot"} or \code{type_boxplot()}
+\item \code{"histogram"} or \code{type_histogram()}
+\item \code{"pointrange"} or \code{"errorbar"}: segment intervals
+\item \code{"ribbon"} or \code{"area"} for polygon intervals (where area plots
+are a special case of ribbon plots with \code{ymin} set to 0 and \code{ymax}
+set to \code{y}; see below).
 }
 }}
 

From 7277ceee8bcd56fbdb9eab51d7608b9fdcb5c19d Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Tue, 8 Oct 2024 07:09:32 -0400
Subject: [PATCH 67/72] type_model() snapshots

---
 inst/tinytest/_tinysnapshot/model_glm_50.svg  |  55 +++++
 inst/tinytest/_tinysnapshot/model_glm_80.svg  |  57 +++++
 inst/tinytest/_tinysnapshot/model_glm_95.svg  |  57 +++++
 inst/tinytest/_tinysnapshot/model_glm_by.svg  |  92 +++++++
 .../_tinysnapshot/model_glm_facet.svg         | 224 ++++++++++++++++++
 inst/tinytest/_tinysnapshot/model_lm_50.svg   |  59 +++++
 inst/tinytest/_tinysnapshot/model_lm_80.svg   |  61 +++++
 inst/tinytest/_tinysnapshot/model_lm_95.svg   |  61 +++++
 inst/tinytest/_tinysnapshot/model_lm_by.svg   |  88 +++++++
 .../tinytest/_tinysnapshot/model_lm_facet.svg | 204 ++++++++++++++++
 .../tinytest/_tinysnapshot/model_loess_by.svg |  82 +++++++
 .../_tinysnapshot/model_loess_facet.svg       | 219 +++++++++++++++++
 inst/tinytest/test-models.R                   |  60 +++++
 13 files changed, 1319 insertions(+)
 create mode 100644 inst/tinytest/_tinysnapshot/model_glm_50.svg
 create mode 100644 inst/tinytest/_tinysnapshot/model_glm_80.svg
 create mode 100644 inst/tinytest/_tinysnapshot/model_glm_95.svg
 create mode 100644 inst/tinytest/_tinysnapshot/model_glm_by.svg
 create mode 100644 inst/tinytest/_tinysnapshot/model_glm_facet.svg
 create mode 100644 inst/tinytest/_tinysnapshot/model_lm_50.svg
 create mode 100644 inst/tinytest/_tinysnapshot/model_lm_80.svg
 create mode 100644 inst/tinytest/_tinysnapshot/model_lm_95.svg
 create mode 100644 inst/tinytest/_tinysnapshot/model_lm_by.svg
 create mode 100644 inst/tinytest/_tinysnapshot/model_lm_facet.svg
 create mode 100644 inst/tinytest/_tinysnapshot/model_loess_by.svg
 create mode 100644 inst/tinytest/_tinysnapshot/model_loess_facet.svg
 create mode 100644 inst/tinytest/test-models.R

diff --git a/inst/tinytest/_tinysnapshot/model_glm_50.svg b/inst/tinytest/_tinysnapshot/model_glm_50.svg
new file mode 100644
index 00000000..6d057441
--- /dev/null
+++ b/inst/tinytest/_tinysnapshot/model_glm_50.svg
@@ -0,0 +1,55 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' class='svglite' width='504.00pt' height='504.00pt' viewBox='0 0 504.00 504.00'>
+<defs>
+  <style type='text/css'><![CDATA[
+    .svglite line, .svglite polyline, .svglite polygon, .svglite path, .svglite rect, .svglite circle {
+      fill: none;
+      stroke: #000000;
+      stroke-linecap: round;
+      stroke-linejoin: round;
+      stroke-miterlimit: 10.00;
+    }
+    .svglite text {
+      white-space: pre;
+    }
+  ]]></style>
+</defs>
+<rect width='100%' height='100%' style='stroke: none; fill: #FFFFFF;'/>
+<defs>
+  <clipPath id='cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='504.00' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<text x='266.40' y='485.28' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='27.34px' lengthAdjust='spacingAndGlyphs'>Wind</text>
+<text transform='translate(12.96,244.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='67.70px' lengthAdjust='spacingAndGlyphs'>I(Temp &gt; 80)</text>
+<line x1='141.09' y1='430.56' x2='444.25' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='141.09' y1='430.56' x2='141.09' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='242.15' y1='430.56' x2='242.15' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='343.20' y1='430.56' x2='343.20' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='444.25' y1='430.56' x2='444.25' y2='437.76' style='stroke-width: 0.75;' />
+<text x='141.09' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='242.15' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='343.20' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='444.25' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>20</text>
+<line x1='59.04' y1='350.35' x2='59.04' y2='106.80' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='350.35' x2='51.84' y2='350.35' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='269.17' x2='51.84' y2='269.17' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='187.99' x2='51.84' y2='187.99' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='106.80' x2='51.84' y2='106.80' style='stroke-width: 0.75;' />
+<text transform='translate(41.76,350.35) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.2</text>
+<text transform='translate(41.76,269.17) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.4</text>
+<text transform='translate(41.76,187.99) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.6</text>
+<text transform='translate(41.76,106.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.8</text>
+<polygon points='59.04,430.56 473.76,430.56 473.76,59.04 59.04,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpNTkuMDR8NDczLjc2fDU5LjA0fDQzMC41Ng=='>
+    <rect x='59.04' y='59.04' width='414.72' height='371.52' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpNTkuMDR8NDczLjc2fDU5LjA0fDQzMC41Ng==)'>
+<polygon points='74.40,107.80 78.28,110.37 82.16,113.00 86.04,115.69 89.92,118.45 93.79,121.26 97.67,124.13 101.55,127.07 105.43,130.07 109.31,133.12 113.19,136.24 117.07,139.41 120.95,142.65 124.82,145.94 128.70,149.29 132.58,152.70 136.46,156.16 140.34,159.68 144.22,163.26 148.10,166.88 151.98,170.56 155.85,174.30 159.73,178.08 163.61,181.91 167.49,185.79 171.37,189.72 175.25,193.69 179.13,197.71 183.01,201.78 186.88,205.89 190.76,210.04 194.64,214.23 198.52,218.47 202.40,222.74 206.28,227.06 210.16,231.41 214.04,235.80 217.92,240.22 221.79,244.67 225.67,249.16 229.55,253.67 233.43,258.20 237.31,262.75 241.19,267.31 245.07,271.87 248.95,276.44 252.82,280.99 256.70,285.52 260.58,290.03 264.46,294.51 268.34,298.95 272.22,303.34 276.10,307.67 279.98,311.95 283.85,316.15 287.73,320.28 291.61,324.34 295.49,328.31 299.37,332.20 303.25,336.00 307.13,339.71 311.01,343.32 314.88,346.83 318.76,350.25 322.64,353.57 326.52,356.79 330.40,359.91 334.28,362.93 338.16,365.86 342.04,368.68 345.92,371.41 349.79,374.04 353.67,376.58 357.55,379.02 361.43,381.38 365.31,383.64 369.19,385.82 373.07,387.91 376.95,389.91 380.82,391.84 384.70,393.69 388.58,395.46 392.46,397.15 396.34,398.78 400.22,400.33 404.10,401.82 407.98,403.24 411.85,404.60 415.73,405.90 419.61,407.14 423.49,408.32 427.37,409.45 431.25,410.53 435.13,411.56 439.01,412.54 442.88,413.48 446.76,414.37 450.64,415.22 454.52,416.03 458.40,416.80 458.40,397.19 454.52,395.96 450.64,394.68 446.76,393.37 442.88,392.02 439.01,390.62 435.13,389.18 431.25,387.69 427.37,386.16 423.49,384.58 419.61,382.95 415.73,381.27 411.85,379.54 407.98,377.76 404.10,375.93 400.22,374.04 396.34,372.10 392.46,370.11 388.58,368.06 384.70,365.95 380.82,363.79 376.95,361.57 373.07,359.29 369.19,356.95 365.31,354.54 361.43,352.08 357.55,349.56 353.67,346.97 349.79,344.32 345.92,341.61 342.04,338.84 338.16,336.00 334.28,333.09 330.40,330.13 326.52,327.09 322.64,323.99 318.76,320.83 314.88,317.60 311.01,314.31 307.13,310.95 303.25,307.53 299.37,304.04 295.49,300.48 291.61,296.86 287.73,293.17 283.85,289.42 279.98,285.60 276.10,281.71 272.22,277.75 268.34,273.73 264.46,269.63 260.58,265.47 256.70,261.25 252.82,256.95 248.95,252.59 245.07,248.16 241.19,243.66 237.31,239.11 233.43,234.49 229.55,229.82 225.67,225.10 221.79,220.34 217.92,215.55 214.04,210.72 210.16,205.87 206.28,201.02 202.40,196.15 198.52,191.30 194.64,186.45 190.76,181.63 186.88,176.84 183.01,172.09 179.13,167.38 175.25,162.73 171.37,158.14 167.49,153.61 163.61,149.16 159.73,144.78 155.85,140.49 151.98,136.28 148.10,132.16 144.22,128.13 140.34,124.20 136.46,120.37 132.58,116.64 128.70,113.01 124.82,109.48 120.95,106.05 117.07,102.73 113.19,99.51 109.31,96.39 105.43,93.38 101.55,90.46 97.67,87.65 93.79,84.94 89.92,82.32 86.04,79.80 82.16,77.38 78.28,75.04 74.40,72.80 ' style='stroke-width: 0.75; stroke: none; fill: #000000; fill-opacity: 0.20;' />
+<polyline points='74.40,88.33 78.28,90.79 82.16,93.34 86.04,95.96 89.92,98.66 93.79,101.44 97.67,104.30 101.55,107.24 105.43,110.27 109.31,113.37 113.19,116.56 117.07,119.83 120.95,123.18 124.82,126.61 128.70,130.12 132.58,133.71 136.46,137.38 140.34,141.12 144.22,144.94 148.10,148.83 151.98,152.79 155.85,156.82 159.73,160.92 163.61,165.08 167.49,169.30 171.37,173.57 175.25,177.90 179.13,182.28 183.01,186.70 186.88,191.17 190.76,195.67 194.64,200.21 198.52,204.77 202.40,209.36 206.28,213.98 210.16,218.60 214.04,223.24 217.92,227.88 221.79,232.52 225.67,237.16 229.55,241.79 233.43,246.41 237.31,251.00 241.19,255.58 245.07,260.13 248.95,264.64 252.82,269.12 256.70,273.55 260.58,277.95 264.46,282.29 268.34,286.58 272.22,290.82 276.10,294.99 279.98,299.11 283.85,303.16 287.73,307.14 291.61,311.05 295.49,314.89 299.37,318.66 303.25,322.35 307.13,325.96 311.01,329.50 314.88,332.95 318.76,336.33 322.64,339.62 326.52,342.83 330.40,345.96 334.28,349.01 338.16,351.98 342.04,354.87 345.92,357.67 349.79,360.40 353.67,363.04 357.55,365.61 361.43,368.10 365.31,370.51 369.19,372.84 373.07,375.10 376.95,377.29 380.82,379.40 384.70,381.45 388.58,383.42 392.46,385.33 396.34,387.17 400.22,388.95 404.10,390.66 407.98,392.31 411.85,393.90 415.73,395.44 419.61,396.91 423.49,398.33 427.37,399.70 431.25,401.02 435.13,402.29 439.01,403.50 442.88,404.67 446.76,405.80 450.64,406.88 454.52,407.92 458.40,408.92 ' style='stroke-width: 0.75;' />
+</g>
+</svg>
diff --git a/inst/tinytest/_tinysnapshot/model_glm_80.svg b/inst/tinytest/_tinysnapshot/model_glm_80.svg
new file mode 100644
index 00000000..33fbbc8b
--- /dev/null
+++ b/inst/tinytest/_tinysnapshot/model_glm_80.svg
@@ -0,0 +1,57 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' class='svglite' width='504.00pt' height='504.00pt' viewBox='0 0 504.00 504.00'>
+<defs>
+  <style type='text/css'><![CDATA[
+    .svglite line, .svglite polyline, .svglite polygon, .svglite path, .svglite rect, .svglite circle {
+      fill: none;
+      stroke: #000000;
+      stroke-linecap: round;
+      stroke-linejoin: round;
+      stroke-miterlimit: 10.00;
+    }
+    .svglite text {
+      white-space: pre;
+    }
+  ]]></style>
+</defs>
+<rect width='100%' height='100%' style='stroke: none; fill: #FFFFFF;'/>
+<defs>
+  <clipPath id='cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='504.00' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<text x='266.40' y='485.28' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='27.34px' lengthAdjust='spacingAndGlyphs'>Wind</text>
+<text transform='translate(12.96,244.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='67.70px' lengthAdjust='spacingAndGlyphs'>I(Temp &gt; 80)</text>
+<line x1='141.09' y1='430.56' x2='444.25' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='141.09' y1='430.56' x2='141.09' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='242.15' y1='430.56' x2='242.15' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='343.20' y1='430.56' x2='343.20' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='444.25' y1='430.56' x2='444.25' y2='437.76' style='stroke-width: 0.75;' />
+<text x='141.09' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='242.15' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='343.20' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='444.25' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>20</text>
+<line x1='59.04' y1='426.31' x2='59.04' y2='115.87' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='426.31' x2='51.84' y2='426.31' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='348.70' x2='51.84' y2='348.70' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='271.09' x2='51.84' y2='271.09' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='193.48' x2='51.84' y2='193.48' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='115.87' x2='51.84' y2='115.87' style='stroke-width: 0.75;' />
+<text transform='translate(41.76,426.31) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.0</text>
+<text transform='translate(41.76,348.70) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.2</text>
+<text transform='translate(41.76,271.09) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.4</text>
+<text transform='translate(41.76,193.48) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.6</text>
+<text transform='translate(41.76,115.87) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.8</text>
+<polygon points='59.04,430.56 473.76,430.56 473.76,59.04 59.04,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpNTkuMDR8NDczLjc2fDU5LjA0fDQzMC41Ng=='>
+    <rect x='59.04' y='59.04' width='414.72' height='371.52' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpNTkuMDR8NDczLjc2fDU5LjA0fDQzMC41Ng==)'>
+<polygon points='74.40,137.08 78.28,139.49 82.16,141.94 86.04,144.44 89.92,146.97 93.79,149.55 97.67,152.17 101.55,154.83 105.43,157.52 109.31,160.26 113.19,163.04 117.07,165.86 120.95,168.72 124.82,171.62 128.70,174.56 132.58,177.54 136.46,180.56 140.34,183.61 144.22,186.71 148.10,189.85 151.98,193.02 155.85,196.24 159.73,199.50 163.61,202.80 167.49,206.14 171.37,209.53 175.25,212.95 179.13,216.43 183.01,219.95 186.88,223.52 190.76,227.13 194.64,230.80 198.52,234.53 202.40,238.31 206.28,242.14 210.16,246.03 214.04,249.99 217.92,254.00 221.79,258.07 225.67,262.20 229.55,266.39 233.43,270.63 237.31,274.91 241.19,279.23 245.07,283.58 248.95,287.95 252.82,292.34 256.70,296.72 260.58,301.10 264.46,305.45 268.34,309.78 272.22,314.06 276.10,318.28 279.98,322.45 283.85,326.55 287.73,330.57 291.61,334.50 295.49,338.35 299.37,342.10 303.25,345.76 307.13,349.31 311.01,352.75 314.88,356.09 318.76,359.32 322.64,362.45 326.52,365.46 330.40,368.36 334.28,371.15 338.16,373.84 342.04,376.42 345.92,378.90 349.79,381.27 353.67,383.54 357.55,385.72 361.43,387.80 365.31,389.78 369.19,391.68 373.07,393.49 376.95,395.21 380.82,396.86 384.70,398.42 388.58,399.91 392.46,401.32 396.34,402.67 400.22,403.95 404.10,405.16 407.98,406.31 411.85,407.41 415.73,408.44 419.61,409.43 423.49,410.36 427.37,411.24 431.25,412.08 435.13,412.87 439.01,413.62 442.88,414.33 446.76,415.00 450.64,415.63 454.52,416.23 458.40,416.80 458.40,379.04 454.52,377.70 450.64,376.32 446.76,374.90 442.88,373.46 439.01,371.97 435.13,370.46 431.25,368.90 427.37,367.31 423.49,365.68 419.61,364.01 415.73,362.31 411.85,360.56 407.98,358.78 404.10,356.96 400.22,355.09 396.34,353.19 392.46,351.24 388.58,349.26 384.70,347.23 380.82,345.16 376.95,343.04 373.07,340.88 369.19,338.68 365.31,336.44 361.43,334.14 357.55,331.81 353.67,329.43 349.79,327.00 345.92,324.52 342.04,322.00 338.16,319.44 334.28,316.82 330.40,314.15 326.52,311.44 322.64,308.68 318.76,305.86 314.88,302.99 311.01,300.07 307.13,297.10 303.25,294.07 299.37,290.99 295.49,287.84 291.61,284.64 287.73,281.37 283.85,278.04 279.98,274.64 276.10,271.17 272.22,267.63 268.34,264.01 264.46,260.31 260.58,256.53 256.70,252.67 252.82,248.71 248.95,244.67 245.07,240.54 241.19,236.32 237.31,232.00 233.43,227.60 229.55,223.12 225.67,218.56 221.79,213.93 217.92,209.25 214.04,204.51 210.16,199.73 206.28,194.92 202.40,190.10 198.52,185.27 194.64,180.45 190.76,175.65 186.88,170.88 183.01,166.15 179.13,161.48 175.25,156.87 171.37,152.33 167.49,147.87 163.61,143.49 159.73,139.20 155.85,135.02 151.98,130.93 148.10,126.96 144.22,123.09 140.34,119.33 136.46,115.69 132.58,112.17 128.70,108.76 124.82,105.47 120.95,102.30 117.07,99.24 113.19,96.30 109.31,93.47 105.43,90.75 101.55,88.15 97.67,85.65 93.79,83.26 89.92,80.97 86.04,78.79 82.16,76.70 78.28,74.70 74.40,72.80 ' style='stroke-width: 0.75; stroke: none; fill: #000000; fill-opacity: 0.20;' />
+<polyline points='74.40,98.21 78.28,100.56 82.16,102.99 86.04,105.50 89.92,108.08 93.79,110.74 97.67,113.47 101.55,116.29 105.43,119.18 109.31,122.15 113.19,125.20 117.07,128.32 120.95,131.52 124.82,134.81 128.70,138.16 132.58,141.59 136.46,145.10 140.34,148.68 144.22,152.33 148.10,156.05 151.98,159.83 155.85,163.69 159.73,167.60 163.61,171.58 167.49,175.61 171.37,179.70 175.25,183.83 179.13,188.02 183.01,192.25 186.88,196.52 190.76,200.82 194.64,205.16 198.52,209.53 202.40,213.91 206.28,218.32 210.16,222.74 214.04,227.18 217.92,231.61 221.79,236.05 225.67,240.49 229.55,244.91 233.43,249.33 237.31,253.72 241.19,258.09 245.07,262.44 248.95,266.76 252.82,271.04 256.70,275.28 260.58,279.48 264.46,283.63 268.34,287.73 272.22,291.78 276.10,295.77 279.98,299.71 283.85,303.58 287.73,307.38 291.61,311.12 295.49,314.80 299.37,318.40 303.25,321.92 307.13,325.38 311.01,328.76 314.88,332.06 318.76,335.29 322.64,338.44 326.52,341.51 330.40,344.50 334.28,347.42 338.16,350.25 342.04,353.01 345.92,355.69 349.79,358.30 353.67,360.83 357.55,363.28 361.43,365.66 365.31,367.96 369.19,370.19 373.07,372.35 376.95,374.45 380.82,376.47 384.70,378.42 388.58,380.31 392.46,382.13 396.34,383.89 400.22,385.59 404.10,387.23 407.98,388.81 411.85,390.33 415.73,391.79 419.61,393.21 423.49,394.56 427.37,395.87 431.25,397.13 435.13,398.34 439.01,399.51 442.88,400.63 446.76,401.70 450.64,402.74 454.52,403.73 458.40,404.68 ' style='stroke-width: 0.75;' />
+</g>
+</svg>
diff --git a/inst/tinytest/_tinysnapshot/model_glm_95.svg b/inst/tinytest/_tinysnapshot/model_glm_95.svg
new file mode 100644
index 00000000..fcdf5072
--- /dev/null
+++ b/inst/tinytest/_tinysnapshot/model_glm_95.svg
@@ -0,0 +1,57 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' class='svglite' width='504.00pt' height='504.00pt' viewBox='0 0 504.00 504.00'>
+<defs>
+  <style type='text/css'><![CDATA[
+    .svglite line, .svglite polyline, .svglite polygon, .svglite path, .svglite rect, .svglite circle {
+      fill: none;
+      stroke: #000000;
+      stroke-linecap: round;
+      stroke-linejoin: round;
+      stroke-miterlimit: 10.00;
+    }
+    .svglite text {
+      white-space: pre;
+    }
+  ]]></style>
+</defs>
+<rect width='100%' height='100%' style='stroke: none; fill: #FFFFFF;'/>
+<defs>
+  <clipPath id='cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='504.00' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<text x='266.40' y='485.28' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='27.34px' lengthAdjust='spacingAndGlyphs'>Wind</text>
+<text transform='translate(12.96,244.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='67.70px' lengthAdjust='spacingAndGlyphs'>I(Temp &gt; 80)</text>
+<line x1='141.09' y1='430.56' x2='444.25' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='141.09' y1='430.56' x2='141.09' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='242.15' y1='430.56' x2='242.15' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='343.20' y1='430.56' x2='343.20' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='444.25' y1='430.56' x2='444.25' y2='437.76' style='stroke-width: 0.75;' />
+<text x='141.09' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='242.15' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='343.20' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='444.25' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>20</text>
+<line x1='59.04' y1='422.66' x2='59.04' y2='123.21' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='422.66' x2='51.84' y2='422.66' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='347.79' x2='51.84' y2='347.79' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='272.93' x2='51.84' y2='272.93' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='198.07' x2='51.84' y2='198.07' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='123.21' x2='51.84' y2='123.21' style='stroke-width: 0.75;' />
+<text transform='translate(41.76,422.66) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.0</text>
+<text transform='translate(41.76,347.79) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.2</text>
+<text transform='translate(41.76,272.93) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.4</text>
+<text transform='translate(41.76,198.07) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.6</text>
+<text transform='translate(41.76,123.21) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.8</text>
+<polygon points='59.04,430.56 473.76,430.56 473.76,59.04 59.04,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpNTkuMDR8NDczLjc2fDU5LjA0fDQzMC41Ng=='>
+    <rect x='59.04' y='59.04' width='414.72' height='371.52' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpNTkuMDR8NDczLjc2fDU5LjA0fDQzMC41Ng==)'>
+<polygon points='74.40,169.32 78.28,171.41 82.16,173.53 86.04,175.66 89.92,177.82 93.79,180.01 97.67,182.22 101.55,184.45 105.43,186.71 109.31,188.99 113.19,191.30 117.07,193.64 120.95,196.00 124.82,198.39 128.70,200.80 132.58,203.25 136.46,205.72 140.34,208.22 144.22,210.75 148.10,213.32 151.98,215.92 155.85,218.55 159.73,221.22 163.61,223.93 167.49,226.69 171.37,229.48 175.25,232.33 179.13,235.22 183.01,238.17 186.88,241.18 190.76,244.25 194.64,247.38 198.52,250.59 202.40,253.87 206.28,257.23 210.16,260.67 214.04,264.20 217.92,267.81 221.79,271.52 225.67,275.31 229.55,279.18 233.43,283.14 237.31,287.18 241.19,291.28 245.07,295.43 248.95,299.63 252.82,303.86 256.70,308.10 260.58,312.35 264.46,316.59 268.34,320.80 272.22,324.96 276.10,329.08 279.98,333.13 283.85,337.11 287.73,341.00 291.61,344.79 295.49,348.49 299.37,352.08 303.25,355.56 307.13,358.93 311.01,362.18 314.88,365.30 318.76,368.31 322.64,371.20 326.52,373.97 330.40,376.62 334.28,379.16 338.16,381.58 342.04,383.89 345.92,386.08 349.79,388.17 353.67,390.16 357.55,392.04 361.43,393.83 365.31,395.53 369.19,397.13 373.07,398.65 376.95,400.09 380.82,401.45 384.70,402.73 388.58,403.94 392.46,405.08 396.34,406.16 400.22,407.17 404.10,408.12 407.98,409.02 411.85,409.87 415.73,410.67 419.61,411.41 423.49,412.12 427.37,412.78 431.25,413.40 435.13,413.98 439.01,414.53 442.88,415.04 446.76,415.53 450.64,415.98 454.52,416.40 458.40,416.80 458.40,355.39 454.52,354.02 450.64,352.63 446.76,351.21 442.88,349.76 439.01,348.29 435.13,346.80 431.25,345.29 427.37,343.75 423.49,342.18 419.61,340.59 415.73,338.98 411.85,337.34 407.98,335.67 404.10,333.98 400.22,332.26 396.34,330.52 392.46,328.75 388.58,326.95 384.70,325.12 380.82,323.27 376.95,321.39 373.07,319.48 369.19,317.54 365.31,315.57 361.43,313.57 357.55,311.54 353.67,309.48 349.79,307.39 345.92,305.26 342.04,303.10 338.16,300.91 334.28,298.68 330.40,296.42 326.52,294.12 322.64,291.77 318.76,289.39 314.88,286.96 311.01,284.49 307.13,281.97 303.25,279.40 299.37,276.78 295.49,274.10 291.61,271.36 287.73,268.56 283.85,265.69 279.98,262.74 276.10,259.72 272.22,256.61 268.34,253.42 264.46,250.12 260.58,246.73 256.70,243.23 252.82,239.62 248.95,235.89 245.07,232.04 241.19,228.08 237.31,223.99 233.43,219.79 229.55,215.47 225.67,211.05 221.79,206.54 217.92,201.94 214.04,197.27 210.16,192.54 206.28,187.77 202.40,182.98 198.52,178.17 194.64,173.38 190.76,168.60 186.88,163.86 183.01,159.18 179.13,154.55 175.25,150.01 171.37,145.55 167.49,141.18 163.61,136.92 159.73,132.77 155.85,128.74 151.98,124.83 148.10,121.04 144.22,117.39 140.34,113.86 136.46,110.46 132.58,107.20 128.70,104.07 124.82,101.07 120.95,98.20 117.07,95.46 113.19,92.84 109.31,90.34 105.43,87.96 101.55,85.70 97.67,83.55 93.79,81.51 89.92,79.57 86.04,77.74 82.16,76.00 78.28,74.36 74.40,72.80 ' style='stroke-width: 0.75; stroke: none; fill: #000000; fill-opacity: 0.20;' />
+<polyline points='74.40,106.17 78.28,108.44 82.16,110.79 86.04,113.20 89.92,115.69 93.79,118.26 97.67,120.90 101.55,123.61 105.43,126.40 109.31,129.26 113.19,132.20 117.07,135.22 120.95,138.31 124.82,141.47 128.70,144.71 132.58,148.02 136.46,151.40 140.34,154.85 144.22,158.38 148.10,161.96 151.98,165.62 155.85,169.33 159.73,173.11 163.61,176.94 167.49,180.83 171.37,184.77 175.25,188.77 179.13,192.80 183.01,196.88 186.88,201.00 190.76,205.15 194.64,209.34 198.52,213.55 202.40,217.78 206.28,222.03 210.16,226.30 214.04,230.58 217.92,234.86 221.79,239.14 225.67,243.41 229.55,247.68 233.43,251.94 237.31,256.18 241.19,260.40 245.07,264.59 248.95,268.75 252.82,272.88 256.70,276.97 260.58,281.02 264.46,285.03 268.34,288.99 272.22,292.89 276.10,296.74 279.98,300.54 283.85,304.27 287.73,307.95 291.61,311.55 295.49,315.09 299.37,318.57 303.25,321.97 307.13,325.30 311.01,328.56 314.88,331.75 318.76,334.86 322.64,337.90 326.52,340.86 330.40,343.75 334.28,346.56 338.16,349.30 342.04,351.96 345.92,354.54 349.79,357.06 353.67,359.50 357.55,361.86 361.43,364.16 365.31,366.38 369.19,368.53 373.07,370.62 376.95,372.63 380.82,374.58 384.70,376.47 388.58,378.29 392.46,380.05 396.34,381.74 400.22,383.38 404.10,384.96 407.98,386.48 411.85,387.95 415.73,389.37 419.61,390.73 423.49,392.04 427.37,393.30 431.25,394.52 435.13,395.68 439.01,396.81 442.88,397.89 446.76,398.92 450.64,399.92 454.52,400.88 458.40,401.80 ' style='stroke-width: 0.75;' />
+</g>
+</svg>
diff --git a/inst/tinytest/_tinysnapshot/model_glm_by.svg b/inst/tinytest/_tinysnapshot/model_glm_by.svg
new file mode 100644
index 00000000..fa012752
--- /dev/null
+++ b/inst/tinytest/_tinysnapshot/model_glm_by.svg
@@ -0,0 +1,92 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' class='svglite' width='504.00pt' height='504.00pt' viewBox='0 0 504.00 504.00'>
+<defs>
+  <style type='text/css'><![CDATA[
+    .svglite line, .svglite polyline, .svglite polygon, .svglite path, .svglite rect, .svglite circle {
+      fill: none;
+      stroke: #000000;
+      stroke-linecap: round;
+      stroke-linejoin: round;
+      stroke-miterlimit: 10.00;
+    }
+    .svglite text {
+      white-space: pre;
+    }
+  ]]></style>
+</defs>
+<rect width='100%' height='100%' style='stroke: none; fill: #FFFFFF;'/>
+<defs>
+  <clipPath id='cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='504.00' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='447.61' y1='217.80' x2='461.11' y2='217.80' style='stroke-width: 0.75;' />
+<line x1='447.61' y1='235.80' x2='461.11' y2='235.80' style='stroke-width: 0.75; stroke: #DF536B;' />
+<line x1='447.61' y1='253.80' x2='461.11' y2='253.80' style='stroke-width: 0.75; stroke: #61D04F;' />
+<line x1='447.61' y1='271.80' x2='461.11' y2='271.80' style='stroke-width: 0.75; stroke: #2297E6;' />
+<line x1='447.61' y1='289.80' x2='461.11' y2='289.80' style='stroke-width: 0.75; stroke: #28E2E5;' />
+<rect x='445.98' y='209.43' width='16.75' height='16.75' style='stroke-width: 0.00; fill: #000000; fill-opacity: 0.20;' />
+<rect x='445.98' y='227.43' width='16.75' height='16.75' style='stroke-width: 0.00; stroke: #DF536B; fill: #DF536B; fill-opacity: 0.20;' />
+<rect x='445.98' y='245.43' width='16.75' height='16.75' style='stroke-width: 0.00; stroke: #61D04F; fill: #61D04F; fill-opacity: 0.20;' />
+<rect x='445.98' y='263.43' width='16.75' height='16.75' style='stroke-width: 0.00; stroke: #2297E6; fill: #2297E6; fill-opacity: 0.20;' />
+<rect x='445.98' y='281.43' width='16.75' height='16.75' style='stroke-width: 0.00; stroke: #28E2E5; fill: #28E2E5; fill-opacity: 0.20;' />
+<text x='464.18' y='198.00' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='71.37px' lengthAdjust='spacingAndGlyphs'>factor(Month)</text>
+<text x='471.91' y='221.93' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='471.91' y='239.93' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>6</text>
+<text x='471.91' y='257.93' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>7</text>
+<text x='471.91' y='275.93' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>8</text>
+<text x='471.91' y='293.93' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>9</text>
+</g>
+<defs>
+  <clipPath id='cpMC4wMHw0MTEuMzl8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='411.39' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw0MTEuMzl8MC4wMHw1MDQuMDA=)'>
+<text x='235.22' y='485.28' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='27.34px' lengthAdjust='spacingAndGlyphs'>Wind</text>
+<text transform='translate(12.96,244.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='67.70px' lengthAdjust='spacingAndGlyphs'>I(Temp &gt; 80)</text>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='128.76' y1='430.56' x2='386.32' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='128.76' y1='430.56' x2='128.76' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='214.61' y1='430.56' x2='214.61' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='300.47' y1='430.56' x2='300.47' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='386.32' y1='430.56' x2='386.32' y2='437.76' style='stroke-width: 0.75;' />
+<text x='128.76' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='214.61' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='300.47' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='386.32' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>20</text>
+<line x1='59.04' y1='416.81' x2='59.04' y2='72.68' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='416.81' x2='51.84' y2='416.81' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='347.98' x2='51.84' y2='347.98' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='279.15' x2='51.84' y2='279.15' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='210.33' x2='51.84' y2='210.33' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='141.50' x2='51.84' y2='141.50' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='72.68' x2='51.84' y2='72.68' style='stroke-width: 0.75;' />
+<text transform='translate(41.76,416.81) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.0</text>
+<text transform='translate(41.76,347.98) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.2</text>
+<text transform='translate(41.76,279.15) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.4</text>
+<text transform='translate(41.76,210.33) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.6</text>
+<text transform='translate(41.76,141.50) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.8</text>
+<text transform='translate(41.76,72.68) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>1.0</text>
+<polygon points='59.04,430.56 411.39,430.56 411.39,59.04 59.04,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpNTkuMDR8NDExLjM5fDU5LjA0fDQzMC41Ng=='>
+    <rect x='59.04' y='59.04' width='352.35' height='371.52' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpNTkuMDR8NDExLjM5fDU5LjA0fDQzMC41Ng==)'>
+<polygon points='140.78,416.80 143.27,416.80 145.77,416.80 148.27,416.80 150.77,416.80 153.26,416.80 155.76,416.79 158.26,416.79 160.76,416.79 163.25,416.79 165.75,416.79 168.25,416.78 170.75,416.78 173.24,416.78 175.74,416.78 178.24,416.77 180.74,416.77 183.23,416.76 185.73,416.76 188.23,416.75 190.73,416.75 193.23,416.74 195.72,416.73 198.22,416.73 200.72,416.72 203.22,416.71 205.71,416.70 208.21,416.68 210.71,416.67 213.21,416.66 215.70,416.64 218.20,416.62 220.70,416.60 223.20,416.58 225.69,416.55 228.19,416.53 230.69,416.50 233.19,416.47 235.69,416.43 238.18,416.40 240.68,416.36 243.18,416.31 245.68,416.27 248.17,416.22 250.67,416.16 253.17,416.11 255.67,416.04 258.16,415.98 260.66,415.91 263.16,415.84 265.66,415.77 268.15,415.69 270.65,415.61 273.15,415.52 275.65,415.44 278.14,415.35 280.64,415.27 283.14,415.18 285.64,415.09 288.14,415.01 290.63,414.92 293.13,414.84 295.63,414.77 298.13,414.69 300.62,414.63 303.12,414.56 305.62,414.51 308.12,414.46 310.61,414.41 313.11,414.37 315.61,414.34 318.11,414.32 320.60,414.30 323.10,414.29 325.60,414.29 328.10,414.29 330.60,414.30 333.09,414.31 335.59,414.33 338.09,414.35 340.59,414.38 343.08,414.41 345.58,414.45 348.08,414.48 350.58,414.53 353.07,414.57 355.57,414.62 358.07,414.66 360.57,414.71 363.06,414.76 365.56,414.81 368.06,414.87 370.56,414.92 373.05,414.97 375.55,415.02 378.05,415.07 380.55,415.13 383.05,415.18 385.54,415.23 388.04,415.28 388.04,108.34 385.54,111.91 383.05,115.76 380.55,119.91 378.05,124.35 375.55,129.10 373.05,134.16 370.56,139.52 368.06,145.17 365.56,151.11 363.06,157.33 360.57,163.79 358.07,170.48 355.57,177.38 353.07,184.44 350.58,191.64 348.08,198.93 345.58,206.29 343.08,213.66 340.59,221.00 338.09,228.29 335.59,235.46 333.09,242.50 330.60,249.36 328.10,256.02 325.60,262.44 323.10,268.60 320.60,274.49 318.11,280.08 315.61,285.36 313.11,290.33 310.61,294.99 308.12,299.33 305.62,303.34 303.12,307.05 300.62,310.44 298.13,313.54 295.63,316.34 293.13,318.86 290.63,321.11 288.14,323.10 285.64,324.84 283.14,326.34 280.64,327.62 278.14,328.68 275.65,329.53 273.15,330.19 270.65,330.66 268.15,330.96 265.66,331.09 263.16,331.06 260.66,330.87 258.16,330.54 255.67,330.07 253.17,329.47 250.67,328.74 248.17,327.88 245.68,326.90 243.18,325.81 240.68,324.61 238.18,323.30 235.69,321.89 233.19,320.37 230.69,318.75 228.19,317.04 225.69,315.24 223.20,313.34 220.70,311.35 218.20,309.28 215.70,307.12 213.21,304.88 210.71,302.55 208.21,300.15 205.71,297.68 203.22,295.13 200.72,292.50 198.22,289.81 195.72,287.05 193.23,284.23 190.73,281.34 188.23,278.39 185.73,275.39 183.23,272.33 180.74,269.23 178.24,266.07 175.74,262.87 173.24,259.63 170.75,256.35 168.25,253.04 165.75,249.69 163.25,246.32 160.76,242.93 158.26,239.51 155.76,236.08 153.26,232.63 150.77,229.18 148.27,225.72 145.77,222.25 143.27,218.80 140.78,215.34 ' style='stroke-width: 0.75; stroke: none; fill: #000000; fill-opacity: 0.20;' />
+<polyline points='140.78,415.11 143.27,415.05 145.77,414.98 148.27,414.92 150.77,414.85 153.26,414.77 155.76,414.69 158.26,414.62 160.76,414.53 163.25,414.45 165.75,414.36 168.25,414.27 170.75,414.17 173.24,414.07 175.74,413.97 178.24,413.86 180.74,413.75 183.23,413.64 185.73,413.52 188.23,413.39 190.73,413.27 193.23,413.13 195.72,413.00 198.22,412.85 200.72,412.71 203.22,412.55 205.71,412.39 208.21,412.23 210.71,412.06 213.21,411.88 215.70,411.70 218.20,411.50 220.70,411.31 223.20,411.10 225.69,410.89 228.19,410.67 230.69,410.44 233.19,410.20 235.69,409.96 238.18,409.71 240.68,409.44 243.18,409.17 245.68,408.89 248.17,408.59 250.67,408.29 253.17,407.98 255.67,407.65 258.16,407.31 260.66,406.96 263.16,406.60 265.66,406.23 268.15,405.84 270.65,405.44 273.15,405.02 275.65,404.59 278.14,404.14 280.64,403.68 283.14,403.20 285.64,402.71 288.14,402.20 290.63,401.67 293.13,401.12 295.63,400.55 298.13,399.97 300.62,399.36 303.12,398.74 305.62,398.09 308.12,397.42 310.61,396.73 313.11,396.01 315.61,395.27 318.11,394.51 320.60,393.72 323.10,392.91 325.60,392.07 328.10,391.20 330.60,390.30 333.09,389.38 335.59,388.43 338.09,387.44 340.59,386.43 343.08,385.38 345.58,384.30 348.08,383.19 350.58,382.05 353.07,380.87 355.57,379.65 358.07,378.40 360.57,377.11 363.06,375.79 365.56,374.43 368.06,373.02 370.56,371.58 373.05,370.10 375.55,368.58 378.05,367.02 380.55,365.41 383.05,363.76 385.54,362.07 388.04,360.34 ' style='stroke-width: 0.75;' />
+<polygon points='72.09,377.70 75.39,376.83 78.68,375.96 81.98,375.08 85.27,374.18 88.57,373.28 91.86,372.37 95.16,371.45 98.45,370.52 101.75,369.59 105.05,368.65 108.34,367.71 111.64,366.76 114.93,365.82 118.23,364.87 121.52,363.93 124.82,362.99 128.11,362.06 131.41,361.14 134.70,360.23 138.00,359.33 141.30,358.45 144.59,357.59 147.89,356.75 151.18,355.94 154.48,355.17 157.77,354.43 161.07,353.73 164.36,353.08 167.66,352.49 170.95,351.95 174.25,351.48 177.55,351.08 180.84,350.76 184.14,350.53 187.43,350.39 190.73,350.34 194.02,350.40 197.32,350.57 200.61,350.86 203.91,351.26 207.21,351.77 210.50,352.41 213.80,353.16 217.09,354.02 220.39,354.99 223.68,356.07 226.98,357.24 230.27,358.50 233.57,359.84 236.86,361.24 240.16,362.70 243.46,364.21 246.75,365.76 250.05,367.34 253.34,368.93 256.64,370.54 259.93,372.15 263.23,373.76 266.52,375.36 269.82,376.94 273.11,378.49 276.41,380.03 279.71,381.53 283.00,383.00 286.30,384.44 289.59,385.83 292.89,387.19 296.18,388.51 299.48,389.78 302.77,391.02 306.07,392.21 309.37,393.36 312.66,394.46 315.96,395.53 319.25,396.55 322.55,397.53 325.84,398.47 329.14,399.38 332.43,400.24 335.73,401.07 339.02,401.86 342.32,402.61 345.62,403.33 348.91,404.02 352.21,404.67 355.50,405.30 358.80,405.89 362.09,406.46 365.39,407.00 368.68,407.51 371.98,408.00 375.28,408.46 378.57,408.91 381.87,409.32 385.16,409.72 388.46,410.10 391.75,410.46 395.05,410.80 398.34,411.12 398.34,162.57 395.05,164.32 391.75,166.08 388.46,167.85 385.16,169.64 381.87,171.44 378.57,173.26 375.28,175.09 371.98,176.93 368.68,178.79 365.39,180.65 362.09,182.52 358.80,184.40 355.50,186.28 352.21,188.17 348.91,190.06 345.62,191.96 342.32,193.85 339.02,195.75 335.73,197.64 332.43,199.53 329.14,201.41 325.84,203.29 322.55,205.16 319.25,207.01 315.96,208.85 312.66,210.67 309.37,212.47 306.07,214.25 302.77,216.01 299.48,217.73 296.18,219.42 292.89,221.08 289.59,222.70 286.30,224.27 283.00,225.80 279.71,227.27 276.41,228.69 273.11,230.03 269.82,231.31 266.52,232.52 263.23,233.63 259.93,234.66 256.64,235.59 253.34,236.41 250.05,237.11 246.75,237.69 243.46,238.13 240.16,238.43 236.86,238.58 233.57,238.56 230.27,238.38 226.98,238.01 223.68,237.46 220.39,236.71 217.09,235.77 213.80,234.64 210.50,233.30 207.21,231.76 203.91,230.03 200.61,228.11 197.32,226.00 194.02,223.72 190.73,221.28 187.43,218.68 184.14,215.94 180.84,213.08 177.55,210.09 174.25,207.01 170.95,203.83 167.66,200.58 164.36,197.27 161.07,193.91 157.77,190.51 154.48,187.08 151.18,183.64 147.89,180.19 144.59,176.75 141.30,173.32 138.00,169.91 134.70,166.54 131.41,163.20 128.11,159.91 124.82,156.67 121.52,153.48 118.23,150.36 114.93,147.30 111.64,144.31 108.34,141.39 105.05,138.54 101.75,135.77 98.45,133.08 95.16,130.47 91.86,127.94 88.57,125.49 85.27,123.12 81.98,120.83 78.68,118.63 75.39,116.50 72.09,114.45 ' style='stroke-width: 0.75; stroke: none; fill: #DF536B; fill-opacity: 0.20;' />
+<polyline points='72.09,247.95 75.39,249.24 78.68,250.53 81.98,251.82 85.27,253.11 88.57,254.40 91.86,255.69 95.16,256.97 98.45,258.26 101.75,259.54 105.05,260.82 108.34,262.10 111.64,263.38 114.93,264.65 118.23,265.92 121.52,267.19 124.82,268.46 128.11,269.73 131.41,270.99 134.70,272.25 138.00,273.51 141.30,274.76 144.59,276.01 147.89,277.26 151.18,278.50 154.48,279.74 157.77,280.98 161.07,282.21 164.36,283.44 167.66,284.66 170.95,285.88 174.25,287.10 177.55,288.31 180.84,289.51 184.14,290.72 187.43,291.91 190.73,293.10 194.02,294.29 197.32,295.47 200.61,296.65 203.91,297.82 207.21,298.99 210.50,300.15 213.80,301.30 217.09,302.45 220.39,303.59 223.68,304.73 226.98,305.86 230.27,306.99 233.57,308.11 236.86,309.22 240.16,310.33 243.46,311.43 246.75,312.52 250.05,313.61 253.34,314.69 256.64,315.76 259.93,316.83 263.23,317.89 266.52,318.95 269.82,320.00 273.11,321.04 276.41,322.07 279.71,323.10 283.00,324.12 286.30,325.13 289.59,326.14 292.89,327.14 296.18,328.13 299.48,329.11 302.77,330.09 306.07,331.06 309.37,332.02 312.66,332.98 315.96,333.93 319.25,334.87 322.55,335.80 325.84,336.73 329.14,337.64 332.43,338.56 335.73,339.46 339.02,340.36 342.32,341.24 345.62,342.13 348.91,343.00 352.21,343.87 355.50,344.73 358.80,345.58 362.09,346.42 365.39,347.26 368.68,348.09 371.98,348.91 375.28,349.72 378.57,350.53 381.87,351.33 385.16,352.12 388.46,352.91 391.75,353.68 395.05,354.45 398.34,355.22 ' style='stroke-width: 0.75; stroke: #DF536B;' />
+<polygon points='113.30,174.88 115.17,174.38 117.05,173.89 118.92,173.41 120.79,172.94 122.67,172.48 124.54,172.03 126.41,171.59 128.29,171.16 130.16,170.74 132.03,170.33 133.91,169.93 135.78,169.55 137.65,169.17 139.53,168.81 141.40,168.46 143.27,168.12 145.15,167.80 147.02,167.49 148.89,167.19 150.77,166.91 152.64,166.65 154.51,166.40 156.39,166.17 158.26,165.96 160.13,165.77 162.00,165.60 163.88,165.44 165.75,165.31 167.62,165.21 169.50,165.13 171.37,165.07 173.24,165.04 175.12,165.04 176.99,165.07 178.86,165.13 180.74,165.22 182.61,165.35 184.48,165.51 186.36,165.72 188.23,165.97 190.10,166.26 191.98,166.60 193.85,166.99 195.72,167.43 197.60,167.94 199.47,168.50 201.34,169.13 203.22,169.82 205.09,170.59 206.96,171.44 208.84,172.37 210.71,173.39 212.58,174.51 214.46,175.72 216.33,177.04 218.20,178.47 220.07,180.03 221.95,181.70 223.82,183.51 225.69,185.46 227.57,187.55 229.44,189.79 231.31,192.19 233.19,194.75 235.06,197.48 236.93,200.38 238.81,203.45 240.68,206.70 242.55,210.13 244.43,213.74 246.30,217.53 248.17,221.49 250.05,225.62 251.92,229.92 253.79,234.38 255.67,238.99 257.54,243.75 259.41,248.63 261.29,253.63 263.16,258.73 265.03,263.91 266.91,269.17 268.78,274.49 270.65,279.84 272.53,285.21 274.40,290.57 276.27,295.93 278.14,301.24 280.02,306.51 281.89,311.70 283.76,316.82 285.64,321.83 287.51,326.73 289.38,331.51 291.26,336.16 293.13,340.66 295.00,345.01 296.88,349.21 298.75,353.24 298.75,95.62 296.88,95.59 295.00,95.56 293.13,95.51 291.26,95.45 289.38,95.38 287.51,95.30 285.64,95.20 283.76,95.09 281.89,94.96 280.02,94.82 278.14,94.66 276.27,94.48 274.40,94.28 272.53,94.07 270.65,93.84 268.78,93.59 266.91,93.32 265.03,93.03 263.16,92.72 261.29,92.39 259.41,92.04 257.54,91.67 255.67,91.29 253.79,90.88 251.92,90.45 250.05,90.01 248.17,89.55 246.30,89.07 244.43,88.58 242.55,88.08 240.68,87.57 238.81,87.04 236.93,86.52 235.06,85.98 233.19,85.45 231.31,84.91 229.44,84.38 227.57,83.85 225.69,83.32 223.82,82.81 221.95,82.30 220.07,81.80 218.20,81.32 216.33,80.84 214.46,80.39 212.58,79.95 210.71,79.52 208.84,79.11 206.96,78.72 205.09,78.35 203.22,77.99 201.34,77.65 199.47,77.33 197.60,77.02 195.72,76.73 193.85,76.46 191.98,76.20 190.10,75.96 188.23,75.73 186.36,75.51 184.48,75.31 182.61,75.12 180.74,74.95 178.86,74.78 176.99,74.63 175.12,74.49 173.24,74.35 171.37,74.23 169.50,74.11 167.62,74.00 165.75,73.90 163.88,73.81 162.00,73.72 160.13,73.64 158.26,73.57 156.39,73.50 154.51,73.44 152.64,73.38 150.77,73.32 148.89,73.27 147.02,73.23 145.15,73.18 143.27,73.14 141.40,73.11 139.53,73.07 137.65,73.04 135.78,73.01 133.91,72.99 132.03,72.96 130.16,72.94 128.29,72.92 126.41,72.90 124.54,72.88 122.67,72.86 120.79,72.85 118.92,72.84 117.05,72.82 115.17,72.81 113.30,72.80 ' style='stroke-width: 0.75; stroke: none; fill: #61D04F; fill-opacity: 0.20;' />
+<polyline points='113.30,76.87 115.17,77.03 117.05,77.20 118.92,77.38 120.79,77.56 122.67,77.75 124.54,77.94 126.41,78.15 128.29,78.36 130.16,78.58 132.03,78.81 133.91,79.04 135.78,79.29 137.65,79.54 139.53,79.81 141.40,80.08 143.27,80.37 145.15,80.66 147.02,80.97 148.89,81.29 150.77,81.62 152.64,81.96 154.51,82.31 156.39,82.68 158.26,83.06 160.13,83.46 162.00,83.87 163.88,84.29 165.75,84.73 167.62,85.19 169.50,85.66 171.37,86.16 173.24,86.66 175.12,87.19 176.99,87.74 178.86,88.30 180.74,88.89 182.61,89.49 184.48,90.12 186.36,90.77 188.23,91.44 190.10,92.14 191.98,92.86 193.85,93.61 195.72,94.38 197.60,95.18 199.47,96.00 201.34,96.85 203.22,97.73 205.09,98.65 206.96,99.59 208.84,100.56 210.71,101.56 212.58,102.60 214.46,103.67 216.33,104.78 218.20,105.92 220.07,107.09 221.95,108.31 223.82,109.56 225.69,110.85 227.57,112.18 229.44,113.54 231.31,114.95 233.19,116.40 235.06,117.90 236.93,119.44 238.81,121.02 240.68,122.64 242.55,124.31 244.43,126.03 246.30,127.79 248.17,129.60 250.05,131.45 251.92,133.36 253.79,135.31 255.67,137.31 257.54,139.36 259.41,141.46 261.29,143.60 263.16,145.80 265.03,148.04 266.91,150.34 268.78,152.68 270.65,155.08 272.53,157.52 274.40,160.01 276.27,162.54 278.14,165.13 280.02,167.76 281.89,170.44 283.76,173.16 285.64,175.92 287.51,178.73 289.38,181.58 291.26,184.47 293.13,187.41 295.00,190.37 296.88,193.38 298.75,196.42 ' style='stroke-width: 0.75; stroke: #61D04F;' />
+<polygon points='82.39,191.59 84.68,192.25 86.97,192.92 89.26,193.60 91.55,194.29 93.84,194.99 96.13,195.69 98.42,196.41 100.71,197.15 103.00,197.89 105.29,198.65 107.58,199.42 109.87,200.20 112.16,201.00 114.45,201.82 116.74,202.65 119.02,203.50 121.31,204.37 123.60,205.26 125.89,206.17 128.18,207.11 130.47,208.07 132.76,209.06 135.05,210.07 137.34,211.11 139.63,212.19 141.92,213.30 144.21,214.44 146.50,215.63 148.79,216.86 151.08,218.13 153.37,219.45 155.66,220.83 157.95,222.26 160.24,223.75 162.53,225.31 164.81,226.94 167.10,228.64 169.39,230.43 171.68,232.31 173.97,234.28 176.26,236.36 178.55,238.55 180.84,240.85 183.13,243.28 185.42,245.85 187.71,248.55 190.00,251.40 192.29,254.41 194.58,257.57 196.87,260.90 199.16,264.39 201.45,268.05 203.74,271.88 206.03,275.87 208.32,280.01 210.60,284.29 212.89,288.70 215.18,293.23 217.47,297.86 219.76,302.57 222.05,307.34 224.34,312.14 226.63,316.95 228.92,321.75 231.21,326.52 233.50,331.23 235.79,335.87 238.08,340.41 240.37,344.84 242.66,349.14 244.95,353.31 247.24,357.32 249.53,361.17 251.82,364.86 254.11,368.38 256.39,371.73 258.68,374.91 260.97,377.91 263.26,380.74 265.55,383.41 267.84,385.91 270.13,388.26 272.42,390.45 274.71,392.50 277.00,394.41 279.29,396.18 281.58,397.83 283.87,399.36 286.16,400.78 288.45,402.09 290.74,403.30 293.03,404.42 295.32,405.45 297.61,406.40 299.90,407.27 302.18,408.08 304.47,408.82 306.76,409.50 309.05,410.12 309.05,211.17 306.76,210.37 304.47,209.56 302.18,208.74 299.90,207.90 297.61,207.05 295.32,206.18 293.03,205.30 290.74,204.40 288.45,203.49 286.16,202.55 283.87,201.60 281.58,200.63 279.29,199.63 277.00,198.61 274.71,197.56 272.42,196.49 270.13,195.39 267.84,194.26 265.55,193.09 263.26,191.89 260.97,190.65 258.68,189.37 256.39,188.05 254.11,186.68 251.82,185.26 249.53,183.79 247.24,182.27 244.95,180.68 242.66,179.03 240.37,177.31 238.08,175.53 235.79,173.67 233.50,171.73 231.21,169.71 228.92,167.60 226.63,165.42 224.34,163.14 222.05,160.78 219.76,158.33 217.47,155.80 215.18,153.19 212.89,150.51 210.60,147.75 208.32,144.94 206.03,142.08 203.74,139.19 201.45,136.27 199.16,133.34 196.87,130.41 194.58,127.50 192.29,124.62 190.00,121.78 187.71,119.00 185.42,116.29 183.13,113.66 180.84,111.11 178.55,108.66 176.26,106.30 173.97,104.05 171.68,101.90 169.39,99.86 167.10,97.92 164.81,96.10 162.53,94.38 160.24,92.76 157.95,91.24 155.66,89.83 153.37,88.50 151.08,87.26 148.79,86.11 146.50,85.04 144.21,84.05 141.92,83.13 139.63,82.28 137.34,81.49 135.05,80.77 132.76,80.10 130.47,79.48 128.18,78.91 125.89,78.39 123.60,77.90 121.31,77.46 119.02,77.05 116.74,76.68 114.45,76.34 112.16,76.02 109.87,75.73 107.58,75.47 105.29,75.23 103.00,75.01 100.71,74.81 98.42,74.62 96.13,74.45 93.84,74.30 91.55,74.15 89.26,74.02 86.97,73.91 84.68,73.80 82.39,73.70 ' style='stroke-width: 0.75; stroke: none; fill: #2297E6; fill-opacity: 0.20;' />
+<polyline points='82.39,85.81 84.68,86.46 86.97,87.15 89.26,87.86 91.55,88.61 93.84,89.39 96.13,90.21 98.42,91.07 100.71,91.97 103.00,92.91 105.29,93.89 107.58,94.92 109.87,95.99 112.16,97.11 114.45,98.28 116.74,99.50 119.02,100.77 121.31,102.10 123.60,103.48 125.89,104.93 128.18,106.43 130.47,108.00 132.76,109.62 135.05,111.32 137.34,113.08 139.63,114.92 141.92,116.82 144.21,118.80 146.50,120.85 148.79,122.97 151.08,125.18 153.37,127.46 155.66,129.82 157.95,132.26 160.24,134.79 162.53,137.39 164.81,140.08 167.10,142.86 169.39,145.72 171.68,148.66 173.97,151.68 176.26,154.79 178.55,157.99 180.84,161.26 183.13,164.62 185.42,168.05 187.71,171.57 190.00,175.16 192.29,178.82 194.58,182.56 196.87,186.36 199.16,190.23 201.45,194.16 203.74,198.15 206.03,202.20 208.32,206.29 210.60,210.44 212.89,214.62 215.18,218.84 217.47,223.09 219.76,227.37 222.05,231.68 224.34,236.00 226.63,240.33 228.92,244.66 231.21,249.00 233.50,253.33 235.79,257.65 238.08,261.95 240.37,266.23 242.66,270.48 244.95,274.71 247.24,278.89 249.53,283.04 251.82,287.13 254.11,291.18 256.39,295.17 258.68,299.11 260.97,302.98 263.26,306.79 265.55,310.52 267.84,314.19 270.13,317.78 272.42,321.30 274.71,324.74 277.00,328.10 279.29,331.37 281.58,334.57 283.87,337.68 286.16,340.71 288.45,343.66 290.74,346.52 293.03,349.30 295.32,351.99 297.61,354.60 299.90,357.13 302.18,359.57 304.47,361.94 306.76,364.22 309.05,366.43 ' style='stroke-width: 0.75; stroke: #2297E6;' />
+<polygon points='90.98,335.77 93.37,335.69 95.77,335.62 98.16,335.56 100.55,335.51 102.95,335.48 105.34,335.45 107.73,335.44 110.13,335.44 112.52,335.45 114.91,335.48 117.31,335.53 119.70,335.59 122.09,335.67 124.49,335.77 126.88,335.88 129.28,336.02 131.67,336.19 134.06,336.37 136.46,336.58 138.85,336.82 141.24,337.09 143.64,337.39 146.03,337.72 148.42,338.09 150.82,338.49 153.21,338.94 155.60,339.42 158.00,339.95 160.39,340.52 162.79,341.15 165.18,341.83 167.57,342.56 169.97,343.34 172.36,344.19 174.75,345.10 177.15,346.07 179.54,347.10 181.93,348.20 184.33,349.37 186.72,350.61 189.11,351.91 191.51,353.28 193.90,354.72 196.30,356.21 198.69,357.77 201.08,359.37 203.48,361.03 205.87,362.73 208.26,364.46 210.66,366.23 213.05,368.01 215.44,369.81 217.84,371.62 220.23,373.43 222.62,375.23 225.02,377.01 227.41,378.78 229.81,380.51 232.20,382.22 234.59,383.89 236.99,385.51 239.38,387.09 241.77,388.63 244.17,390.11 246.56,391.54 248.95,392.92 251.35,394.24 253.74,395.51 256.13,396.72 258.53,397.88 260.92,398.99 263.32,400.04 265.71,401.04 268.10,401.99 270.50,402.89 272.89,403.75 275.28,404.55 277.68,405.32 280.07,406.04 282.46,406.72 284.86,407.36 287.25,407.96 289.64,408.53 292.04,409.06 294.43,409.57 296.83,410.04 299.22,410.48 301.61,410.89 304.01,411.28 306.40,411.65 308.79,411.99 311.19,412.31 313.58,412.61 315.97,412.89 318.37,413.16 320.76,413.40 323.15,413.63 325.55,413.84 327.94,414.05 327.94,269.58 325.55,269.76 323.15,269.93 320.76,270.09 318.37,270.24 315.97,270.37 313.58,270.50 311.19,270.62 308.79,270.72 306.40,270.81 304.01,270.89 301.61,270.95 299.22,271.00 296.83,271.03 294.43,271.04 292.04,271.04 289.64,271.01 287.25,270.97 284.86,270.90 282.46,270.82 280.07,270.70 277.68,270.56 275.28,270.40 272.89,270.20 270.50,269.97 268.10,269.71 265.71,269.41 263.32,269.08 260.92,268.70 258.53,268.28 256.13,267.81 253.74,267.29 251.35,266.71 248.95,266.08 246.56,265.38 244.17,264.62 241.77,263.78 239.38,262.87 236.99,261.88 234.59,260.79 232.20,259.62 229.81,258.34 227.41,256.96 225.02,255.46 222.62,253.85 220.23,252.11 217.84,250.24 215.44,248.24 213.05,246.10 210.66,243.81 208.26,241.38 205.87,238.80 203.48,236.07 201.08,233.19 198.69,230.16 196.30,226.99 193.90,223.69 191.51,220.25 189.11,216.69 186.72,213.02 184.33,209.25 181.93,205.38 179.54,201.44 177.15,197.43 174.75,193.37 172.36,189.28 169.97,185.16 167.57,181.04 165.18,176.92 162.79,172.82 160.39,168.74 158.00,164.72 155.60,160.75 153.21,156.84 150.82,153.01 148.42,149.26 146.03,145.60 143.64,142.03 141.24,138.57 138.85,135.22 136.46,131.98 134.06,128.85 131.67,125.83 129.28,122.94 126.88,120.16 124.49,117.49 122.09,114.94 119.70,112.51 117.31,110.19 114.91,107.98 112.52,105.88 110.13,103.89 107.73,102.00 105.34,100.20 102.95,98.50 100.55,96.90 98.16,95.38 95.77,93.95 93.37,92.60 90.98,91.33 ' style='stroke-width: 0.75; stroke: none; fill: #28E2E5; fill-opacity: 0.20;' />
+<polyline points='90.98,176.39 93.37,178.89 95.77,181.42 98.16,183.99 100.55,186.59 102.95,189.22 105.34,191.87 107.73,194.56 110.13,197.27 112.52,200.01 114.91,202.77 117.31,205.56 119.70,208.37 122.09,211.19 124.49,214.04 126.88,216.91 129.28,219.79 131.67,222.68 134.06,225.59 136.46,228.51 138.85,231.44 141.24,234.37 143.64,237.32 146.03,240.26 148.42,243.21 150.82,246.16 153.21,249.11 155.60,252.06 158.00,255.00 160.39,257.94 162.79,260.87 165.18,263.79 167.57,266.69 169.97,269.59 172.36,272.47 174.75,275.34 177.15,278.18 179.54,281.01 181.93,283.82 184.33,286.61 186.72,289.37 189.11,292.11 191.51,294.83 193.90,297.51 196.30,300.17 198.69,302.80 201.08,305.40 203.48,307.97 205.87,310.50 208.26,313.01 210.66,315.47 213.05,317.91 215.44,320.31 217.84,322.67 220.23,325.00 222.62,327.29 225.02,329.54 227.41,331.75 229.81,333.93 232.20,336.07 234.59,338.17 236.99,340.23 239.38,342.25 241.77,344.24 244.17,346.18 246.56,348.09 248.95,349.95 251.35,351.78 253.74,353.57 256.13,355.32 258.53,357.03 260.92,358.71 263.32,360.34 265.71,361.94 268.10,363.51 270.50,365.03 272.89,366.52 275.28,367.98 277.68,369.40 280.07,370.78 282.46,372.13 284.86,373.45 287.25,374.73 289.64,375.98 292.04,377.20 294.43,378.39 296.83,379.54 299.22,380.67 301.61,381.76 304.01,382.82 306.40,383.86 308.79,384.87 311.19,385.85 313.58,386.80 315.97,387.73 318.37,388.63 320.76,389.50 323.15,390.35 325.55,391.18 327.94,391.98 ' style='stroke-width: 0.75; stroke: #28E2E5;' />
+</g>
+</svg>
diff --git a/inst/tinytest/_tinysnapshot/model_glm_facet.svg b/inst/tinytest/_tinysnapshot/model_glm_facet.svg
new file mode 100644
index 00000000..400fee21
--- /dev/null
+++ b/inst/tinytest/_tinysnapshot/model_glm_facet.svg
@@ -0,0 +1,224 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' class='svglite' width='504.00pt' height='504.00pt' viewBox='0 0 504.00 504.00'>
+<defs>
+  <style type='text/css'><![CDATA[
+    .svglite line, .svglite polyline, .svglite polygon, .svglite path, .svglite rect, .svglite circle {
+      fill: none;
+      stroke: #000000;
+      stroke-linecap: round;
+      stroke-linejoin: round;
+      stroke-miterlimit: 10.00;
+    }
+    .svglite text {
+      white-space: pre;
+    }
+  ]]></style>
+</defs>
+<rect width='100%' height='100%' style='stroke: none; fill: #FFFFFF;'/>
+<defs>
+  <clipPath id='cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='504.00' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<text x='266.40' y='485.28' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='27.34px' lengthAdjust='spacingAndGlyphs'>Wind</text>
+<text transform='translate(12.96,244.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='67.70px' lengthAdjust='spacingAndGlyphs'>I(Temp &gt; 80)</text>
+</g>
+<defs>
+  <clipPath id='cpNTkuMDR8MTgwLjk2fDU5LjA0fDIyNS4zNg=='>
+    <rect x='59.04' y='59.04' width='121.92' height='166.32' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpNTkuMDR8MTgwLjk2fDU5LjA0fDIyNS4zNg==)'>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='83.16' y1='225.36' x2='172.29' y2='225.36' style='stroke-width: 0.75;' />
+<line x1='83.16' y1='225.36' x2='83.16' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='112.87' y1='225.36' x2='112.87' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='142.58' y1='225.36' x2='142.58' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='172.29' y1='225.36' x2='172.29' y2='230.11' style='stroke-width: 0.75;' />
+<text x='83.16' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='112.87' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='142.58' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='172.29' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>20</text>
+<line x1='59.04' y1='219.20' x2='59.04' y2='65.14' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='219.20' x2='54.29' y2='219.20' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='188.39' x2='54.29' y2='188.39' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='157.58' x2='54.29' y2='157.58' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='126.77' x2='54.29' y2='126.77' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='95.96' x2='54.29' y2='95.96' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='65.14' x2='54.29' y2='65.14' style='stroke-width: 0.75;' />
+<text transform='translate(47.64,219.20) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.0</text>
+<text transform='translate(47.64,188.39) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.2</text>
+<text transform='translate(47.64,157.58) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.4</text>
+<text transform='translate(47.64,126.77) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.6</text>
+<text transform='translate(47.64,95.96) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.8</text>
+<text transform='translate(47.64,65.14) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>1.0</text>
+<rect x='59.04' y='43.20' width='121.92' height='15.84' style='stroke-width: 0.75; stroke: none;' />
+<text x='120.00' y='55.24' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>5</text>
+<polygon points='59.04,225.36 180.96,225.36 180.96,59.04 59.04,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpMjA1LjQ0fDMyNy4zNnw1OS4wNHwyMjUuMzY='>
+    <rect x='205.44' y='59.04' width='121.92' height='166.32' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMjA1LjQ0fDMyNy4zNnw1OS4wNHwyMjUuMzY=)'>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='229.56' y1='225.36' x2='318.69' y2='225.36' style='stroke-width: 0.75;' />
+<line x1='229.56' y1='225.36' x2='229.56' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='259.27' y1='225.36' x2='259.27' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='288.98' y1='225.36' x2='288.98' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='318.69' y1='225.36' x2='318.69' y2='230.11' style='stroke-width: 0.75;' />
+<text x='229.56' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='259.27' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='288.98' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='318.69' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>20</text>
+<line x1='205.44' y1='219.20' x2='205.44' y2='65.14' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='219.20' x2='200.69' y2='219.20' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='188.39' x2='200.69' y2='188.39' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='157.58' x2='200.69' y2='157.58' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='126.77' x2='200.69' y2='126.77' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='95.96' x2='200.69' y2='95.96' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='65.14' x2='200.69' y2='65.14' style='stroke-width: 0.75;' />
+<text transform='translate(194.04,219.20) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.0</text>
+<text transform='translate(194.04,188.39) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.2</text>
+<text transform='translate(194.04,157.58) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.4</text>
+<text transform='translate(194.04,126.77) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.6</text>
+<text transform='translate(194.04,95.96) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.8</text>
+<text transform='translate(194.04,65.14) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>1.0</text>
+<rect x='205.44' y='43.20' width='121.92' height='15.84' style='stroke-width: 0.75; stroke: none;' />
+<text x='266.40' y='55.24' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>6</text>
+<polygon points='205.44,225.36 327.36,225.36 327.36,59.04 205.44,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpMzUxLjg0fDQ3My43Nnw1OS4wNHwyMjUuMzY='>
+    <rect x='351.84' y='59.04' width='121.92' height='166.32' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMzUxLjg0fDQ3My43Nnw1OS4wNHwyMjUuMzY=)'>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='375.96' y1='225.36' x2='465.09' y2='225.36' style='stroke-width: 0.75;' />
+<line x1='375.96' y1='225.36' x2='375.96' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='405.67' y1='225.36' x2='405.67' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='435.38' y1='225.36' x2='435.38' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='465.09' y1='225.36' x2='465.09' y2='230.11' style='stroke-width: 0.75;' />
+<text x='375.96' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='405.67' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='435.38' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='465.09' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>20</text>
+<line x1='351.84' y1='219.20' x2='351.84' y2='65.14' style='stroke-width: 0.75;' />
+<line x1='351.84' y1='219.20' x2='347.09' y2='219.20' style='stroke-width: 0.75;' />
+<line x1='351.84' y1='188.39' x2='347.09' y2='188.39' style='stroke-width: 0.75;' />
+<line x1='351.84' y1='157.58' x2='347.09' y2='157.58' style='stroke-width: 0.75;' />
+<line x1='351.84' y1='126.77' x2='347.09' y2='126.77' style='stroke-width: 0.75;' />
+<line x1='351.84' y1='95.96' x2='347.09' y2='95.96' style='stroke-width: 0.75;' />
+<line x1='351.84' y1='65.14' x2='347.09' y2='65.14' style='stroke-width: 0.75;' />
+<text transform='translate(340.44,219.20) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.0</text>
+<text transform='translate(340.44,188.39) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.2</text>
+<text transform='translate(340.44,157.58) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.4</text>
+<text transform='translate(340.44,126.77) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.6</text>
+<text transform='translate(340.44,95.96) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.8</text>
+<text transform='translate(340.44,65.14) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>1.0</text>
+<rect x='351.84' y='43.20' width='121.92' height='15.84' style='stroke-width: 0.75; stroke: none;' />
+<text x='412.80' y='55.24' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>7</text>
+<polygon points='351.84,225.36 473.76,225.36 473.76,59.04 351.84,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpNTkuMDR8MTgwLjk2fDI2NC4yNHw0MzAuNTY='>
+    <rect x='59.04' y='264.24' width='121.92' height='166.32' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpNTkuMDR8MTgwLjk2fDI2NC4yNHw0MzAuNTY=)'>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='83.16' y1='430.56' x2='172.29' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='83.16' y1='430.56' x2='83.16' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='112.87' y1='430.56' x2='112.87' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='142.58' y1='430.56' x2='142.58' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='172.29' y1='430.56' x2='172.29' y2='435.31' style='stroke-width: 0.75;' />
+<text x='83.16' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='112.87' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='142.58' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='172.29' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>20</text>
+<line x1='59.04' y1='424.40' x2='59.04' y2='270.34' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='424.40' x2='54.29' y2='424.40' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='393.59' x2='54.29' y2='393.59' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='362.78' x2='54.29' y2='362.78' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='331.97' x2='54.29' y2='331.97' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='301.16' x2='54.29' y2='301.16' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='270.34' x2='54.29' y2='270.34' style='stroke-width: 0.75;' />
+<text transform='translate(47.64,424.40) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.0</text>
+<text transform='translate(47.64,393.59) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.2</text>
+<text transform='translate(47.64,362.78) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.4</text>
+<text transform='translate(47.64,331.97) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.6</text>
+<text transform='translate(47.64,301.16) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.8</text>
+<text transform='translate(47.64,270.34) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>1.0</text>
+<rect x='59.04' y='248.40' width='121.92' height='15.84' style='stroke-width: 0.75; stroke: none;' />
+<text x='120.00' y='260.44' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>8</text>
+<polygon points='59.04,430.56 180.96,430.56 180.96,264.24 59.04,264.24 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpMjA1LjQ0fDMyNy4zNnwyNjQuMjR8NDMwLjU2'>
+    <rect x='205.44' y='264.24' width='121.92' height='166.32' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMjA1LjQ0fDMyNy4zNnwyNjQuMjR8NDMwLjU2)'>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='229.56' y1='430.56' x2='318.69' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='229.56' y1='430.56' x2='229.56' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='259.27' y1='430.56' x2='259.27' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='288.98' y1='430.56' x2='288.98' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='318.69' y1='430.56' x2='318.69' y2='435.31' style='stroke-width: 0.75;' />
+<text x='229.56' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='259.27' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='288.98' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='318.69' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>20</text>
+<line x1='205.44' y1='424.40' x2='205.44' y2='270.34' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='424.40' x2='200.69' y2='424.40' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='393.59' x2='200.69' y2='393.59' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='362.78' x2='200.69' y2='362.78' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='331.97' x2='200.69' y2='331.97' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='301.16' x2='200.69' y2='301.16' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='270.34' x2='200.69' y2='270.34' style='stroke-width: 0.75;' />
+<text transform='translate(194.04,424.40) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.0</text>
+<text transform='translate(194.04,393.59) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.2</text>
+<text transform='translate(194.04,362.78) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.4</text>
+<text transform='translate(194.04,331.97) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.6</text>
+<text transform='translate(194.04,301.16) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.8</text>
+<text transform='translate(194.04,270.34) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>1.0</text>
+<rect x='205.44' y='248.40' width='121.92' height='15.84' style='stroke-width: 0.75; stroke: none;' />
+<text x='266.40' y='260.44' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>9</text>
+<polygon points='205.44,430.56 327.36,430.56 327.36,264.24 205.44,264.24 ' style='stroke-width: 0.75;' />
+</g>
+<g clip-path='url(#cpNTkuMDR8MTgwLjk2fDU5LjA0fDIyNS4zNg==)'>
+<polygon points='87.32,219.20 88.19,219.20 89.05,219.20 89.91,219.20 90.78,219.20 91.64,219.20 92.51,219.20 93.37,219.20 94.24,219.20 95.10,219.20 95.96,219.19 96.83,219.19 97.69,219.19 98.56,219.19 99.42,219.19 100.28,219.19 101.15,219.19 102.01,219.18 102.88,219.18 103.74,219.18 104.61,219.18 105.47,219.17 106.33,219.17 107.20,219.17 108.06,219.16 108.93,219.16 109.79,219.15 110.66,219.15 111.52,219.14 112.38,219.14 113.25,219.13 114.11,219.12 114.98,219.11 115.84,219.10 116.71,219.09 117.57,219.08 118.43,219.07 119.30,219.05 120.16,219.04 121.03,219.02 121.89,219.00 122.75,218.98 123.62,218.96 124.48,218.94 125.35,218.91 126.21,218.89 127.08,218.86 127.94,218.83 128.80,218.80 129.67,218.77 130.53,218.74 131.40,218.70 132.26,218.67 133.13,218.63 133.99,218.59 134.85,218.55 135.72,218.51 136.58,218.47 137.45,218.44 138.31,218.40 139.17,218.36 140.04,218.32 140.90,218.29 141.77,218.26 142.63,218.23 143.50,218.20 144.36,218.17 145.22,218.15 146.09,218.13 146.95,218.11 147.82,218.10 148.68,218.09 149.55,218.08 150.41,218.08 151.27,218.07 152.14,218.08 153.00,218.08 153.87,218.09 154.73,218.09 155.60,218.10 156.46,218.12 157.32,218.13 158.19,218.15 159.05,218.16 159.92,218.18 160.78,218.20 161.64,218.22 162.51,218.24 163.37,218.27 164.24,218.29 165.10,218.31 165.97,218.33 166.83,218.36 167.69,218.38 168.56,218.40 169.42,218.43 170.29,218.45 171.15,218.47 172.02,218.50 172.88,218.52 172.88,81.11 172.02,82.71 171.15,84.43 170.29,86.29 169.42,88.28 168.56,90.41 167.69,92.67 166.83,95.07 165.97,97.60 165.10,100.26 164.24,103.04 163.37,105.93 162.51,108.93 161.64,112.02 160.78,115.18 159.92,118.40 159.05,121.67 158.19,124.96 157.32,128.26 156.46,131.55 155.60,134.81 154.73,138.02 153.87,141.17 153.00,144.24 152.14,147.22 151.27,150.10 150.41,152.85 149.55,155.49 148.68,157.99 147.82,160.36 146.95,162.58 146.09,164.67 145.22,166.61 144.36,168.41 143.50,170.07 142.63,171.59 141.77,172.97 140.90,174.23 140.04,175.36 139.17,176.36 138.31,177.25 137.45,178.03 136.58,178.70 135.72,179.28 134.85,179.75 133.99,180.13 133.13,180.43 132.26,180.64 131.40,180.77 130.53,180.83 129.67,180.82 128.80,180.73 127.94,180.58 127.08,180.37 126.21,180.10 125.35,179.78 124.48,179.39 123.62,178.96 122.75,178.47 121.89,177.93 121.03,177.34 120.16,176.71 119.30,176.03 118.43,175.31 117.57,174.54 116.71,173.73 115.84,172.88 114.98,171.99 114.11,171.06 113.25,170.10 112.38,169.09 111.52,168.06 110.66,166.98 109.79,165.87 108.93,164.73 108.06,163.56 107.20,162.35 106.33,161.11 105.47,159.85 104.61,158.56 103.74,157.24 102.88,155.89 102.01,154.53 101.15,153.14 100.28,151.72 99.42,150.29 98.56,148.84 97.69,147.37 96.83,145.89 95.96,144.39 95.10,142.88 94.24,141.36 93.37,139.83 92.51,138.30 91.64,136.75 90.78,135.21 89.91,133.66 89.05,132.11 88.19,130.56 87.32,129.01 ' style='stroke-width: 0.75; stroke: none; fill: #000000; fill-opacity: 0.20;' />
+<polyline points='87.32,218.45 88.19,218.42 89.05,218.39 89.91,218.36 90.78,218.32 91.64,218.29 92.51,218.26 93.37,218.22 94.24,218.18 95.10,218.15 95.96,218.11 96.83,218.07 97.69,218.02 98.56,217.98 99.42,217.93 100.28,217.88 101.15,217.84 102.01,217.78 102.88,217.73 103.74,217.68 104.61,217.62 105.47,217.56 106.33,217.50 107.20,217.43 108.06,217.37 108.93,217.30 109.79,217.23 110.66,217.15 111.52,217.08 112.38,217.00 113.25,216.91 114.11,216.83 114.98,216.74 115.84,216.65 116.71,216.55 117.57,216.46 118.43,216.35 119.30,216.25 120.16,216.14 121.03,216.02 121.89,215.91 122.75,215.78 123.62,215.66 124.48,215.53 125.35,215.39 126.21,215.25 127.08,215.10 127.94,214.95 128.80,214.80 129.67,214.63 130.53,214.47 131.40,214.29 132.26,214.11 133.13,213.93 133.99,213.73 134.85,213.53 135.72,213.33 136.58,213.11 137.45,212.89 138.31,212.66 139.17,212.43 140.04,212.18 140.90,211.93 141.77,211.66 142.63,211.39 143.50,211.11 144.36,210.82 145.22,210.52 146.09,210.21 146.95,209.89 147.82,209.56 148.68,209.22 149.55,208.87 150.41,208.50 151.27,208.13 152.14,207.74 153.00,207.34 153.87,206.92 154.73,206.50 155.60,206.06 156.46,205.60 157.32,205.13 158.19,204.65 159.05,204.15 159.92,203.64 160.78,203.11 161.64,202.57 162.51,202.01 163.37,201.43 164.24,200.84 165.10,200.23 165.97,199.60 166.83,198.96 167.69,198.29 168.56,197.61 169.42,196.91 170.29,196.19 171.15,195.46 172.02,194.70 172.88,193.92 ' style='stroke-width: 0.75;' />
+</g>
+<g clip-path='url(#cpMjA1LjQ0fDMyNy4zNnw1OS4wNHwyMjUuMzY=)'>
+<polygon points='209.96,201.69 211.10,201.31 212.24,200.92 213.38,200.52 214.52,200.12 215.66,199.72 216.80,199.31 217.94,198.90 219.08,198.48 220.22,198.06 221.36,197.64 222.50,197.22 223.64,196.80 224.78,196.38 225.92,195.95 227.06,195.53 228.20,195.11 229.34,194.70 230.48,194.28 231.62,193.87 232.76,193.47 233.90,193.08 235.04,192.69 236.18,192.32 237.32,191.96 238.46,191.61 239.60,191.28 240.74,190.97 241.88,190.68 243.02,190.41 244.16,190.17 245.30,189.96 246.44,189.78 247.59,189.64 248.73,189.53 249.87,189.47 251.01,189.45 252.15,189.48 253.29,189.55 254.43,189.68 255.57,189.86 256.71,190.09 257.85,190.37 258.99,190.71 260.13,191.10 261.27,191.53 262.41,192.01 263.55,192.54 264.69,193.10 265.83,193.70 266.97,194.33 268.11,194.98 269.25,195.66 270.39,196.35 271.53,197.06 272.67,197.77 273.81,198.49 274.95,199.21 276.09,199.93 277.23,200.65 278.37,201.35 279.51,202.05 280.65,202.74 281.79,203.41 282.93,204.07 284.07,204.71 285.21,205.34 286.36,205.94 287.50,206.53 288.64,207.11 289.78,207.66 290.92,208.19 292.06,208.71 293.20,209.20 294.34,209.68 295.48,210.14 296.62,210.57 297.76,211.00 298.90,211.40 300.04,211.79 301.18,212.16 302.32,212.51 303.46,212.85 304.60,213.17 305.74,213.48 306.88,213.77 308.02,214.05 309.16,214.32 310.30,214.57 311.44,214.81 312.58,215.04 313.72,215.26 314.86,215.47 316.00,215.67 317.14,215.85 318.28,216.03 319.42,216.20 320.56,216.36 321.70,216.51 322.84,216.66 322.84,105.39 321.70,106.17 320.56,106.96 319.42,107.75 318.28,108.55 317.14,109.36 316.00,110.17 314.86,110.99 313.72,111.82 312.58,112.65 311.44,113.48 310.30,114.32 309.16,115.16 308.02,116.00 306.88,116.85 305.74,117.70 304.60,118.54 303.46,119.39 302.32,120.24 301.18,121.09 300.04,121.93 298.90,122.78 297.76,123.62 296.62,124.45 295.48,125.28 294.34,126.10 293.20,126.92 292.06,127.73 290.92,128.52 289.78,129.31 288.64,130.08 287.50,130.84 286.36,131.58 285.21,132.31 284.07,133.01 282.93,133.69 281.79,134.35 280.65,134.99 279.51,135.59 278.37,136.16 277.23,136.70 276.09,137.20 274.95,137.66 273.81,138.08 272.67,138.44 271.53,138.76 270.39,139.02 269.25,139.22 268.11,139.35 266.97,139.41 265.83,139.41 264.69,139.32 263.55,139.16 262.41,138.91 261.27,138.58 260.13,138.16 258.99,137.65 257.85,137.05 256.71,136.36 255.57,135.59 254.43,134.73 253.29,133.79 252.15,132.76 251.01,131.67 249.87,130.51 248.73,129.28 247.59,128.00 246.44,126.66 245.30,125.28 244.16,123.86 243.02,122.41 241.88,120.92 240.74,119.42 239.60,117.89 238.46,116.36 237.32,114.82 236.18,113.28 235.04,111.73 233.90,110.20 232.76,108.68 231.62,107.16 230.48,105.67 229.34,104.20 228.20,102.75 227.06,101.32 225.92,99.92 224.78,98.55 223.64,97.21 222.50,95.90 221.36,94.63 220.22,93.39 219.08,92.19 217.94,91.02 216.80,89.88 215.66,88.79 214.52,87.73 213.38,86.70 212.24,85.72 211.10,84.76 209.96,83.85 ' style='stroke-width: 0.75; stroke: none; fill: #000000; fill-opacity: 0.20;' />
+<polyline points='209.96,143.61 211.10,144.19 212.24,144.77 213.38,145.34 214.52,145.92 215.66,146.50 216.80,147.07 217.94,147.65 219.08,148.22 220.22,148.80 221.36,149.37 222.50,149.94 223.64,150.52 224.78,151.09 225.92,151.66 227.06,152.23 228.20,152.79 229.34,153.36 230.48,153.93 231.62,154.49 232.76,155.05 233.90,155.61 235.04,156.17 236.18,156.73 237.32,157.29 238.46,157.84 239.60,158.40 240.74,158.95 241.88,159.50 243.02,160.05 244.16,160.59 245.30,161.14 246.44,161.68 247.59,162.22 248.73,162.76 249.87,163.29 251.01,163.82 252.15,164.36 253.29,164.88 254.43,165.41 255.57,165.94 256.71,166.46 257.85,166.98 258.99,167.49 260.13,168.01 261.27,168.52 262.41,169.03 263.55,169.54 264.69,170.04 265.83,170.54 266.97,171.04 268.11,171.53 269.25,172.03 270.39,172.52 271.53,173.00 272.67,173.49 273.81,173.97 274.95,174.45 276.09,174.92 277.23,175.39 278.37,175.86 279.51,176.33 280.65,176.79 281.79,177.25 282.93,177.71 284.07,178.16 285.21,178.61 286.36,179.06 287.50,179.50 288.64,179.94 289.78,180.38 290.92,180.82 292.06,181.25 293.20,181.67 294.34,182.10 295.48,182.52 296.62,182.94 297.76,183.35 298.90,183.76 300.04,184.17 301.18,184.58 302.32,184.98 303.46,185.38 304.60,185.77 305.74,186.16 306.88,186.55 308.02,186.93 309.16,187.32 310.30,187.69 311.44,188.07 312.58,188.44 313.72,188.81 314.86,189.17 316.00,189.53 317.14,189.89 318.28,190.24 319.42,190.60 320.56,190.94 321.70,191.29 322.84,191.63 ' style='stroke-width: 0.75;' />
+</g>
+<g clip-path='url(#cpMzUxLjg0fDQ3My43Nnw1OS4wNHwyMjUuMzY=)'>
+<polygon points='370.62,110.90 371.26,110.67 371.91,110.46 372.56,110.24 373.21,110.03 373.86,109.83 374.50,109.62 375.15,109.43 375.80,109.23 376.45,109.05 377.10,108.86 377.75,108.68 378.39,108.51 379.04,108.34 379.69,108.18 380.34,108.02 380.99,107.87 381.63,107.73 382.28,107.59 382.93,107.46 383.58,107.33 384.23,107.21 384.87,107.10 385.52,107.00 386.17,106.91 386.82,106.82 387.47,106.74 388.12,106.67 388.76,106.62 389.41,106.57 390.06,106.53 390.71,106.51 391.36,106.49 392.00,106.49 392.65,106.50 393.30,106.53 393.95,106.57 394.60,106.63 395.25,106.71 395.89,106.80 396.54,106.91 397.19,107.04 397.84,107.19 398.49,107.37 399.13,107.57 399.78,107.79 400.43,108.04 401.08,108.32 401.73,108.63 402.38,108.98 403.02,109.36 403.67,109.78 404.32,110.23 404.97,110.73 405.62,111.28 406.26,111.87 406.91,112.51 407.56,113.20 408.21,113.95 408.86,114.76 409.51,115.63 410.15,116.57 410.80,117.57 411.45,118.65 412.10,119.79 412.75,121.01 413.39,122.31 414.04,123.69 414.69,125.14 415.34,126.68 415.99,128.30 416.63,129.99 417.28,131.76 417.93,133.62 418.58,135.54 419.23,137.54 419.88,139.60 420.52,141.73 421.17,143.91 421.82,146.15 422.47,148.43 423.12,150.76 423.76,153.11 424.41,155.49 425.06,157.89 425.71,160.29 426.36,162.69 427.01,165.09 427.65,167.47 428.30,169.83 428.95,172.15 429.60,174.44 430.25,176.68 430.89,178.88 431.54,181.02 432.19,183.10 432.84,185.11 433.49,187.06 434.14,188.94 434.78,190.75 434.78,75.41 434.14,75.40 433.49,75.39 432.84,75.37 432.19,75.34 431.54,75.31 430.89,75.27 430.25,75.23 429.60,75.18 428.95,75.12 428.30,75.06 427.65,74.98 427.01,74.91 426.36,74.82 425.71,74.72 425.06,74.62 424.41,74.51 423.76,74.39 423.12,74.26 422.47,74.12 421.82,73.97 421.17,73.82 420.52,73.65 419.88,73.48 419.23,73.29 418.58,73.10 417.93,72.90 417.28,72.70 416.63,72.48 415.99,72.26 415.34,72.04 414.69,71.81 414.04,71.58 413.39,71.34 412.75,71.10 412.10,70.86 411.45,70.62 410.80,70.38 410.15,70.15 409.51,69.91 408.86,69.68 408.21,69.45 407.56,69.23 406.91,69.01 406.26,68.80 405.62,68.60 404.97,68.40 404.32,68.21 403.67,68.03 403.02,67.85 402.38,67.68 401.73,67.52 401.08,67.37 400.43,67.23 399.78,67.09 399.13,66.96 398.49,66.84 397.84,66.72 397.19,66.61 396.54,66.51 395.89,66.41 395.25,66.32 394.60,66.24 393.95,66.16 393.30,66.09 392.65,66.02 392.00,65.95 391.36,65.89 390.71,65.84 390.06,65.79 389.41,65.74 388.76,65.69 388.12,65.65 387.47,65.61 386.82,65.58 386.17,65.54 385.52,65.51 384.87,65.49 384.23,65.46 383.58,65.43 382.93,65.41 382.28,65.39 381.63,65.37 380.99,65.35 380.34,65.34 379.69,65.32 379.04,65.31 378.39,65.30 377.75,65.28 377.10,65.27 376.45,65.26 375.80,65.25 375.15,65.24 374.50,65.24 373.86,65.23 373.21,65.22 372.56,65.22 371.91,65.21 371.26,65.20 370.62,65.20 ' style='stroke-width: 0.75; stroke: none; fill: #000000; fill-opacity: 0.20;' />
+<polyline points='370.62,67.02 371.26,67.09 371.91,67.17 372.56,67.25 373.21,67.33 373.86,67.41 374.50,67.50 375.15,67.59 375.80,67.69 376.45,67.79 377.10,67.89 377.75,67.99 378.39,68.10 379.04,68.22 379.69,68.34 380.34,68.46 380.99,68.59 381.63,68.72 382.28,68.86 382.93,69.00 383.58,69.15 384.23,69.30 384.87,69.46 385.52,69.62 386.17,69.79 386.82,69.97 387.47,70.15 388.12,70.35 388.76,70.54 389.41,70.75 390.06,70.96 390.71,71.18 391.36,71.41 392.00,71.64 392.65,71.89 393.30,72.14 393.95,72.40 394.60,72.67 395.25,72.95 395.89,73.25 396.54,73.55 397.19,73.86 397.84,74.18 398.49,74.51 399.13,74.86 399.78,75.22 400.43,75.59 401.08,75.97 401.73,76.36 402.38,76.77 403.02,77.19 403.67,77.63 404.32,78.08 404.97,78.54 405.62,79.02 406.26,79.51 406.91,80.03 407.56,80.55 408.21,81.10 408.86,81.66 409.51,82.23 410.15,82.83 410.80,83.44 411.45,84.07 412.10,84.72 412.75,85.39 413.39,86.08 414.04,86.78 414.69,87.51 415.34,88.26 415.99,89.03 416.63,89.82 417.28,90.63 417.93,91.46 418.58,92.31 419.23,93.18 419.88,94.08 420.52,95.00 421.17,95.94 421.82,96.90 422.47,97.88 423.12,98.89 423.76,99.91 424.41,100.96 425.06,102.03 425.71,103.13 426.36,104.24 427.01,105.38 427.65,106.53 428.30,107.71 428.95,108.91 429.60,110.13 430.25,111.37 430.89,112.62 431.54,113.90 432.19,115.19 432.84,116.51 433.49,117.83 434.14,119.18 434.78,120.54 ' style='stroke-width: 0.75;' />
+</g>
+<g clip-path='url(#cpNTkuMDR8MTgwLjk2fDI2NC4yNHw0MzAuNTY=)'>
+<polygon points='67.12,323.58 67.91,323.88 68.70,324.18 69.50,324.48 70.29,324.79 71.08,325.10 71.87,325.42 72.67,325.74 73.46,326.07 74.25,326.40 75.04,326.74 75.83,327.08 76.63,327.43 77.42,327.79 78.21,328.16 79.00,328.53 79.80,328.91 80.59,329.30 81.38,329.70 82.17,330.11 82.96,330.53 83.76,330.96 84.55,331.40 85.34,331.85 86.13,332.32 86.93,332.80 87.72,333.30 88.51,333.81 89.30,334.34 90.09,334.89 90.89,335.46 91.68,336.05 92.47,336.67 93.26,337.31 94.06,337.98 94.85,338.67 95.64,339.40 96.43,340.17 97.22,340.97 98.02,341.81 98.81,342.69 99.60,343.62 100.39,344.60 101.19,345.63 101.98,346.72 102.77,347.87 103.56,349.08 104.35,350.35 105.15,351.70 105.94,353.12 106.73,354.61 107.52,356.17 108.32,357.81 109.11,359.52 109.90,361.31 110.69,363.16 111.48,365.08 112.28,367.05 113.07,369.08 113.86,371.16 114.65,373.26 115.44,375.40 116.24,377.54 117.03,379.70 117.82,381.85 118.61,383.98 119.41,386.09 120.20,388.17 120.99,390.20 121.78,392.18 122.57,394.11 123.37,395.97 124.16,397.77 124.95,399.50 125.74,401.15 126.54,402.72 127.33,404.22 128.12,405.65 128.91,406.99 129.70,408.26 130.50,409.45 131.29,410.57 132.08,411.62 132.87,412.61 133.67,413.52 134.46,414.38 135.25,415.17 136.04,415.91 136.83,416.59 137.63,417.23 138.42,417.81 139.21,418.36 140.00,418.86 140.80,419.32 141.59,419.74 142.38,420.13 143.17,420.50 143.96,420.83 144.76,421.13 145.55,421.41 145.55,332.35 144.76,331.99 143.96,331.62 143.17,331.25 142.38,330.88 141.59,330.50 140.80,330.11 140.00,329.72 139.21,329.31 138.42,328.90 137.63,328.49 136.83,328.06 136.04,327.62 135.25,327.18 134.46,326.72 133.67,326.25 132.87,325.77 132.08,325.28 131.29,324.77 130.50,324.25 129.70,323.71 128.91,323.16 128.12,322.59 127.33,321.99 126.54,321.38 125.74,320.75 124.95,320.09 124.16,319.41 123.37,318.70 122.57,317.96 121.78,317.19 120.99,316.39 120.20,315.56 119.41,314.69 118.61,313.78 117.82,312.84 117.03,311.86 116.24,310.84 115.44,309.79 114.65,308.69 113.86,307.56 113.07,306.39 112.28,305.19 111.48,303.95 110.69,302.70 109.90,301.42 109.11,300.12 108.32,298.81 107.52,297.50 106.73,296.19 105.94,294.89 105.15,293.60 104.35,292.33 103.56,291.08 102.77,289.87 101.98,288.69 101.19,287.55 100.39,286.45 99.60,285.40 98.81,284.39 98.02,283.43 97.22,282.51 96.43,281.65 95.64,280.83 94.85,280.06 94.06,279.34 93.26,278.66 92.47,278.02 91.68,277.43 90.89,276.88 90.09,276.36 89.30,275.88 88.51,275.44 87.72,275.03 86.93,274.64 86.13,274.29 85.34,273.97 84.55,273.67 83.76,273.39 82.96,273.14 82.17,272.90 81.38,272.68 80.59,272.49 79.80,272.30 79.00,272.14 78.21,271.98 77.42,271.84 76.63,271.71 75.83,271.60 75.04,271.49 74.25,271.39 73.46,271.30 72.67,271.21 71.87,271.14 71.08,271.07 70.29,271.01 69.50,270.95 68.70,270.90 67.91,270.85 67.12,270.80 ' style='stroke-width: 0.75; stroke: none; fill: #000000; fill-opacity: 0.20;' />
+<polyline points='67.12,276.22 67.91,276.52 68.70,276.82 69.50,277.14 70.29,277.48 71.08,277.83 71.87,278.20 72.67,278.58 73.46,278.98 74.25,279.40 75.04,279.84 75.83,280.30 76.63,280.78 77.42,281.28 78.21,281.80 79.00,282.35 79.80,282.92 80.59,283.52 81.38,284.14 82.17,284.78 82.96,285.45 83.76,286.16 84.55,286.89 85.34,287.64 86.13,288.43 86.93,289.25 87.72,290.11 88.51,290.99 89.30,291.91 90.09,292.86 90.89,293.85 91.68,294.87 92.47,295.93 93.26,297.02 94.06,298.15 94.85,299.32 95.64,300.52 96.43,301.76 97.22,303.04 98.02,304.36 98.81,305.71 99.60,307.11 100.39,308.54 101.19,310.00 101.98,311.50 102.77,313.04 103.56,314.62 104.35,316.22 105.15,317.86 105.94,319.54 106.73,321.24 107.52,322.97 108.32,324.73 109.11,326.52 109.90,328.33 110.69,330.16 111.48,332.02 112.28,333.89 113.07,335.78 113.86,337.68 114.65,339.60 115.44,341.53 116.24,343.46 117.03,345.40 117.82,347.34 118.61,349.28 119.41,351.22 120.20,353.15 120.99,355.08 121.78,356.99 122.57,358.90 123.37,360.79 124.16,362.66 124.95,364.52 125.74,366.35 126.54,368.16 127.33,369.95 128.12,371.71 128.91,373.45 129.70,375.15 130.50,376.82 131.29,378.46 132.08,380.07 132.87,381.65 133.67,383.19 134.46,384.69 135.25,386.16 136.04,387.59 136.83,388.98 137.63,390.34 138.42,391.66 139.21,392.94 140.00,394.18 140.80,395.39 141.59,396.55 142.38,397.69 143.17,398.78 143.96,399.84 144.76,400.86 145.55,401.85 ' style='stroke-width: 0.75;' />
+</g>
+<g clip-path='url(#cpMjA1LjQ0fDMyNy4zNnwyNjQuMjR8NDMwLjU2)'>
+<polygon points='216.49,388.12 217.32,388.09 218.15,388.06 218.98,388.03 219.80,388.01 220.63,387.99 221.46,387.98 222.29,387.98 223.12,387.98 223.95,387.98 224.77,388.00 225.60,388.02 226.43,388.04 227.26,388.08 228.09,388.12 228.91,388.18 229.74,388.24 230.57,388.31 231.40,388.39 232.23,388.49 233.06,388.60 233.88,388.72 234.71,388.85 235.54,389.00 236.37,389.16 237.20,389.34 238.02,389.54 238.85,389.76 239.68,390.00 240.51,390.25 241.34,390.53 242.17,390.84 242.99,391.16 243.82,391.51 244.65,391.89 245.48,392.30 246.31,392.73 247.14,393.20 247.96,393.69 248.79,394.22 249.62,394.77 250.45,395.35 251.28,395.97 252.10,396.61 252.93,397.28 253.76,397.97 254.59,398.69 255.42,399.43 256.25,400.19 257.07,400.97 257.90,401.76 258.73,402.56 259.56,403.36 260.39,404.17 261.21,404.98 262.04,405.79 262.87,406.59 263.70,407.38 264.53,408.16 265.36,408.92 266.18,409.67 267.01,410.39 267.84,411.10 268.67,411.79 269.50,412.45 270.33,413.09 271.15,413.71 271.98,414.30 272.81,414.87 273.64,415.41 274.47,415.93 275.29,416.43 276.12,416.90 276.95,417.34 277.78,417.77 278.61,418.17 279.44,418.56 280.26,418.92 281.09,419.26 281.92,419.58 282.75,419.89 283.58,420.17 284.40,420.44 285.23,420.70 286.06,420.94 286.89,421.16 287.72,421.37 288.55,421.57 289.37,421.76 290.20,421.93 291.03,422.09 291.86,422.25 292.69,422.39 293.51,422.53 294.34,422.65 295.17,422.77 296.00,422.88 296.83,422.98 297.66,423.08 298.48,423.17 298.48,358.49 297.66,358.57 296.83,358.65 296.00,358.72 295.17,358.79 294.34,358.85 293.51,358.91 292.69,358.96 291.86,359.00 291.03,359.04 290.20,359.08 289.37,359.11 288.55,359.13 287.72,359.14 286.89,359.15 286.06,359.15 285.23,359.13 284.40,359.12 283.58,359.09 282.75,359.05 281.92,359.00 281.09,358.93 280.26,358.86 279.44,358.77 278.61,358.67 277.78,358.55 276.95,358.42 276.12,358.27 275.29,358.10 274.47,357.91 273.64,357.70 272.81,357.47 271.98,357.21 271.15,356.93 270.33,356.61 269.50,356.27 268.67,355.90 267.84,355.49 267.01,355.04 266.18,354.56 265.36,354.03 264.53,353.46 263.70,352.84 262.87,352.17 262.04,351.45 261.21,350.67 260.39,349.84 259.56,348.94 258.73,347.98 257.90,346.96 257.07,345.87 256.25,344.71 255.42,343.49 254.59,342.20 253.76,340.85 252.93,339.43 252.10,337.95 251.28,336.41 250.45,334.82 249.62,333.17 248.79,331.48 247.96,329.75 247.14,327.99 246.31,326.19 245.48,324.38 244.65,322.54 243.82,320.70 242.99,318.85 242.17,317.01 241.34,315.17 240.51,313.35 239.68,311.55 238.85,309.77 238.02,308.02 237.20,306.31 236.37,304.63 235.54,302.99 234.71,301.39 233.88,299.85 233.06,298.34 232.23,296.89 231.40,295.49 230.57,294.14 229.74,292.84 228.91,291.60 228.09,290.41 227.26,289.27 226.43,288.18 225.60,287.14 224.77,286.15 223.95,285.21 223.12,284.32 222.29,283.47 221.46,282.67 220.63,281.91 219.80,281.19 218.98,280.51 218.15,279.87 217.32,279.27 216.49,278.70 ' style='stroke-width: 0.75; stroke: none; fill: #000000; fill-opacity: 0.20;' />
+<polyline points='216.49,316.77 217.32,317.89 218.15,319.03 218.98,320.18 219.80,321.34 220.63,322.52 221.46,323.71 222.29,324.91 223.12,326.12 223.95,327.35 224.77,328.59 225.60,329.83 226.43,331.09 227.26,332.36 228.09,333.63 228.91,334.91 229.74,336.20 230.57,337.50 231.40,338.80 232.23,340.11 233.06,341.42 233.88,342.73 234.71,344.05 235.54,345.37 236.37,346.69 237.20,348.01 238.02,349.33 238.85,350.65 239.68,351.97 240.51,353.28 241.34,354.59 242.17,355.90 242.99,357.20 243.82,358.50 244.65,359.79 245.48,361.07 246.31,362.35 247.14,363.61 247.96,364.87 248.79,366.12 249.62,367.35 250.45,368.58 251.28,369.80 252.10,371.00 252.93,372.19 253.76,373.37 254.59,374.53 255.42,375.68 256.25,376.81 257.07,377.93 257.90,379.04 258.73,380.13 259.56,381.20 260.39,382.26 261.21,383.30 262.04,384.33 262.87,385.34 263.70,386.33 264.53,387.30 265.36,388.26 266.18,389.20 267.01,390.12 267.84,391.03 268.67,391.91 269.50,392.79 270.33,393.64 271.15,394.47 271.98,395.29 272.81,396.09 273.64,396.88 274.47,397.64 275.29,398.39 276.12,399.13 276.95,399.84 277.78,400.54 278.61,401.23 279.44,401.89 280.26,402.54 281.09,403.18 281.92,403.80 282.75,404.40 283.58,404.99 284.40,405.57 285.23,406.13 286.06,406.67 286.89,407.20 287.72,407.72 288.55,408.22 289.37,408.71 290.20,409.19 291.03,409.65 291.86,410.10 292.69,410.54 293.51,410.97 294.34,411.38 295.17,411.79 296.00,412.18 296.83,412.56 297.66,412.93 298.48,413.29 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpMTI5Ljk1fDQ0Ni40OXwxMDguMTN8MzM3Ljgz'>
+    <rect x='129.95' y='108.13' width='316.54' height='229.70' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMTI5Ljk1fDQ0Ni40OXwxMDguMTN8MzM3Ljgz)'>
+</g>
+</svg>
diff --git a/inst/tinytest/_tinysnapshot/model_lm_50.svg b/inst/tinytest/_tinysnapshot/model_lm_50.svg
new file mode 100644
index 00000000..9081bd7a
--- /dev/null
+++ b/inst/tinytest/_tinysnapshot/model_lm_50.svg
@@ -0,0 +1,59 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' class='svglite' width='504.00pt' height='504.00pt' viewBox='0 0 504.00 504.00'>
+<defs>
+  <style type='text/css'><![CDATA[
+    .svglite line, .svglite polyline, .svglite polygon, .svglite path, .svglite rect, .svglite circle {
+      fill: none;
+      stroke: #000000;
+      stroke-linecap: round;
+      stroke-linejoin: round;
+      stroke-miterlimit: 10.00;
+    }
+    .svglite text {
+      white-space: pre;
+    }
+  ]]></style>
+</defs>
+<rect width='100%' height='100%' style='stroke: none; fill: #FFFFFF;'/>
+<defs>
+  <clipPath id='cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='504.00' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<text x='266.40' y='485.28' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='27.34px' lengthAdjust='spacingAndGlyphs'>Wind</text>
+<text transform='translate(12.96,244.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='67.70px' lengthAdjust='spacingAndGlyphs'>I(Temp &gt; 80)</text>
+<line x1='141.09' y1='430.56' x2='444.25' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='141.09' y1='430.56' x2='141.09' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='242.15' y1='430.56' x2='242.15' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='343.20' y1='430.56' x2='343.20' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='444.25' y1='430.56' x2='444.25' y2='437.76' style='stroke-width: 0.75;' />
+<text x='141.09' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='242.15' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='343.20' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='444.25' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>20</text>
+<line x1='59.04' y1='423.22' x2='59.04' y2='112.02' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='423.22' x2='51.84' y2='423.22' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='360.98' x2='51.84' y2='360.98' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='298.74' x2='51.84' y2='298.74' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='236.50' x2='51.84' y2='236.50' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='174.26' x2='51.84' y2='174.26' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='112.02' x2='51.84' y2='112.02' style='stroke-width: 0.75;' />
+<text transform='translate(41.76,423.22) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='20.68px' lengthAdjust='spacingAndGlyphs'>-0.2</text>
+<text transform='translate(41.76,360.98) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.0</text>
+<text transform='translate(41.76,298.74) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.2</text>
+<text transform='translate(41.76,236.50) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.4</text>
+<text transform='translate(41.76,174.26) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.6</text>
+<text transform='translate(41.76,112.02) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.8</text>
+<polygon points='59.04,430.56 473.76,430.56 473.76,59.04 59.04,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpNTkuMDR8NDczLjc2fDU5LjA0fDQzMC41Ng=='>
+    <rect x='59.04' y='59.04' width='414.72' height='371.52' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpNTkuMDR8NDczLjc2fDU5LjA0fDQzMC41Ng==)'>
+<polygon points='74.40,113.43 78.28,116.04 82.16,118.66 86.04,121.27 89.92,123.89 93.79,126.51 97.67,129.13 101.55,131.75 105.43,134.37 109.31,137.00 113.19,139.63 117.07,142.26 120.95,144.90 124.82,147.54 128.70,150.18 132.58,152.82 136.46,155.47 140.34,158.13 144.22,160.79 148.10,163.45 151.98,166.12 155.85,168.79 159.73,171.47 163.61,174.16 167.49,176.85 171.37,179.55 175.25,182.26 179.13,184.98 183.01,187.71 186.88,190.45 190.76,193.21 194.64,195.97 198.52,198.75 202.40,201.55 206.28,204.36 210.16,207.18 214.04,210.03 217.92,212.90 221.79,215.78 225.67,218.69 229.55,221.62 233.43,224.57 237.31,227.54 241.19,230.54 245.07,233.56 248.95,236.61 252.82,239.68 256.70,242.77 260.58,245.89 264.46,249.02 268.34,252.18 272.22,255.35 276.10,258.55 279.98,261.76 283.85,264.98 287.73,268.23 291.61,271.48 295.49,274.75 299.37,278.03 303.25,281.32 307.13,284.62 311.01,287.94 314.88,291.26 318.76,294.58 322.64,297.92 326.52,301.26 330.40,304.61 334.28,307.96 338.16,311.32 342.04,314.68 345.92,318.05 349.79,321.43 353.67,324.80 357.55,328.18 361.43,331.57 365.31,334.95 369.19,338.34 373.07,341.74 376.95,345.13 380.82,348.53 384.70,351.93 388.58,355.33 392.46,358.73 396.34,362.14 400.22,365.54 404.10,368.95 407.98,372.36 411.85,375.77 415.73,379.19 419.61,382.60 423.49,386.02 427.37,389.43 431.25,392.85 435.13,396.27 439.01,399.69 442.88,403.11 446.76,406.53 450.64,409.95 454.52,413.38 458.40,416.80 458.40,365.62 454.52,363.03 450.64,360.43 446.76,357.83 442.88,355.23 439.01,352.62 435.13,350.02 431.25,347.42 427.37,344.81 423.49,342.21 419.61,339.60 415.73,336.99 411.85,334.38 407.98,331.77 404.10,329.16 400.22,326.55 396.34,323.93 392.46,321.32 388.58,318.70 384.70,316.08 380.82,313.45 376.95,310.83 373.07,308.20 369.19,305.57 365.31,302.94 361.43,300.30 357.55,297.67 353.67,295.02 349.79,292.38 345.92,289.73 342.04,287.07 338.16,284.42 334.28,281.75 330.40,279.09 326.52,276.41 322.64,273.73 318.76,271.04 314.88,268.35 311.01,265.65 307.13,262.94 303.25,260.22 299.37,257.48 295.49,254.74 291.61,251.99 287.73,249.22 283.85,246.44 279.98,243.65 276.10,240.84 272.22,238.01 268.34,235.16 264.46,232.30 260.58,229.41 256.70,226.50 252.82,223.57 248.95,220.62 245.07,217.64 241.19,214.64 237.31,211.62 233.43,208.57 229.55,205.50 225.67,202.41 221.79,199.29 217.92,196.16 214.04,193.00 210.16,189.82 206.28,186.63 202.40,183.42 198.52,180.19 194.64,176.95 190.76,173.69 186.88,170.42 183.01,167.14 179.13,163.85 175.25,160.54 171.37,157.23 167.49,153.91 163.61,150.58 159.73,147.25 155.85,143.91 151.98,140.56 148.10,137.20 144.22,133.84 140.34,130.48 136.46,127.11 132.58,123.74 128.70,120.36 124.82,116.98 120.95,113.60 117.07,110.21 113.19,106.82 109.31,103.43 105.43,100.03 101.55,96.64 97.67,93.24 93.79,89.83 89.92,86.43 86.04,83.03 82.16,79.62 78.28,76.21 74.40,72.80 ' style='stroke-width: 0.75; stroke: none; fill: #000000; fill-opacity: 0.20;' />
+<polyline points='74.40,93.12 78.28,96.13 82.16,99.14 86.04,102.15 89.92,105.16 93.79,108.17 97.67,111.18 101.55,114.19 105.43,117.20 109.31,120.22 113.19,123.23 117.07,126.24 120.95,129.25 124.82,132.26 128.70,135.27 132.58,138.28 136.46,141.29 140.34,144.30 144.22,147.31 148.10,150.33 151.98,153.34 155.85,156.35 159.73,159.36 163.61,162.37 167.49,165.38 171.37,168.39 175.25,171.40 179.13,174.41 183.01,177.43 186.88,180.44 190.76,183.45 194.64,186.46 198.52,189.47 202.40,192.48 206.28,195.49 210.16,198.50 214.04,201.51 217.92,204.53 221.79,207.54 225.67,210.55 229.55,213.56 233.43,216.57 237.31,219.58 241.19,222.59 245.07,225.60 248.95,228.61 252.82,231.63 256.70,234.64 260.58,237.65 264.46,240.66 268.34,243.67 272.22,246.68 276.10,249.69 279.98,252.70 283.85,255.71 287.73,258.72 291.61,261.74 295.49,264.75 299.37,267.76 303.25,270.77 307.13,273.78 311.01,276.79 314.88,279.80 318.76,282.81 322.64,285.82 326.52,288.84 330.40,291.85 334.28,294.86 338.16,297.87 342.04,300.88 345.92,303.89 349.79,306.90 353.67,309.91 357.55,312.92 361.43,315.94 365.31,318.95 369.19,321.96 373.07,324.97 376.95,327.98 380.82,330.99 384.70,334.00 388.58,337.01 392.46,340.02 396.34,343.03 400.22,346.05 404.10,349.06 407.98,352.07 411.85,355.08 415.73,358.09 419.61,361.10 423.49,364.11 427.37,367.12 431.25,370.13 435.13,373.15 439.01,376.16 442.88,379.17 446.76,382.18 450.64,385.19 454.52,388.20 458.40,391.21 ' style='stroke-width: 0.75;' />
+</g>
+</svg>
diff --git a/inst/tinytest/_tinysnapshot/model_lm_80.svg b/inst/tinytest/_tinysnapshot/model_lm_80.svg
new file mode 100644
index 00000000..6eda1fa8
--- /dev/null
+++ b/inst/tinytest/_tinysnapshot/model_lm_80.svg
@@ -0,0 +1,61 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' class='svglite' width='504.00pt' height='504.00pt' viewBox='0 0 504.00 504.00'>
+<defs>
+  <style type='text/css'><![CDATA[
+    .svglite line, .svglite polyline, .svglite polygon, .svglite path, .svglite rect, .svglite circle {
+      fill: none;
+      stroke: #000000;
+      stroke-linecap: round;
+      stroke-linejoin: round;
+      stroke-miterlimit: 10.00;
+    }
+    .svglite text {
+      white-space: pre;
+    }
+  ]]></style>
+</defs>
+<rect width='100%' height='100%' style='stroke: none; fill: #FFFFFF;'/>
+<defs>
+  <clipPath id='cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='504.00' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<text x='266.40' y='485.28' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='27.34px' lengthAdjust='spacingAndGlyphs'>Wind</text>
+<text transform='translate(12.96,244.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='67.70px' lengthAdjust='spacingAndGlyphs'>I(Temp &gt; 80)</text>
+<line x1='141.09' y1='430.56' x2='444.25' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='141.09' y1='430.56' x2='141.09' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='242.15' y1='430.56' x2='242.15' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='343.20' y1='430.56' x2='343.20' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='444.25' y1='430.56' x2='444.25' y2='437.76' style='stroke-width: 0.75;' />
+<text x='141.09' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='242.15' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='343.20' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='444.25' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>20</text>
+<line x1='59.04' y1='401.89' x2='59.04' y2='68.64' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='401.89' x2='51.84' y2='401.89' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='346.35' x2='51.84' y2='346.35' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='290.81' x2='51.84' y2='290.81' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='235.27' x2='51.84' y2='235.27' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='179.73' x2='51.84' y2='179.73' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='124.18' x2='51.84' y2='124.18' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='68.64' x2='51.84' y2='68.64' style='stroke-width: 0.75;' />
+<text transform='translate(41.76,401.89) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='20.68px' lengthAdjust='spacingAndGlyphs'>-0.2</text>
+<text transform='translate(41.76,346.35) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.0</text>
+<text transform='translate(41.76,290.81) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.2</text>
+<text transform='translate(41.76,235.27) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.4</text>
+<text transform='translate(41.76,179.73) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.6</text>
+<text transform='translate(41.76,124.18) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.8</text>
+<text transform='translate(41.76,68.64) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>1.0</text>
+<polygon points='59.04,430.56 473.76,430.56 473.76,59.04 59.04,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpNTkuMDR8NDczLjc2fDU5LjA0fDQzMC41Ng=='>
+    <rect x='59.04' y='59.04' width='414.72' height='371.52' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpNTkuMDR8NDczLjc2fDU5LjA0fDQzMC41Ng==)'>
+<polygon points='74.40,141.83 78.28,143.84 82.16,145.85 86.04,147.86 89.92,149.88 93.79,151.90 97.67,153.92 101.55,155.95 105.43,157.98 109.31,160.02 113.19,162.06 117.07,164.10 120.95,166.15 124.82,168.20 128.70,170.26 132.58,172.33 136.46,174.40 140.34,176.48 144.22,178.57 148.10,180.66 151.98,182.76 155.85,184.88 159.73,187.00 163.61,189.14 167.49,191.29 171.37,193.45 175.25,195.63 179.13,197.82 183.01,200.03 186.88,202.26 190.76,204.50 194.64,206.77 198.52,209.07 202.40,211.39 206.28,213.73 210.16,216.11 214.04,218.51 217.92,220.95 221.79,223.43 225.67,225.94 229.55,228.48 233.43,231.07 237.31,233.70 241.19,236.36 245.07,239.07 248.95,241.81 252.82,244.60 256.70,247.43 260.58,250.29 264.46,253.19 268.34,256.12 272.22,259.09 276.10,262.08 279.98,265.11 283.85,268.16 287.73,271.24 291.61,274.34 295.49,277.47 299.37,280.61 303.25,283.78 307.13,286.96 311.01,290.16 314.88,293.37 318.76,296.59 322.64,299.83 326.52,303.08 330.40,306.34 334.28,309.61 338.16,312.89 342.04,316.17 345.92,319.47 349.79,322.77 353.67,326.08 357.55,329.39 361.43,332.71 365.31,336.03 369.19,339.36 373.07,342.70 376.95,346.04 380.82,349.38 384.70,352.73 388.58,356.08 392.46,359.43 396.34,362.79 400.22,366.15 404.10,369.51 407.98,372.88 411.85,376.24 415.73,379.61 419.61,382.99 423.49,386.36 427.37,389.74 431.25,393.11 435.13,396.49 439.01,399.87 442.88,403.26 446.76,406.64 450.64,410.03 454.52,413.41 458.40,416.80 458.40,329.86 454.52,327.87 450.64,325.88 446.76,323.90 442.88,321.91 439.01,319.91 435.13,317.92 431.25,315.93 427.37,313.93 423.49,311.93 419.61,309.93 415.73,307.93 411.85,305.93 407.98,303.92 404.10,301.91 400.22,299.90 396.34,297.88 392.46,295.87 388.58,293.85 384.70,291.82 380.82,289.80 376.95,287.76 373.07,285.73 369.19,283.69 365.31,281.65 361.43,279.60 357.55,277.54 353.67,275.48 349.79,273.42 345.92,271.34 342.04,269.27 338.16,267.18 334.28,265.08 330.40,262.98 326.52,260.86 322.64,258.74 318.76,256.60 314.88,254.45 311.01,252.29 307.13,250.11 303.25,247.92 299.37,245.71 295.49,243.48 291.61,241.23 287.73,238.96 283.85,236.66 279.98,234.34 276.10,232.00 272.22,229.62 268.34,227.21 264.46,224.77 260.58,222.29 256.70,219.78 252.82,217.23 248.95,214.65 245.07,212.02 241.19,209.35 237.31,206.64 233.43,203.89 229.55,201.10 225.67,198.28 221.79,195.41 217.92,192.51 214.04,189.58 210.16,186.61 206.28,183.61 202.40,180.58 198.52,177.53 194.64,174.45 190.76,171.34 186.88,168.22 183.01,165.07 179.13,161.91 175.25,158.73 171.37,155.53 167.49,152.32 163.61,149.09 159.73,145.85 155.85,142.60 151.98,139.34 148.10,136.07 144.22,132.80 140.34,129.51 136.46,126.21 132.58,122.91 128.70,119.60 124.82,116.29 120.95,112.97 117.07,109.64 113.19,106.31 109.31,102.98 105.43,99.64 101.55,96.30 97.67,92.95 93.79,89.60 89.92,86.24 86.04,82.89 82.16,79.53 78.28,76.17 74.40,72.80 ' style='stroke-width: 0.75; stroke: none; fill: #000000; fill-opacity: 0.20;' />
+<polyline points='74.40,107.31 78.28,110.00 82.16,112.69 86.04,115.38 89.92,118.06 93.79,120.75 97.67,123.44 101.55,126.12 105.43,128.81 109.31,131.50 113.19,134.18 117.07,136.87 120.95,139.56 124.82,142.25 128.70,144.93 132.58,147.62 136.46,150.31 140.34,152.99 144.22,155.68 148.10,158.37 151.98,161.05 155.85,163.74 159.73,166.43 163.61,169.12 167.49,171.80 171.37,174.49 175.25,177.18 179.13,179.86 183.01,182.55 186.88,185.24 190.76,187.92 194.64,190.61 198.52,193.30 202.40,195.99 206.28,198.67 210.16,201.36 214.04,204.05 217.92,206.73 221.79,209.42 225.67,212.11 229.55,214.79 233.43,217.48 237.31,220.17 241.19,222.86 245.07,225.54 248.95,228.23 252.82,230.92 256.70,233.60 260.58,236.29 264.46,238.98 268.34,241.66 272.22,244.35 276.10,247.04 279.98,249.73 283.85,252.41 287.73,255.10 291.61,257.79 295.49,260.47 299.37,263.16 303.25,265.85 307.13,268.54 311.01,271.22 314.88,273.91 318.76,276.60 322.64,279.28 326.52,281.97 330.40,284.66 334.28,287.34 338.16,290.03 342.04,292.72 345.92,295.41 349.79,298.09 353.67,300.78 357.55,303.47 361.43,306.15 365.31,308.84 369.19,311.53 373.07,314.21 376.95,316.90 380.82,319.59 384.70,322.28 388.58,324.96 392.46,327.65 396.34,330.34 400.22,333.02 404.10,335.71 407.98,338.40 411.85,341.08 415.73,343.77 419.61,346.46 423.49,349.15 427.37,351.83 431.25,354.52 435.13,357.21 439.01,359.89 442.88,362.58 446.76,365.27 450.64,367.95 454.52,370.64 458.40,373.33 ' style='stroke-width: 0.75;' />
+</g>
+</svg>
diff --git a/inst/tinytest/_tinysnapshot/model_lm_95.svg b/inst/tinytest/_tinysnapshot/model_lm_95.svg
new file mode 100644
index 00000000..e8fc0016
--- /dev/null
+++ b/inst/tinytest/_tinysnapshot/model_lm_95.svg
@@ -0,0 +1,61 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' class='svglite' width='504.00pt' height='504.00pt' viewBox='0 0 504.00 504.00'>
+<defs>
+  <style type='text/css'><![CDATA[
+    .svglite line, .svglite polyline, .svglite polygon, .svglite path, .svglite rect, .svglite circle {
+      fill: none;
+      stroke: #000000;
+      stroke-linecap: round;
+      stroke-linejoin: round;
+      stroke-miterlimit: 10.00;
+    }
+    .svglite text {
+      white-space: pre;
+    }
+  ]]></style>
+</defs>
+<rect width='100%' height='100%' style='stroke: none; fill: #FFFFFF;'/>
+<defs>
+  <clipPath id='cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='504.00' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<text x='266.40' y='485.28' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='27.34px' lengthAdjust='spacingAndGlyphs'>Wind</text>
+<text transform='translate(12.96,244.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='67.70px' lengthAdjust='spacingAndGlyphs'>I(Temp &gt; 80)</text>
+<line x1='141.09' y1='430.56' x2='444.25' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='141.09' y1='430.56' x2='141.09' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='242.15' y1='430.56' x2='242.15' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='343.20' y1='430.56' x2='343.20' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='444.25' y1='430.56' x2='444.25' y2='437.76' style='stroke-width: 0.75;' />
+<text x='141.09' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='242.15' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='343.20' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='444.25' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>20</text>
+<line x1='59.04' y1='382.77' x2='59.04' y2='85.56' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='382.77' x2='51.84' y2='382.77' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='333.23' x2='51.84' y2='333.23' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='283.70' x2='51.84' y2='283.70' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='234.16' x2='51.84' y2='234.16' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='184.63' x2='51.84' y2='184.63' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='135.09' x2='51.84' y2='135.09' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='85.56' x2='51.84' y2='85.56' style='stroke-width: 0.75;' />
+<text transform='translate(41.76,382.77) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='20.68px' lengthAdjust='spacingAndGlyphs'>-0.2</text>
+<text transform='translate(41.76,333.23) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.0</text>
+<text transform='translate(41.76,283.70) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.2</text>
+<text transform='translate(41.76,234.16) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.4</text>
+<text transform='translate(41.76,184.63) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.6</text>
+<text transform='translate(41.76,135.09) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.8</text>
+<text transform='translate(41.76,85.56) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>1.0</text>
+<polygon points='59.04,430.56 473.76,430.56 473.76,59.04 59.04,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpNTkuMDR8NDczLjc2fDU5LjA0fDQzMC41Ng=='>
+    <rect x='59.04' y='59.04' width='414.72' height='371.52' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpNTkuMDR8NDczLjc2fDU5LjA0fDQzMC41Ng==)'>
+<polygon points='74.40,167.30 78.28,168.76 82.16,170.24 86.04,171.71 89.92,173.19 93.79,174.67 97.67,176.16 101.55,177.65 105.43,179.15 109.31,180.66 113.19,182.17 117.07,183.68 120.95,185.20 124.82,186.73 128.70,188.27 132.58,189.82 136.46,191.37 140.34,192.94 144.22,194.51 148.10,196.10 151.98,197.70 155.85,199.31 159.73,200.93 163.61,202.58 167.49,204.24 171.37,205.91 175.25,207.61 179.13,209.33 183.01,211.07 186.88,212.84 190.76,214.64 194.64,216.46 198.52,218.32 202.40,220.21 206.28,222.14 210.16,224.11 214.04,226.12 217.92,228.18 221.79,230.29 225.67,232.44 229.55,234.64 233.43,236.90 237.31,239.21 241.19,241.58 245.07,244.00 248.95,246.48 252.82,249.01 256.70,251.60 260.58,254.24 264.46,256.92 268.34,259.65 272.22,262.43 276.10,265.25 279.98,268.11 283.85,271.01 287.73,273.95 291.61,276.91 295.49,279.91 299.37,282.93 303.25,285.98 307.13,289.05 311.01,292.15 314.88,295.26 318.76,298.39 322.64,301.54 326.52,304.71 330.40,307.89 334.28,311.08 338.16,314.29 342.04,317.51 345.92,320.73 349.79,323.97 353.67,327.22 357.55,330.47 361.43,333.73 365.31,337.00 369.19,340.28 373.07,343.56 376.95,346.85 380.82,350.15 384.70,353.45 388.58,356.75 392.46,360.06 396.34,363.37 400.22,366.69 404.10,370.01 407.98,373.34 411.85,376.66 415.73,380.00 419.61,383.33 423.49,386.67 427.37,390.01 431.25,393.35 435.13,396.69 439.01,400.04 442.88,403.39 446.76,406.74 450.64,410.09 454.52,413.44 458.40,416.80 458.40,297.78 454.52,296.34 450.64,294.91 446.76,293.47 442.88,292.02 439.01,290.58 435.13,289.13 431.25,287.68 427.37,286.23 423.49,284.78 419.61,283.32 415.73,281.86 411.85,280.40 407.98,278.94 404.10,277.47 400.22,276.00 396.34,274.52 392.46,273.04 388.58,271.56 384.70,270.07 380.82,268.58 376.95,267.08 373.07,265.58 369.19,264.07 365.31,262.55 361.43,261.03 357.55,259.50 353.67,257.96 349.79,256.41 345.92,254.86 342.04,253.29 338.16,251.72 334.28,250.13 330.40,248.53 326.52,246.92 322.64,245.29 318.76,243.65 314.88,241.99 311.01,240.31 307.13,238.61 303.25,236.89 299.37,235.15 295.49,233.38 291.61,231.58 287.73,229.75 283.85,227.89 279.98,226.00 276.10,224.07 272.22,222.09 268.34,220.08 264.46,218.02 260.58,215.91 256.70,213.76 252.82,211.55 248.95,209.29 245.07,206.97 241.19,204.60 237.31,202.18 233.43,199.70 229.55,197.16 225.67,194.58 221.79,191.94 217.92,189.25 214.04,186.51 210.16,183.73 206.28,180.91 202.40,178.05 198.52,175.14 194.64,172.21 190.76,169.24 186.88,166.25 183.01,163.22 179.13,160.17 175.25,157.10 171.37,154.00 167.49,150.89 163.61,147.75 159.73,144.60 155.85,141.44 151.98,138.26 148.10,135.06 144.22,131.85 140.34,128.64 136.46,125.41 132.58,122.17 128.70,118.92 124.82,115.67 120.95,112.41 117.07,109.14 113.19,105.86 109.31,102.57 105.43,99.29 101.55,95.99 97.67,92.69 93.79,89.39 89.92,86.08 86.04,82.76 82.16,79.45 78.28,76.12 74.40,72.80 ' style='stroke-width: 0.75; stroke: none; fill: #000000; fill-opacity: 0.20;' />
+<polyline points='74.40,120.05 78.28,122.44 82.16,124.84 86.04,127.24 89.92,129.63 93.79,132.03 97.67,134.43 101.55,136.82 105.43,139.22 109.31,141.62 113.19,144.01 117.07,146.41 120.95,148.80 124.82,151.20 128.70,153.60 132.58,155.99 136.46,158.39 140.34,160.79 144.22,163.18 148.10,165.58 151.98,167.98 155.85,170.37 159.73,172.77 163.61,175.16 167.49,177.56 171.37,179.96 175.25,182.35 179.13,184.75 183.01,187.15 186.88,189.54 190.76,191.94 194.64,194.34 198.52,196.73 202.40,199.13 206.28,201.53 210.16,203.92 214.04,206.32 217.92,208.71 221.79,211.11 225.67,213.51 229.55,215.90 233.43,218.30 237.31,220.70 241.19,223.09 245.07,225.49 248.95,227.89 252.82,230.28 256.70,232.68 260.58,235.07 264.46,237.47 268.34,239.87 272.22,242.26 276.10,244.66 279.98,247.06 283.85,249.45 287.73,251.85 291.61,254.25 295.49,256.64 299.37,259.04 303.25,261.43 307.13,263.83 311.01,266.23 314.88,268.62 318.76,271.02 322.64,273.42 326.52,275.81 330.40,278.21 334.28,280.61 338.16,283.00 342.04,285.40 345.92,287.80 349.79,290.19 353.67,292.59 357.55,294.98 361.43,297.38 365.31,299.78 369.19,302.17 373.07,304.57 376.95,306.97 380.82,309.36 384.70,311.76 388.58,314.16 392.46,316.55 396.34,318.95 400.22,321.34 404.10,323.74 407.98,326.14 411.85,328.53 415.73,330.93 419.61,333.33 423.49,335.72 427.37,338.12 431.25,340.52 435.13,342.91 439.01,345.31 442.88,347.70 446.76,350.10 450.64,352.50 454.52,354.89 458.40,357.29 ' style='stroke-width: 0.75;' />
+</g>
+</svg>
diff --git a/inst/tinytest/_tinysnapshot/model_lm_by.svg b/inst/tinytest/_tinysnapshot/model_lm_by.svg
new file mode 100644
index 00000000..b6352c99
--- /dev/null
+++ b/inst/tinytest/_tinysnapshot/model_lm_by.svg
@@ -0,0 +1,88 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' class='svglite' width='504.00pt' height='504.00pt' viewBox='0 0 504.00 504.00'>
+<defs>
+  <style type='text/css'><![CDATA[
+    .svglite line, .svglite polyline, .svglite polygon, .svglite path, .svglite rect, .svglite circle {
+      fill: none;
+      stroke: #000000;
+      stroke-linecap: round;
+      stroke-linejoin: round;
+      stroke-miterlimit: 10.00;
+    }
+    .svglite text {
+      white-space: pre;
+    }
+  ]]></style>
+</defs>
+<rect width='100%' height='100%' style='stroke: none; fill: #FFFFFF;'/>
+<defs>
+  <clipPath id='cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='504.00' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='447.61' y1='217.80' x2='461.11' y2='217.80' style='stroke-width: 0.75;' />
+<line x1='447.61' y1='235.80' x2='461.11' y2='235.80' style='stroke-width: 0.75; stroke: #DF536B;' />
+<line x1='447.61' y1='253.80' x2='461.11' y2='253.80' style='stroke-width: 0.75; stroke: #61D04F;' />
+<line x1='447.61' y1='271.80' x2='461.11' y2='271.80' style='stroke-width: 0.75; stroke: #2297E6;' />
+<line x1='447.61' y1='289.80' x2='461.11' y2='289.80' style='stroke-width: 0.75; stroke: #28E2E5;' />
+<rect x='445.98' y='209.43' width='16.75' height='16.75' style='stroke-width: 0.00; fill: #000000; fill-opacity: 0.20;' />
+<rect x='445.98' y='227.43' width='16.75' height='16.75' style='stroke-width: 0.00; stroke: #DF536B; fill: #DF536B; fill-opacity: 0.20;' />
+<rect x='445.98' y='245.43' width='16.75' height='16.75' style='stroke-width: 0.00; stroke: #61D04F; fill: #61D04F; fill-opacity: 0.20;' />
+<rect x='445.98' y='263.43' width='16.75' height='16.75' style='stroke-width: 0.00; stroke: #2297E6; fill: #2297E6; fill-opacity: 0.20;' />
+<rect x='445.98' y='281.43' width='16.75' height='16.75' style='stroke-width: 0.00; stroke: #28E2E5; fill: #28E2E5; fill-opacity: 0.20;' />
+<text x='464.18' y='198.00' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='71.37px' lengthAdjust='spacingAndGlyphs'>factor(Month)</text>
+<text x='471.91' y='221.93' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='471.91' y='239.93' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>6</text>
+<text x='471.91' y='257.93' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>7</text>
+<text x='471.91' y='275.93' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>8</text>
+<text x='471.91' y='293.93' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>9</text>
+</g>
+<defs>
+  <clipPath id='cpMC4wMHw0MTEuMzl8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='411.39' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw0MTEuMzl8MC4wMHw1MDQuMDA=)'>
+<text x='235.22' y='485.28' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='27.34px' lengthAdjust='spacingAndGlyphs'>Wind</text>
+<text transform='translate(12.96,244.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='67.70px' lengthAdjust='spacingAndGlyphs'>I(Temp &gt; 80)</text>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='128.76' y1='430.56' x2='386.32' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='128.76' y1='430.56' x2='128.76' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='214.61' y1='430.56' x2='214.61' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='300.47' y1='430.56' x2='300.47' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='386.32' y1='430.56' x2='386.32' y2='437.76' style='stroke-width: 0.75;' />
+<text x='128.76' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='214.61' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='300.47' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='386.32' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>20</text>
+<line x1='59.04' y1='345.79' x2='59.04' y2='66.26' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='345.79' x2='51.84' y2='345.79' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='252.61' x2='51.84' y2='252.61' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='159.44' x2='51.84' y2='159.44' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='66.26' x2='51.84' y2='66.26' style='stroke-width: 0.75;' />
+<text transform='translate(41.76,345.79) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.0</text>
+<text transform='translate(41.76,252.61) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.5</text>
+<text transform='translate(41.76,159.44) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>1.0</text>
+<text transform='translate(41.76,66.26) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>1.5</text>
+<polygon points='59.04,430.56 411.39,430.56 411.39,59.04 59.04,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpNTkuMDR8NDExLjM5fDU5LjA0fDQzMC41Ng=='>
+    <rect x='59.04' y='59.04' width='352.35' height='371.52' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpNTkuMDR8NDExLjM5fDU5LjA0fDQzMC41Ng==)'>
+<polygon points='140.78,373.79 143.27,373.11 145.77,372.43 148.27,371.76 150.77,371.09 153.26,370.42 155.76,369.75 158.26,369.09 160.76,368.44 163.25,367.79 165.75,367.14 168.25,366.50 170.75,365.86 173.24,365.23 175.74,364.60 178.24,363.98 180.74,363.37 183.23,362.77 185.73,362.17 188.23,361.58 190.73,361.00 193.23,360.43 195.72,359.87 198.22,359.32 200.72,358.78 203.22,358.26 205.71,357.74 208.21,357.24 210.71,356.75 213.21,356.28 215.70,355.82 218.20,355.38 220.70,354.96 223.20,354.55 225.69,354.17 228.19,353.80 230.69,353.45 233.19,353.13 235.69,352.82 238.18,352.53 240.68,352.27 243.18,352.03 245.68,351.81 248.17,351.61 250.67,351.43 253.17,351.27 255.67,351.14 258.16,351.02 260.66,350.93 263.16,350.85 265.66,350.79 268.15,350.75 270.65,350.72 273.15,350.71 275.65,350.72 278.14,350.74 280.64,350.77 283.14,350.82 285.64,350.88 288.14,350.95 290.63,351.03 293.13,351.12 295.63,351.22 298.13,351.33 300.62,351.45 303.12,351.58 305.62,351.71 308.12,351.85 310.61,352.00 313.11,352.15 315.61,352.31 318.11,352.48 320.60,352.65 323.10,352.82 325.60,353.00 328.10,353.19 330.60,353.37 333.09,353.56 335.59,353.76 338.09,353.96 340.59,354.16 343.08,354.36 345.58,354.57 348.08,354.78 350.58,355.00 353.07,355.21 355.57,355.43 358.07,355.65 360.57,355.87 363.06,356.09 365.56,356.32 368.06,356.55 370.56,356.78 373.05,357.01 375.55,357.24 378.05,357.47 380.55,357.71 383.05,357.95 385.54,358.18 388.04,358.42 388.04,293.45 385.54,294.17 383.05,294.88 380.55,295.59 378.05,296.30 375.55,297.01 373.05,297.72 370.56,298.42 368.06,299.13 365.56,299.83 363.06,300.53 360.57,301.23 358.07,301.93 355.57,302.62 353.07,303.31 350.58,304.00 348.08,304.69 345.58,305.38 343.08,306.06 340.59,306.74 338.09,307.42 335.59,308.09 333.09,308.76 330.60,309.43 328.10,310.09 325.60,310.75 323.10,311.40 320.60,312.05 318.11,312.70 315.61,313.34 313.11,313.97 310.61,314.60 308.12,315.22 305.62,315.84 303.12,316.45 300.62,317.05 298.13,317.64 295.63,318.23 293.13,318.80 290.63,319.37 288.14,319.92 285.64,320.47 283.14,321.00 280.64,321.52 278.14,322.03 275.65,322.53 273.15,323.01 270.65,323.48 268.15,323.92 265.66,324.36 263.16,324.77 260.66,325.17 258.16,325.55 255.67,325.91 253.17,326.25 250.67,326.56 248.17,326.86 245.68,327.14 243.18,327.39 240.68,327.62 238.18,327.84 235.69,328.03 233.19,328.19 230.69,328.34 228.19,328.47 225.69,328.58 223.20,328.66 220.70,328.73 218.20,328.79 215.70,328.82 213.21,328.84 210.71,328.84 208.21,328.83 205.71,328.80 203.22,328.76 200.72,328.71 198.22,328.65 195.72,328.57 193.23,328.49 190.73,328.39 188.23,328.29 185.73,328.17 183.23,328.05 180.74,327.92 178.24,327.78 175.74,327.64 173.24,327.49 170.75,327.33 168.25,327.17 165.75,327.00 163.25,326.83 160.76,326.65 158.26,326.47 155.76,326.29 153.26,326.10 150.77,325.91 148.27,325.71 145.77,325.51 143.27,325.31 140.78,325.10 ' style='stroke-width: 0.75; stroke: none; fill: #000000; fill-opacity: 0.20;' />
+<polyline points='140.78,349.45 143.27,349.21 145.77,348.97 148.27,348.73 150.77,348.50 153.26,348.26 155.76,348.02 158.26,347.78 160.76,347.55 163.25,347.31 165.75,347.07 168.25,346.83 170.75,346.60 173.24,346.36 175.74,346.12 178.24,345.88 180.74,345.65 183.23,345.41 185.73,345.17 188.23,344.93 190.73,344.70 193.23,344.46 195.72,344.22 198.22,343.98 200.72,343.75 203.22,343.51 205.71,343.27 208.21,343.03 210.71,342.80 213.21,342.56 215.70,342.32 218.20,342.08 220.70,341.85 223.20,341.61 225.69,341.37 228.19,341.13 230.69,340.90 233.19,340.66 235.69,340.42 238.18,340.18 240.68,339.95 243.18,339.71 245.68,339.47 248.17,339.24 250.67,339.00 253.17,338.76 255.67,338.52 258.16,338.29 260.66,338.05 263.16,337.81 265.66,337.57 268.15,337.34 270.65,337.10 273.15,336.86 275.65,336.62 278.14,336.39 280.64,336.15 283.14,335.91 285.64,335.67 288.14,335.44 290.63,335.20 293.13,334.96 295.63,334.72 298.13,334.49 300.62,334.25 303.12,334.01 305.62,333.77 308.12,333.54 310.61,333.30 313.11,333.06 315.61,332.82 318.11,332.59 320.60,332.35 323.10,332.11 325.60,331.87 328.10,331.64 330.60,331.40 333.09,331.16 335.59,330.92 338.09,330.69 340.59,330.45 343.08,330.21 345.58,329.97 348.08,329.74 350.58,329.50 353.07,329.26 355.57,329.03 358.07,328.79 360.57,328.55 363.06,328.31 365.56,328.08 368.06,327.84 370.56,327.60 373.05,327.36 375.55,327.13 378.05,326.89 380.55,326.65 383.05,326.41 385.54,326.18 388.04,325.94 ' style='stroke-width: 0.75;' />
+<polygon points='72.09,341.98 75.39,340.97 78.68,339.98 81.98,338.99 85.27,338.00 88.57,337.02 91.86,336.05 95.16,335.09 98.45,334.14 101.75,333.20 105.05,332.26 108.34,331.34 111.64,330.43 114.93,329.53 118.23,328.64 121.52,327.76 124.82,326.90 128.11,326.06 131.41,325.23 134.70,324.43 138.00,323.64 141.30,322.87 144.59,322.13 147.89,321.41 151.18,320.71 154.48,320.05 157.77,319.42 161.07,318.82 164.36,318.26 167.66,317.73 170.95,317.25 174.25,316.82 177.55,316.43 180.84,316.10 184.14,315.82 187.43,315.61 190.73,315.46 194.02,315.37 197.32,315.36 200.61,315.43 203.91,315.58 207.21,315.81 210.50,316.13 213.80,316.53 217.09,317.02 220.39,317.61 223.68,318.28 226.98,319.04 230.27,319.90 233.57,320.84 236.86,321.86 240.16,322.96 243.46,324.14 246.75,325.40 250.05,326.72 253.34,328.11 256.64,329.56 259.93,331.07 263.23,332.64 266.52,334.25 269.82,335.91 273.11,337.62 276.41,339.36 279.71,341.14 283.00,342.96 286.30,344.81 289.59,346.68 292.89,348.59 296.18,350.52 299.48,352.47 302.77,354.45 306.07,356.44 309.37,358.45 312.66,360.48 315.96,362.53 319.25,364.59 322.55,366.67 325.84,368.76 329.14,370.86 332.43,372.97 335.73,375.10 339.02,377.23 342.32,379.37 345.62,381.52 348.91,383.68 352.21,385.85 355.50,388.03 358.80,390.21 362.09,392.40 365.39,394.59 368.68,396.79 371.98,398.99 375.28,401.20 378.57,403.42 381.87,405.64 385.16,407.86 388.46,410.09 391.75,412.32 395.05,414.56 398.34,416.80 398.34,215.35 395.05,216.40 391.75,217.44 388.46,218.48 385.16,219.52 381.87,220.55 378.57,221.58 375.28,222.60 371.98,223.62 368.68,224.63 365.39,225.64 362.09,226.64 358.80,227.64 355.50,228.63 352.21,229.61 348.91,230.58 345.62,231.55 342.32,232.51 339.02,233.46 335.73,234.40 332.43,235.33 329.14,236.25 325.84,237.16 322.55,238.06 319.25,238.95 315.96,239.82 312.66,240.67 309.37,241.51 306.07,242.33 302.77,243.13 299.48,243.92 296.18,244.68 292.89,245.42 289.59,246.13 286.30,246.81 283.00,247.47 279.71,248.09 276.41,248.68 273.11,249.23 269.82,249.75 266.52,250.22 263.23,250.64 259.93,251.01 256.64,251.33 253.34,251.59 250.05,251.78 246.75,251.92 243.46,251.98 240.16,251.97 236.86,251.88 233.57,251.71 230.27,251.45 226.98,251.11 223.68,250.69 220.39,250.17 217.09,249.56 213.80,248.86 210.50,248.07 207.21,247.20 203.91,246.24 200.61,245.19 197.32,244.07 194.02,242.86 190.73,241.59 187.43,240.25 184.14,238.84 180.84,237.37 177.55,235.85 174.25,234.27 170.95,232.64 167.66,230.97 164.36,229.25 161.07,227.50 157.77,225.71 154.48,223.88 151.18,222.03 147.89,220.14 144.59,218.23 141.30,216.29 138.00,214.33 134.70,212.35 131.41,210.35 128.11,208.33 124.82,206.30 121.52,204.25 118.23,202.18 114.93,200.10 111.64,198.01 108.34,195.90 105.05,193.79 101.75,191.66 98.45,189.53 95.16,187.38 91.86,185.23 88.57,183.07 85.27,180.90 81.98,178.72 78.68,176.54 75.39,174.35 72.09,172.15 ' style='stroke-width: 0.75; stroke: none; fill: #DF536B; fill-opacity: 0.20;' />
+<polyline points='72.09,257.06 75.39,257.66 78.68,258.26 81.98,258.85 85.27,259.45 88.57,260.05 91.86,260.64 95.16,261.24 98.45,261.83 101.75,262.43 105.05,263.03 108.34,263.62 111.64,264.22 114.93,264.81 118.23,265.41 121.52,266.01 124.82,266.60 128.11,267.20 131.41,267.79 134.70,268.39 138.00,268.99 141.30,269.58 144.59,270.18 147.89,270.77 151.18,271.37 154.48,271.97 157.77,272.56 161.07,273.16 164.36,273.75 167.66,274.35 170.95,274.95 174.25,275.54 177.55,276.14 180.84,276.73 184.14,277.33 187.43,277.93 190.73,278.52 194.02,279.12 197.32,279.72 200.61,280.31 203.91,280.91 207.21,281.50 210.50,282.10 213.80,282.70 217.09,283.29 220.39,283.89 223.68,284.48 226.98,285.08 230.27,285.68 233.57,286.27 236.86,286.87 240.16,287.46 243.46,288.06 246.75,288.66 250.05,289.25 253.34,289.85 256.64,290.44 259.93,291.04 263.23,291.64 266.52,292.23 269.82,292.83 273.11,293.42 276.41,294.02 279.71,294.62 283.00,295.21 286.30,295.81 289.59,296.41 292.89,297.00 296.18,297.60 299.48,298.19 302.77,298.79 306.07,299.39 309.37,299.98 312.66,300.58 315.96,301.17 319.25,301.77 322.55,302.37 325.84,302.96 329.14,303.56 332.43,304.15 335.73,304.75 339.02,305.35 342.32,305.94 345.62,306.54 348.91,307.13 352.21,307.73 355.50,308.33 358.80,308.92 362.09,309.52 365.39,310.11 368.68,310.71 371.98,311.31 375.28,311.90 378.57,312.50 381.87,313.09 385.16,313.69 388.46,314.29 391.75,314.88 395.05,315.48 398.34,316.08 ' style='stroke-width: 0.75; stroke: #DF536B;' />
+<polygon points='113.30,186.97 115.17,186.99 117.05,187.02 118.92,187.05 120.79,187.08 122.67,187.12 124.54,187.17 126.41,187.22 128.29,187.28 130.16,187.34 132.03,187.40 133.91,187.48 135.78,187.56 137.65,187.65 139.53,187.74 141.40,187.85 143.27,187.96 145.15,188.08 147.02,188.21 148.89,188.35 150.77,188.50 152.64,188.66 154.51,188.83 156.39,189.02 158.26,189.21 160.13,189.43 162.00,189.65 163.88,189.89 165.75,190.15 167.62,190.42 169.50,190.72 171.37,191.03 173.24,191.36 175.12,191.70 176.99,192.07 178.86,192.47 180.74,192.88 182.61,193.32 184.48,193.78 186.36,194.26 188.23,194.77 190.10,195.31 191.98,195.87 193.85,196.46 195.72,197.07 197.60,197.71 199.47,198.38 201.34,199.08 203.22,199.80 205.09,200.54 206.96,201.31 208.84,202.11 210.71,202.93 212.58,203.77 214.46,204.64 216.33,205.53 218.20,206.44 220.07,207.37 221.95,208.32 223.82,209.29 225.69,210.28 227.57,211.28 229.44,212.30 231.31,213.34 233.19,214.39 235.06,215.46 236.93,216.54 238.81,217.64 240.68,218.74 242.55,219.86 244.43,220.99 246.30,222.12 248.17,223.27 250.05,224.43 251.92,225.59 253.79,226.77 255.67,227.95 257.54,229.14 259.41,230.34 261.29,231.54 263.16,232.75 265.03,233.96 266.91,235.18 268.78,236.41 270.65,237.64 272.53,238.88 274.40,240.12 276.27,241.37 278.14,242.62 280.02,243.87 281.89,245.13 283.76,246.39 285.64,247.65 287.51,248.92 289.38,250.19 291.26,251.46 293.13,252.74 295.00,254.02 296.88,255.30 298.75,256.59 298.75,168.01 296.88,168.02 295.00,168.03 293.13,168.03 291.26,168.03 289.38,168.03 287.51,168.03 285.64,168.02 283.76,168.01 281.89,168.00 280.02,167.98 278.14,167.96 276.27,167.93 274.40,167.90 272.53,167.87 270.65,167.83 268.78,167.78 266.91,167.73 265.03,167.68 263.16,167.62 261.29,167.55 259.41,167.48 257.54,167.40 255.67,167.32 253.79,167.22 251.92,167.12 250.05,167.01 248.17,166.89 246.30,166.77 244.43,166.63 242.55,166.48 240.68,166.32 238.81,166.15 236.93,165.97 235.06,165.77 233.19,165.57 231.31,165.34 229.44,165.11 227.57,164.85 225.69,164.58 223.82,164.29 221.95,163.99 220.07,163.66 218.20,163.32 216.33,162.95 214.46,162.57 212.58,162.16 210.71,161.73 208.84,161.27 206.96,160.79 205.09,160.29 203.22,159.76 201.34,159.20 199.47,158.62 197.60,158.01 195.72,157.38 193.85,156.72 191.98,156.03 190.10,155.32 188.23,154.58 186.36,153.81 184.48,153.02 182.61,152.21 180.74,151.37 178.86,150.51 176.99,149.62 175.12,148.72 173.24,147.79 171.37,146.84 169.50,145.88 167.62,144.90 165.75,143.89 163.88,142.88 162.00,141.84 160.13,140.79 158.26,139.73 156.39,138.65 154.51,137.56 152.64,136.46 150.77,135.34 148.89,134.22 147.02,133.08 145.15,131.94 143.27,130.78 141.40,129.62 139.53,128.45 137.65,127.27 135.78,126.08 133.91,124.88 132.03,123.68 130.16,122.47 128.29,121.26 126.41,120.04 124.54,118.81 122.67,117.58 120.79,116.35 118.92,115.11 117.05,113.86 115.17,112.62 113.30,111.36 ' style='stroke-width: 0.75; stroke: none; fill: #61D04F; fill-opacity: 0.20;' />
+<polyline points='113.30,149.17 115.17,149.80 117.05,150.44 118.92,151.08 120.79,151.72 122.67,152.35 124.54,152.99 126.41,153.63 128.29,154.27 130.16,154.91 132.03,155.54 133.91,156.18 135.78,156.82 137.65,157.46 139.53,158.09 141.40,158.73 143.27,159.37 145.15,160.01 147.02,160.65 148.89,161.28 150.77,161.92 152.64,162.56 154.51,163.20 156.39,163.83 158.26,164.47 160.13,165.11 162.00,165.75 163.88,166.38 165.75,167.02 167.62,167.66 169.50,168.30 171.37,168.94 173.24,169.57 175.12,170.21 176.99,170.85 178.86,171.49 180.74,172.12 182.61,172.76 184.48,173.40 186.36,174.04 188.23,174.67 190.10,175.31 191.98,175.95 193.85,176.59 195.72,177.23 197.60,177.86 199.47,178.50 201.34,179.14 203.22,179.78 205.09,180.41 206.96,181.05 208.84,181.69 210.71,182.33 212.58,182.97 214.46,183.60 216.33,184.24 218.20,184.88 220.07,185.52 221.95,186.15 223.82,186.79 225.69,187.43 227.57,188.07 229.44,188.70 231.31,189.34 233.19,189.98 235.06,190.62 236.93,191.26 238.81,191.89 240.68,192.53 242.55,193.17 244.43,193.81 246.30,194.44 248.17,195.08 250.05,195.72 251.92,196.36 253.79,197.00 255.67,197.63 257.54,198.27 259.41,198.91 261.29,199.55 263.16,200.18 265.03,200.82 266.91,201.46 268.78,202.10 270.65,202.73 272.53,203.37 274.40,204.01 276.27,204.65 278.14,205.29 280.02,205.92 281.89,206.56 283.76,207.20 285.64,207.84 287.51,208.47 289.38,209.11 291.26,209.75 293.13,210.39 295.00,211.03 296.88,211.66 298.75,212.30 ' style='stroke-width: 0.75; stroke: #61D04F;' />
+<polygon points='82.39,209.55 84.68,210.16 86.97,210.76 89.26,211.37 91.55,211.99 93.84,212.61 96.13,213.24 98.42,213.87 100.71,214.51 103.00,215.16 105.29,215.82 107.58,216.48 109.87,217.15 112.16,217.83 114.45,218.52 116.74,219.21 119.02,219.92 121.31,220.64 123.60,221.37 125.89,222.11 128.18,222.86 130.47,223.63 132.76,224.42 135.05,225.22 137.34,226.03 139.63,226.87 141.92,227.72 144.21,228.59 146.50,229.48 148.79,230.40 151.08,231.34 153.37,232.31 155.66,233.30 157.95,234.32 160.24,235.38 162.53,236.46 164.81,237.58 167.10,238.74 169.39,239.94 171.68,241.17 173.97,242.45 176.26,243.77 178.55,245.14 180.84,246.56 183.13,248.02 185.42,249.53 187.71,251.10 190.00,252.71 192.29,254.38 194.58,256.10 196.87,257.88 199.16,259.71 201.45,261.59 203.74,263.52 206.03,265.50 208.32,267.53 210.60,269.61 212.89,271.74 215.18,273.91 217.47,276.12 219.76,278.37 222.05,280.67 224.34,283.00 226.63,285.36 228.92,287.76 231.21,290.19 233.50,292.65 235.79,295.14 238.08,297.65 240.37,300.19 242.66,302.75 244.95,305.34 247.24,307.94 249.53,310.57 251.82,313.21 254.11,315.87 256.39,318.55 258.68,321.24 260.97,323.94 263.26,326.66 265.55,329.39 267.84,332.13 270.13,334.89 272.42,337.65 274.71,340.43 277.00,343.21 279.29,346.00 281.58,348.80 283.87,351.61 286.16,354.42 288.45,357.25 290.74,360.07 293.03,362.91 295.32,365.75 297.61,368.60 299.90,371.45 302.18,374.31 304.47,377.17 306.76,380.03 309.05,382.91 309.05,242.52 306.76,241.93 304.47,241.33 302.18,240.72 299.90,240.11 297.61,239.50 295.32,238.88 293.03,238.26 290.74,237.63 288.45,236.99 286.16,236.35 283.87,235.70 281.58,235.04 279.29,234.38 277.00,233.70 274.71,233.02 272.42,232.33 270.13,231.63 267.84,230.92 265.55,230.19 263.26,229.46 260.97,228.71 258.68,227.95 256.39,227.18 254.11,226.39 251.82,225.58 249.53,224.76 247.24,223.92 244.95,223.06 242.66,222.18 240.37,221.27 238.08,220.35 235.79,219.40 233.50,218.42 231.21,217.41 228.92,216.38 226.63,215.31 224.34,214.21 222.05,213.08 219.76,211.90 217.47,210.69 215.18,209.44 212.89,208.14 210.60,206.80 208.32,205.42 206.03,203.98 203.74,202.50 201.45,200.97 199.16,199.38 196.87,197.74 194.58,196.05 192.29,194.31 190.00,192.51 187.71,190.66 185.42,188.76 183.13,186.81 180.84,184.81 178.55,182.76 176.26,180.66 173.97,178.52 171.68,176.33 169.39,174.10 167.10,171.83 164.81,169.52 162.53,167.18 160.24,164.80 157.95,162.39 155.66,159.95 153.37,157.47 151.08,154.98 148.79,152.45 146.50,149.90 144.21,147.33 141.92,144.74 139.63,142.12 137.34,139.49 135.05,136.84 132.76,134.18 130.47,131.49 128.18,128.80 125.89,126.09 123.60,123.36 121.31,120.63 119.02,117.88 116.74,115.12 114.45,112.35 112.16,109.58 109.87,106.79 107.58,104.00 105.29,101.19 103.00,98.38 100.71,95.56 98.42,92.74 96.13,89.91 93.84,87.07 91.55,84.23 89.26,81.38 86.97,78.52 84.68,75.66 82.39,72.80 ' style='stroke-width: 0.75; stroke: none; fill: #2297E6; fill-opacity: 0.20;' />
+<polyline points='82.39,141.18 84.68,142.91 86.97,144.64 89.26,146.38 91.55,148.11 93.84,149.84 96.13,151.57 98.42,153.31 100.71,155.04 103.00,156.77 105.29,158.50 107.58,160.24 109.87,161.97 112.16,163.70 114.45,165.43 116.74,167.17 119.02,168.90 121.31,170.63 123.60,172.37 125.89,174.10 128.18,175.83 130.47,177.56 132.76,179.30 135.05,181.03 137.34,182.76 139.63,184.49 141.92,186.23 144.21,187.96 146.50,189.69 148.79,191.43 151.08,193.16 153.37,194.89 155.66,196.62 157.95,198.36 160.24,200.09 162.53,201.82 164.81,203.55 167.10,205.29 169.39,207.02 171.68,208.75 173.97,210.48 176.26,212.22 178.55,213.95 180.84,215.68 183.13,217.42 185.42,219.15 187.71,220.88 190.00,222.61 192.29,224.35 194.58,226.08 196.87,227.81 199.16,229.54 201.45,231.28 203.74,233.01 206.03,234.74 208.32,236.47 210.60,238.21 212.89,239.94 215.18,241.67 217.47,243.41 219.76,245.14 222.05,246.87 224.34,248.60 226.63,250.34 228.92,252.07 231.21,253.80 233.50,255.53 235.79,257.27 238.08,259.00 240.37,260.73 242.66,262.46 244.95,264.20 247.24,265.93 249.53,267.66 251.82,269.40 254.11,271.13 256.39,272.86 258.68,274.59 260.97,276.33 263.26,278.06 265.55,279.79 267.84,281.52 270.13,283.26 272.42,284.99 274.71,286.72 277.00,288.46 279.29,290.19 281.58,291.92 283.87,293.65 286.16,295.39 288.45,297.12 290.74,298.85 293.03,300.58 295.32,302.32 297.61,304.05 299.90,305.78 302.18,307.51 304.47,309.25 306.76,310.98 309.05,312.71 ' style='stroke-width: 0.75; stroke: #2297E6;' />
+<polygon points='90.98,300.18 93.37,300.24 95.77,300.29 98.16,300.36 100.55,300.42 102.95,300.49 105.34,300.57 107.73,300.65 110.13,300.73 112.52,300.82 114.91,300.92 117.31,301.02 119.70,301.13 122.09,301.25 124.49,301.37 126.88,301.51 129.28,301.65 131.67,301.80 134.06,301.95 136.46,302.12 138.85,302.30 141.24,302.49 143.64,302.69 146.03,302.91 148.42,303.13 150.82,303.37 153.21,303.63 155.60,303.90 158.00,304.19 160.39,304.49 162.79,304.82 165.18,305.16 167.57,305.53 169.97,305.92 172.36,306.33 174.75,306.77 177.15,307.24 179.54,307.73 181.93,308.26 184.33,308.82 186.72,309.41 189.11,310.04 191.51,310.70 193.90,311.41 196.30,312.15 198.69,312.94 201.08,313.78 203.48,314.66 205.87,315.59 208.26,316.57 210.66,317.59 213.05,318.67 215.44,319.80 217.84,320.99 220.23,322.22 222.62,323.51 225.02,324.84 227.41,326.23 229.81,327.67 232.20,329.16 234.59,330.69 236.99,332.27 239.38,333.90 241.77,335.57 244.17,337.28 246.56,339.03 248.95,340.81 251.35,342.64 253.74,344.49 256.13,346.38 258.53,348.30 260.92,350.25 263.32,352.22 265.71,354.22 268.10,356.24 270.50,358.29 272.89,360.36 275.28,362.45 277.68,364.55 280.07,366.68 282.46,368.82 284.86,370.97 287.25,373.15 289.64,375.33 292.04,377.53 294.43,379.74 296.83,381.96 299.22,384.20 301.61,386.44 304.01,388.69 306.40,390.96 308.79,393.23 311.19,395.51 313.58,397.79 315.97,400.09 318.37,402.39 320.76,404.70 323.15,407.01 325.55,409.33 327.94,411.66 327.94,279.13 325.55,279.04 323.15,278.95 320.76,278.86 318.37,278.76 315.97,278.65 313.58,278.53 311.19,278.41 308.79,278.28 306.40,278.14 304.01,277.99 301.61,277.83 299.22,277.66 296.83,277.49 294.43,277.30 292.04,277.10 289.64,276.89 287.25,276.66 284.86,276.42 282.46,276.17 280.07,275.90 277.68,275.61 275.28,275.31 272.89,274.99 270.50,274.64 268.10,274.28 265.71,273.89 263.32,273.48 260.92,273.05 258.53,272.58 256.13,272.09 253.74,271.57 251.35,271.01 248.95,270.43 246.56,269.80 244.17,269.14 241.77,268.44 239.38,267.70 236.99,266.91 234.59,266.08 232.20,265.21 229.81,264.28 227.41,263.31 225.02,262.29 222.62,261.22 220.23,260.09 217.84,258.92 215.44,257.69 213.05,256.41 210.66,255.08 208.26,253.69 205.87,252.26 203.48,250.78 201.08,249.25 198.69,247.67 196.30,246.05 193.90,244.39 191.51,242.68 189.11,240.94 186.72,239.16 184.33,237.34 181.93,235.49 179.54,233.60 177.15,231.69 174.75,229.74 172.36,227.77 169.97,225.77 167.57,223.75 165.18,221.71 162.79,219.64 160.39,217.56 158.00,215.45 155.60,213.33 153.21,211.19 150.82,209.04 148.42,206.87 146.03,204.68 143.64,202.49 141.24,200.28 138.85,198.05 136.46,195.82 134.06,193.58 131.67,191.33 129.28,189.07 126.88,186.80 124.49,184.52 122.09,182.23 119.70,179.94 117.31,177.64 114.91,175.33 112.52,173.02 110.13,170.70 107.73,168.37 105.34,166.04 102.95,163.71 100.55,161.37 98.16,159.02 95.77,156.67 93.37,154.32 90.98,151.96 ' style='stroke-width: 0.75; stroke: none; fill: #28E2E5; fill-opacity: 0.20;' />
+<polyline points='90.98,226.07 93.37,227.28 95.77,228.48 98.16,229.69 100.55,230.89 102.95,232.10 105.34,233.30 107.73,234.51 110.13,235.71 112.52,236.92 114.91,238.13 117.31,239.33 119.70,240.54 122.09,241.74 124.49,242.95 126.88,244.15 129.28,245.36 131.67,246.56 134.06,247.77 136.46,248.97 138.85,250.18 141.24,251.38 143.64,252.59 146.03,253.79 148.42,255.00 150.82,256.20 153.21,257.41 155.60,258.61 158.00,259.82 160.39,261.03 162.79,262.23 165.18,263.44 167.57,264.64 169.97,265.85 172.36,267.05 174.75,268.26 177.15,269.46 179.54,270.67 181.93,271.87 184.33,273.08 186.72,274.28 189.11,275.49 191.51,276.69 193.90,277.90 196.30,279.10 198.69,280.31 201.08,281.51 203.48,282.72 205.87,283.92 208.26,285.13 210.66,286.34 213.05,287.54 215.44,288.75 217.84,289.95 220.23,291.16 222.62,292.36 225.02,293.57 227.41,294.77 229.81,295.98 232.20,297.18 234.59,298.39 236.99,299.59 239.38,300.80 241.77,302.00 244.17,303.21 246.56,304.41 248.95,305.62 251.35,306.82 253.74,308.03 256.13,309.24 258.53,310.44 260.92,311.65 263.32,312.85 265.71,314.06 268.10,315.26 270.50,316.47 272.89,317.67 275.28,318.88 277.68,320.08 280.07,321.29 282.46,322.49 284.86,323.70 287.25,324.90 289.64,326.11 292.04,327.31 294.43,328.52 296.83,329.72 299.22,330.93 301.61,332.13 304.01,333.34 306.40,334.55 308.79,335.75 311.19,336.96 313.58,338.16 315.97,339.37 318.37,340.57 320.76,341.78 323.15,342.98 325.55,344.19 327.94,345.39 ' style='stroke-width: 0.75; stroke: #28E2E5;' />
+</g>
+</svg>
diff --git a/inst/tinytest/_tinysnapshot/model_lm_facet.svg b/inst/tinytest/_tinysnapshot/model_lm_facet.svg
new file mode 100644
index 00000000..6076b4e6
--- /dev/null
+++ b/inst/tinytest/_tinysnapshot/model_lm_facet.svg
@@ -0,0 +1,204 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' class='svglite' width='504.00pt' height='504.00pt' viewBox='0 0 504.00 504.00'>
+<defs>
+  <style type='text/css'><![CDATA[
+    .svglite line, .svglite polyline, .svglite polygon, .svglite path, .svglite rect, .svglite circle {
+      fill: none;
+      stroke: #000000;
+      stroke-linecap: round;
+      stroke-linejoin: round;
+      stroke-miterlimit: 10.00;
+    }
+    .svglite text {
+      white-space: pre;
+    }
+  ]]></style>
+</defs>
+<rect width='100%' height='100%' style='stroke: none; fill: #FFFFFF;'/>
+<defs>
+  <clipPath id='cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='504.00' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<text x='266.40' y='485.28' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='27.34px' lengthAdjust='spacingAndGlyphs'>Wind</text>
+<text transform='translate(12.96,244.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='67.70px' lengthAdjust='spacingAndGlyphs'>I(Temp &gt; 80)</text>
+</g>
+<defs>
+  <clipPath id='cpNTkuMDR8MTgwLjk2fDU5LjA0fDIyNS4zNg=='>
+    <rect x='59.04' y='59.04' width='121.92' height='166.32' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpNTkuMDR8MTgwLjk2fDU5LjA0fDIyNS4zNg==)'>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='83.16' y1='225.36' x2='172.29' y2='225.36' style='stroke-width: 0.75;' />
+<line x1='83.16' y1='225.36' x2='83.16' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='112.87' y1='225.36' x2='112.87' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='142.58' y1='225.36' x2='142.58' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='172.29' y1='225.36' x2='172.29' y2='230.11' style='stroke-width: 0.75;' />
+<text x='83.16' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='112.87' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='142.58' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='172.29' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>20</text>
+<line x1='59.04' y1='187.41' x2='59.04' y2='62.27' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='187.41' x2='54.29' y2='187.41' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='145.70' x2='54.29' y2='145.70' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='103.99' x2='54.29' y2='103.99' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='62.27' x2='54.29' y2='62.27' style='stroke-width: 0.75;' />
+<text transform='translate(47.64,187.41) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.0</text>
+<text transform='translate(47.64,145.70) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.5</text>
+<text transform='translate(47.64,103.99) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>1.0</text>
+<text transform='translate(47.64,62.27) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>1.5</text>
+<rect x='59.04' y='43.20' width='121.92' height='15.84' style='stroke-width: 0.75; stroke: none;' />
+<text x='120.00' y='55.24' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>5</text>
+<polygon points='59.04,225.36 180.96,225.36 180.96,59.04 59.04,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpMjA1LjQ0fDMyNy4zNnw1OS4wNHwyMjUuMzY='>
+    <rect x='205.44' y='59.04' width='121.92' height='166.32' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMjA1LjQ0fDMyNy4zNnw1OS4wNHwyMjUuMzY=)'>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='229.56' y1='225.36' x2='318.69' y2='225.36' style='stroke-width: 0.75;' />
+<line x1='229.56' y1='225.36' x2='229.56' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='259.27' y1='225.36' x2='259.27' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='288.98' y1='225.36' x2='288.98' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='318.69' y1='225.36' x2='318.69' y2='230.11' style='stroke-width: 0.75;' />
+<text x='229.56' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='259.27' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='288.98' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='318.69' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>20</text>
+<line x1='205.44' y1='187.41' x2='205.44' y2='62.27' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='187.41' x2='200.69' y2='187.41' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='145.70' x2='200.69' y2='145.70' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='103.99' x2='200.69' y2='103.99' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='62.27' x2='200.69' y2='62.27' style='stroke-width: 0.75;' />
+<text transform='translate(194.04,187.41) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.0</text>
+<text transform='translate(194.04,145.70) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.5</text>
+<text transform='translate(194.04,103.99) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>1.0</text>
+<text transform='translate(194.04,62.27) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>1.5</text>
+<rect x='205.44' y='43.20' width='121.92' height='15.84' style='stroke-width: 0.75; stroke: none;' />
+<text x='266.40' y='55.24' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>6</text>
+<polygon points='205.44,225.36 327.36,225.36 327.36,59.04 205.44,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpMzUxLjg0fDQ3My43Nnw1OS4wNHwyMjUuMzY='>
+    <rect x='351.84' y='59.04' width='121.92' height='166.32' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMzUxLjg0fDQ3My43Nnw1OS4wNHwyMjUuMzY=)'>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='375.96' y1='225.36' x2='465.09' y2='225.36' style='stroke-width: 0.75;' />
+<line x1='375.96' y1='225.36' x2='375.96' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='405.67' y1='225.36' x2='405.67' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='435.38' y1='225.36' x2='435.38' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='465.09' y1='225.36' x2='465.09' y2='230.11' style='stroke-width: 0.75;' />
+<text x='375.96' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='405.67' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='435.38' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='465.09' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>20</text>
+<line x1='351.84' y1='187.41' x2='351.84' y2='62.27' style='stroke-width: 0.75;' />
+<line x1='351.84' y1='187.41' x2='347.09' y2='187.41' style='stroke-width: 0.75;' />
+<line x1='351.84' y1='145.70' x2='347.09' y2='145.70' style='stroke-width: 0.75;' />
+<line x1='351.84' y1='103.99' x2='347.09' y2='103.99' style='stroke-width: 0.75;' />
+<line x1='351.84' y1='62.27' x2='347.09' y2='62.27' style='stroke-width: 0.75;' />
+<text transform='translate(340.44,187.41) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.0</text>
+<text transform='translate(340.44,145.70) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.5</text>
+<text transform='translate(340.44,103.99) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>1.0</text>
+<text transform='translate(340.44,62.27) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>1.5</text>
+<rect x='351.84' y='43.20' width='121.92' height='15.84' style='stroke-width: 0.75; stroke: none;' />
+<text x='412.80' y='55.24' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>7</text>
+<polygon points='351.84,225.36 473.76,225.36 473.76,59.04 351.84,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpNTkuMDR8MTgwLjk2fDI2NC4yNHw0MzAuNTY='>
+    <rect x='59.04' y='264.24' width='121.92' height='166.32' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpNTkuMDR8MTgwLjk2fDI2NC4yNHw0MzAuNTY=)'>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='83.16' y1='430.56' x2='172.29' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='83.16' y1='430.56' x2='83.16' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='112.87' y1='430.56' x2='112.87' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='142.58' y1='430.56' x2='142.58' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='172.29' y1='430.56' x2='172.29' y2='435.31' style='stroke-width: 0.75;' />
+<text x='83.16' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='112.87' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='142.58' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='172.29' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>20</text>
+<line x1='59.04' y1='392.61' x2='59.04' y2='267.47' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='392.61' x2='54.29' y2='392.61' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='350.90' x2='54.29' y2='350.90' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='309.19' x2='54.29' y2='309.19' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='267.47' x2='54.29' y2='267.47' style='stroke-width: 0.75;' />
+<text transform='translate(47.64,392.61) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.0</text>
+<text transform='translate(47.64,350.90) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.5</text>
+<text transform='translate(47.64,309.19) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>1.0</text>
+<text transform='translate(47.64,267.47) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>1.5</text>
+<rect x='59.04' y='248.40' width='121.92' height='15.84' style='stroke-width: 0.75; stroke: none;' />
+<text x='120.00' y='260.44' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>8</text>
+<polygon points='59.04,430.56 180.96,430.56 180.96,264.24 59.04,264.24 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpMjA1LjQ0fDMyNy4zNnwyNjQuMjR8NDMwLjU2'>
+    <rect x='205.44' y='264.24' width='121.92' height='166.32' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMjA1LjQ0fDMyNy4zNnwyNjQuMjR8NDMwLjU2)'>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='229.56' y1='430.56' x2='318.69' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='229.56' y1='430.56' x2='229.56' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='259.27' y1='430.56' x2='259.27' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='288.98' y1='430.56' x2='288.98' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='318.69' y1='430.56' x2='318.69' y2='435.31' style='stroke-width: 0.75;' />
+<text x='229.56' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='259.27' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='288.98' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='318.69' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>20</text>
+<line x1='205.44' y1='392.61' x2='205.44' y2='267.47' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='392.61' x2='200.69' y2='392.61' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='350.90' x2='200.69' y2='350.90' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='309.19' x2='200.69' y2='309.19' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='267.47' x2='200.69' y2='267.47' style='stroke-width: 0.75;' />
+<text transform='translate(194.04,392.61) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.0</text>
+<text transform='translate(194.04,350.90) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.5</text>
+<text transform='translate(194.04,309.19) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>1.0</text>
+<text transform='translate(194.04,267.47) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>1.5</text>
+<rect x='205.44' y='248.40' width='121.92' height='15.84' style='stroke-width: 0.75; stroke: none;' />
+<text x='266.40' y='260.44' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>9</text>
+<polygon points='205.44,430.56 327.36,430.56 327.36,264.24 205.44,264.24 ' style='stroke-width: 0.75;' />
+</g>
+<g clip-path='url(#cpNTkuMDR8MTgwLjk2fDU5LjA0fDIyNS4zNg==)'>
+<polygon points='87.32,199.95 88.19,199.64 89.05,199.34 89.91,199.04 90.78,198.74 91.64,198.44 92.51,198.14 93.37,197.84 94.24,197.55 95.10,197.26 95.96,196.97 96.83,196.68 97.69,196.40 98.56,196.11 99.42,195.83 100.28,195.56 101.15,195.28 102.01,195.01 102.88,194.74 103.74,194.48 104.61,194.22 105.47,193.97 106.33,193.71 107.20,193.47 108.06,193.23 108.93,192.99 109.79,192.76 110.66,192.54 111.52,192.32 112.38,192.11 113.25,191.90 114.11,191.71 114.98,191.52 115.84,191.33 116.71,191.16 117.57,191.00 118.43,190.84 119.30,190.69 120.16,190.56 121.03,190.43 121.89,190.31 122.75,190.20 123.62,190.10 124.48,190.02 125.35,189.94 126.21,189.87 127.08,189.80 127.94,189.75 128.80,189.71 129.67,189.67 130.53,189.65 131.40,189.63 132.26,189.62 133.13,189.61 133.99,189.62 134.85,189.63 135.72,189.64 136.58,189.66 137.45,189.69 138.31,189.72 139.17,189.76 140.04,189.80 140.90,189.84 141.77,189.89 142.63,189.94 143.50,190.00 144.36,190.06 145.22,190.12 146.09,190.19 146.95,190.26 147.82,190.33 148.68,190.40 149.55,190.48 150.41,190.56 151.27,190.64 152.14,190.72 153.00,190.81 153.87,190.89 154.73,190.98 155.60,191.07 156.46,191.16 157.32,191.25 158.19,191.34 159.05,191.44 159.92,191.53 160.78,191.63 161.64,191.73 162.51,191.82 163.37,191.92 164.24,192.02 165.10,192.12 165.97,192.23 166.83,192.33 167.69,192.43 168.56,192.54 169.42,192.64 170.29,192.75 171.15,192.85 172.02,192.96 172.88,193.07 172.88,163.98 172.02,164.30 171.15,164.62 170.29,164.94 169.42,165.26 168.56,165.57 167.69,165.89 166.83,166.21 165.97,166.52 165.10,166.84 164.24,167.15 163.37,167.46 162.51,167.77 161.64,168.09 160.78,168.40 159.92,168.70 159.05,169.01 158.19,169.32 157.32,169.62 156.46,169.93 155.60,170.23 154.73,170.53 153.87,170.83 153.00,171.13 152.14,171.43 151.27,171.72 150.41,172.02 149.55,172.31 148.68,172.60 147.82,172.88 146.95,173.17 146.09,173.45 145.22,173.73 144.36,174.00 143.50,174.27 142.63,174.54 141.77,174.81 140.90,175.07 140.04,175.33 139.17,175.58 138.31,175.83 137.45,176.08 136.58,176.31 135.72,176.55 134.85,176.78 133.99,177.00 133.13,177.21 132.26,177.42 131.40,177.62 130.53,177.82 129.67,178.00 128.80,178.18 127.94,178.35 127.08,178.51 126.21,178.66 125.35,178.80 124.48,178.94 123.62,179.06 122.75,179.17 121.89,179.28 121.03,179.37 120.16,179.46 119.30,179.53 118.43,179.60 117.57,179.66 116.71,179.70 115.84,179.74 114.98,179.78 114.11,179.80 113.25,179.81 112.38,179.82 111.52,179.82 110.66,179.82 109.79,179.81 108.93,179.79 108.06,179.76 107.20,179.74 106.33,179.70 105.47,179.66 104.61,179.62 103.74,179.57 102.88,179.52 102.01,179.47 101.15,179.41 100.28,179.35 99.42,179.28 98.56,179.22 97.69,179.15 96.83,179.08 95.96,179.00 95.10,178.92 94.24,178.84 93.37,178.76 92.51,178.68 91.64,178.60 90.78,178.51 89.91,178.42 89.05,178.33 88.19,178.24 87.32,178.15 ' style='stroke-width: 0.75; stroke: none; fill: #000000; fill-opacity: 0.20;' />
+<polyline points='87.32,189.05 88.19,188.94 89.05,188.83 89.91,188.73 90.78,188.62 91.64,188.52 92.51,188.41 93.37,188.30 94.24,188.20 95.10,188.09 95.96,187.98 96.83,187.88 97.69,187.77 98.56,187.67 99.42,187.56 100.28,187.45 101.15,187.35 102.01,187.24 102.88,187.13 103.74,187.03 104.61,186.92 105.47,186.81 106.33,186.71 107.20,186.60 108.06,186.50 108.93,186.39 109.79,186.28 110.66,186.18 111.52,186.07 112.38,185.96 113.25,185.86 114.11,185.75 114.98,185.65 115.84,185.54 116.71,185.43 117.57,185.33 118.43,185.22 119.30,185.11 120.16,185.01 121.03,184.90 121.89,184.80 122.75,184.69 123.62,184.58 124.48,184.48 125.35,184.37 126.21,184.26 127.08,184.16 127.94,184.05 128.80,183.94 129.67,183.84 130.53,183.73 131.40,183.63 132.26,183.52 133.13,183.41 133.99,183.31 134.85,183.20 135.72,183.09 136.58,182.99 137.45,182.88 138.31,182.78 139.17,182.67 140.04,182.56 140.90,182.46 141.77,182.35 142.63,182.24 143.50,182.14 144.36,182.03 145.22,181.93 146.09,181.82 146.95,181.71 147.82,181.61 148.68,181.50 149.55,181.39 150.41,181.29 151.27,181.18 152.14,181.07 153.00,180.97 153.87,180.86 154.73,180.76 155.60,180.65 156.46,180.54 157.32,180.44 158.19,180.33 159.05,180.22 159.92,180.12 160.78,180.01 161.64,179.91 162.51,179.80 163.37,179.69 164.24,179.59 165.10,179.48 165.97,179.37 166.83,179.27 167.69,179.16 168.56,179.05 169.42,178.95 170.29,178.84 171.15,178.74 172.02,178.63 172.88,178.52 ' style='stroke-width: 0.75;' />
+</g>
+<g clip-path='url(#cpMjA1LjQ0fDMyNy4zNnw1OS4wNHwyMjUuMzY=)'>
+<polygon points='209.96,185.70 211.10,185.25 212.24,184.81 213.38,184.36 214.52,183.92 215.66,183.49 216.80,183.05 217.94,182.62 219.08,182.20 220.22,181.77 221.36,181.35 222.50,180.94 223.64,180.53 224.78,180.13 225.92,179.73 227.06,179.34 228.20,178.96 229.34,178.58 230.48,178.21 231.62,177.85 232.76,177.49 233.90,177.15 235.04,176.82 236.18,176.50 237.32,176.18 238.46,175.89 239.60,175.60 240.74,175.34 241.88,175.08 243.02,174.85 244.16,174.63 245.30,174.44 246.44,174.27 247.59,174.12 248.73,173.99 249.87,173.90 251.01,173.83 252.15,173.79 253.29,173.79 254.43,173.82 255.57,173.89 256.71,173.99 257.85,174.13 258.99,174.31 260.13,174.53 261.27,174.79 262.41,175.10 263.55,175.44 264.69,175.82 265.83,176.24 266.97,176.70 268.11,177.19 269.25,177.72 270.39,178.28 271.53,178.87 272.67,179.50 273.81,180.15 274.95,180.82 276.09,181.52 277.23,182.24 278.37,182.99 279.51,183.75 280.65,184.53 281.79,185.33 282.93,186.14 284.07,186.97 285.21,187.81 286.36,188.66 287.50,189.53 288.64,190.40 289.78,191.29 290.92,192.18 292.06,193.08 293.20,193.99 294.34,194.91 295.48,195.83 296.62,196.76 297.76,197.69 298.90,198.63 300.04,199.58 301.18,200.53 302.32,201.49 303.46,202.44 304.60,203.41 305.74,204.37 306.88,205.35 308.02,206.32 309.16,207.30 310.30,208.27 311.44,209.26 312.58,210.24 313.72,211.23 314.86,212.22 316.00,213.21 317.14,214.20 318.28,215.20 319.42,216.20 320.56,217.20 321.70,218.20 322.84,219.20 322.84,129.02 321.70,129.49 320.56,129.95 319.42,130.42 318.28,130.88 317.14,131.34 316.00,131.80 314.86,132.26 313.72,132.72 312.58,133.17 311.44,133.62 310.30,134.07 309.16,134.52 308.02,134.96 306.88,135.40 305.74,135.84 304.60,136.27 303.46,136.70 302.32,137.12 301.18,137.55 300.04,137.96 298.90,138.37 297.76,138.78 296.62,139.18 295.48,139.58 294.34,139.97 293.20,140.35 292.06,140.73 290.92,141.09 289.78,141.45 288.64,141.80 287.50,142.15 286.36,142.48 285.21,142.79 284.07,143.10 282.93,143.39 281.79,143.67 280.65,143.94 279.51,144.19 278.37,144.41 277.23,144.62 276.09,144.81 274.95,144.98 273.81,145.12 272.67,145.24 271.53,145.33 270.39,145.39 269.25,145.41 268.11,145.41 266.97,145.37 265.83,145.29 264.69,145.18 263.55,145.03 262.41,144.84 261.27,144.60 260.13,144.33 258.99,144.02 257.85,143.67 256.71,143.27 255.57,142.84 254.43,142.37 253.29,141.87 252.15,141.33 251.01,140.76 249.87,140.16 248.73,139.53 247.59,138.87 246.44,138.19 245.30,137.49 244.16,136.76 243.02,136.01 241.88,135.24 240.74,134.45 239.60,133.65 238.46,132.84 237.32,132.00 236.18,131.16 235.04,130.31 233.90,129.44 232.76,128.56 231.62,127.67 230.48,126.78 229.34,125.88 228.20,124.96 227.06,124.05 225.92,123.12 224.78,122.19 223.64,121.25 222.50,120.31 221.36,119.36 220.22,118.41 219.08,117.46 217.94,116.50 216.80,115.53 215.66,114.56 214.52,113.59 213.38,112.62 212.24,111.64 211.10,110.66 209.96,109.68 ' style='stroke-width: 0.75; stroke: none; fill: #000000; fill-opacity: 0.20;' />
+<polyline points='209.96,147.69 211.10,147.96 212.24,148.22 213.38,148.49 214.52,148.76 215.66,149.02 216.80,149.29 217.94,149.56 219.08,149.83 220.22,150.09 221.36,150.36 222.50,150.63 223.64,150.89 224.78,151.16 225.92,151.43 227.06,151.69 228.20,151.96 229.34,152.23 230.48,152.49 231.62,152.76 232.76,153.03 233.90,153.29 235.04,153.56 236.18,153.83 237.32,154.09 238.46,154.36 239.60,154.63 240.74,154.90 241.88,155.16 243.02,155.43 244.16,155.70 245.30,155.96 246.44,156.23 247.59,156.50 248.73,156.76 249.87,157.03 251.01,157.30 252.15,157.56 253.29,157.83 254.43,158.10 255.57,158.36 256.71,158.63 257.85,158.90 258.99,159.16 260.13,159.43 261.27,159.70 262.41,159.97 263.55,160.23 264.69,160.50 265.83,160.77 266.97,161.03 268.11,161.30 269.25,161.57 270.39,161.83 271.53,162.10 272.67,162.37 273.81,162.63 274.95,162.90 276.09,163.17 277.23,163.43 278.37,163.70 279.51,163.97 280.65,164.23 281.79,164.50 282.93,164.77 284.07,165.04 285.21,165.30 286.36,165.57 287.50,165.84 288.64,166.10 289.78,166.37 290.92,166.64 292.06,166.90 293.20,167.17 294.34,167.44 295.48,167.70 296.62,167.97 297.76,168.24 298.90,168.50 300.04,168.77 301.18,169.04 302.32,169.30 303.46,169.57 304.60,169.84 305.74,170.11 306.88,170.37 308.02,170.64 309.16,170.91 310.30,171.17 311.44,171.44 312.58,171.71 313.72,171.97 314.86,172.24 316.00,172.51 317.14,172.77 318.28,173.04 319.42,173.31 320.56,173.57 321.70,173.84 322.84,174.11 ' style='stroke-width: 0.75;' />
+</g>
+<g clip-path='url(#cpMzUxLjg0fDQ3My43Nnw1OS4wNHwyMjUuMzY=)'>
+<polygon points='370.62,116.31 371.26,116.32 371.91,116.33 372.56,116.35 373.21,116.36 373.86,116.38 374.50,116.40 375.15,116.42 375.80,116.45 376.45,116.48 377.10,116.51 377.75,116.54 378.39,116.57 379.04,116.61 379.69,116.66 380.34,116.70 380.99,116.75 381.63,116.81 382.28,116.86 382.93,116.93 383.58,116.99 384.23,117.07 384.87,117.14 385.52,117.23 386.17,117.32 386.82,117.41 387.47,117.51 388.12,117.62 388.76,117.73 389.41,117.86 390.06,117.99 390.71,118.13 391.36,118.27 392.00,118.43 392.65,118.60 393.30,118.77 393.95,118.96 394.60,119.15 395.25,119.36 395.89,119.58 396.54,119.80 397.19,120.04 397.84,120.30 398.49,120.56 399.13,120.83 399.78,121.12 400.43,121.42 401.08,121.73 401.73,122.05 402.38,122.39 403.02,122.73 403.67,123.09 404.32,123.45 404.97,123.83 405.62,124.22 406.26,124.62 406.91,125.03 407.56,125.44 408.21,125.87 408.86,126.30 409.51,126.74 410.15,127.19 410.80,127.65 411.45,128.12 412.10,128.59 412.75,129.07 413.39,129.55 414.04,130.04 414.69,130.53 415.34,131.03 415.99,131.54 416.63,132.05 417.28,132.56 417.93,133.08 418.58,133.60 419.23,134.13 419.88,134.66 420.52,135.19 421.17,135.72 421.82,136.26 422.47,136.80 423.12,137.35 423.76,137.90 424.41,138.44 425.06,139.00 425.71,139.55 426.36,140.11 427.01,140.66 427.65,141.22 428.30,141.78 428.95,142.35 429.60,142.91 430.25,143.48 430.89,144.04 431.54,144.61 432.19,145.18 432.84,145.76 433.49,146.33 434.14,146.90 434.78,147.48 434.78,107.82 434.14,107.83 433.49,107.83 432.84,107.83 432.19,107.83 431.54,107.83 430.89,107.83 430.25,107.83 429.60,107.82 428.95,107.82 428.30,107.81 427.65,107.80 427.01,107.79 426.36,107.77 425.71,107.76 425.06,107.74 424.41,107.72 423.76,107.70 423.12,107.68 422.47,107.65 421.82,107.62 421.17,107.59 420.52,107.55 419.88,107.51 419.23,107.47 418.58,107.43 417.93,107.38 417.28,107.32 416.63,107.27 415.99,107.20 415.34,107.14 414.69,107.07 414.04,106.99 413.39,106.91 412.75,106.82 412.10,106.73 411.45,106.63 410.80,106.52 410.15,106.41 409.51,106.29 408.86,106.16 408.21,106.02 407.56,105.88 406.91,105.72 406.26,105.56 405.62,105.39 404.97,105.20 404.32,105.01 403.67,104.81 403.02,104.59 402.38,104.37 401.73,104.13 401.08,103.88 400.43,103.62 399.78,103.35 399.13,103.06 398.49,102.77 397.84,102.46 397.19,102.14 396.54,101.81 395.89,101.47 395.25,101.11 394.60,100.75 393.95,100.37 393.30,99.99 392.65,99.59 392.00,99.19 391.36,98.77 390.71,98.35 390.06,97.92 389.41,97.48 388.76,97.03 388.12,96.57 387.47,96.11 386.82,95.64 386.17,95.16 385.52,94.68 384.87,94.19 384.23,93.70 383.58,93.20 382.93,92.70 382.28,92.19 381.63,91.67 380.99,91.16 380.34,90.64 379.69,90.11 379.04,89.58 378.39,89.05 377.75,88.52 377.10,87.98 376.45,87.44 375.80,86.89 375.15,86.35 374.50,85.80 373.86,85.25 373.21,84.70 372.56,84.14 371.91,83.58 371.26,83.02 370.62,82.46 ' style='stroke-width: 0.75; stroke: none; fill: #000000; fill-opacity: 0.20;' />
+<polyline points='370.62,99.39 371.26,99.67 371.91,99.96 372.56,100.24 373.21,100.53 373.86,100.81 374.50,101.10 375.15,101.39 375.80,101.67 376.45,101.96 377.10,102.24 377.75,102.53 378.39,102.81 379.04,103.10 379.69,103.38 380.34,103.67 380.99,103.95 381.63,104.24 382.28,104.53 382.93,104.81 383.58,105.10 384.23,105.38 384.87,105.67 385.52,105.95 386.17,106.24 386.82,106.52 387.47,106.81 388.12,107.10 388.76,107.38 389.41,107.67 390.06,107.95 390.71,108.24 391.36,108.52 392.00,108.81 392.65,109.09 393.30,109.38 393.95,109.66 394.60,109.95 395.25,110.24 395.89,110.52 396.54,110.81 397.19,111.09 397.84,111.38 398.49,111.66 399.13,111.95 399.78,112.23 400.43,112.52 401.08,112.81 401.73,113.09 402.38,113.38 403.02,113.66 403.67,113.95 404.32,114.23 404.97,114.52 405.62,114.80 406.26,115.09 406.91,115.37 407.56,115.66 408.21,115.95 408.86,116.23 409.51,116.52 410.15,116.80 410.80,117.09 411.45,117.37 412.10,117.66 412.75,117.94 413.39,118.23 414.04,118.52 414.69,118.80 415.34,119.09 415.99,119.37 416.63,119.66 417.28,119.94 417.93,120.23 418.58,120.51 419.23,120.80 419.88,121.08 420.52,121.37 421.17,121.66 421.82,121.94 422.47,122.23 423.12,122.51 423.76,122.80 424.41,123.08 425.06,123.37 425.71,123.65 426.36,123.94 427.01,124.22 427.65,124.51 428.30,124.80 428.95,125.08 429.60,125.37 430.25,125.65 430.89,125.94 431.54,126.22 432.19,126.51 432.84,126.79 433.49,127.08 434.14,127.37 434.78,127.65 ' style='stroke-width: 0.75;' />
+</g>
+<g clip-path='url(#cpNTkuMDR8MTgwLjk2fDI2NC4yNHw0MzAuNTY=)'>
+<polygon points='67.12,331.62 67.91,331.89 68.70,332.16 69.50,332.44 70.29,332.71 71.08,332.99 71.87,333.27 72.67,333.56 73.46,333.84 74.25,334.13 75.04,334.42 75.83,334.72 76.63,335.02 77.42,335.33 78.21,335.63 79.00,335.95 79.80,336.26 80.59,336.58 81.38,336.91 82.17,337.24 82.96,337.58 83.76,337.92 84.55,338.28 85.34,338.63 86.13,339.00 86.93,339.37 87.72,339.75 88.51,340.14 89.30,340.54 90.09,340.95 90.89,341.37 91.68,341.81 92.47,342.25 93.26,342.71 94.06,343.18 94.85,343.67 95.64,344.17 96.43,344.69 97.22,345.22 98.02,345.78 98.81,346.35 99.60,346.94 100.39,347.55 101.19,348.19 101.98,348.84 102.77,349.52 103.56,350.22 104.35,350.94 105.15,351.69 105.94,352.46 106.73,353.26 107.52,354.07 108.32,354.92 109.11,355.78 109.90,356.67 110.69,357.58 111.48,358.51 112.28,359.46 113.07,360.43 113.86,361.42 114.65,362.43 115.44,363.46 116.24,364.50 117.03,365.56 117.82,366.63 118.61,367.72 119.41,368.82 120.20,369.93 120.99,371.06 121.78,372.20 122.57,373.34 123.37,374.50 124.16,375.67 124.95,376.84 125.74,378.03 126.54,379.22 127.33,380.41 128.12,381.62 128.91,382.83 129.70,384.05 130.50,385.27 131.29,386.50 132.08,387.73 132.87,388.97 133.67,390.21 134.46,391.45 135.25,392.70 136.04,393.96 136.83,395.22 137.63,396.48 138.42,397.74 139.21,399.01 140.00,400.27 140.80,401.55 141.59,402.82 142.38,404.10 143.17,405.38 143.96,406.66 144.76,407.94 145.55,409.23 145.55,346.38 144.76,346.11 143.96,345.85 143.17,345.57 142.38,345.30 141.59,345.03 140.80,344.75 140.00,344.47 139.21,344.19 138.42,343.90 137.63,343.62 136.83,343.33 136.04,343.03 135.25,342.73 134.46,342.43 133.67,342.13 132.87,341.82 132.08,341.50 131.29,341.18 130.50,340.86 129.70,340.53 128.91,340.20 128.12,339.86 127.33,339.51 126.54,339.16 125.74,338.80 124.95,338.43 124.16,338.05 123.37,337.67 122.57,337.27 121.78,336.87 120.99,336.45 120.20,336.03 119.41,335.59 118.61,335.14 117.82,334.68 117.03,334.20 116.24,333.71 115.44,333.20 114.65,332.67 113.86,332.13 113.07,331.57 112.28,330.99 111.48,330.39 110.69,329.77 109.90,329.13 109.11,328.46 108.32,327.78 107.52,327.07 106.73,326.33 105.94,325.58 105.15,324.80 104.35,323.99 103.56,323.16 102.77,322.31 101.98,321.44 101.19,320.54 100.39,319.63 99.60,318.69 98.81,317.73 98.02,316.75 97.22,315.75 96.43,314.73 95.64,313.70 94.85,312.65 94.06,311.59 93.26,310.51 92.47,309.41 91.68,308.31 90.89,307.19 90.09,306.06 89.30,304.92 88.51,303.77 87.72,302.60 86.93,301.43 86.13,300.26 85.34,299.07 84.55,297.88 83.76,296.68 82.96,295.47 82.17,294.26 81.38,293.04 80.59,291.81 79.80,290.58 79.00,289.35 78.21,288.11 77.42,286.86 76.63,285.62 75.83,284.37 75.04,283.11 74.25,281.85 73.46,280.59 72.67,279.33 71.87,278.06 71.08,276.79 70.29,275.51 69.50,274.24 68.70,272.96 67.91,271.68 67.12,270.40 ' style='stroke-width: 0.75; stroke: none; fill: #000000; fill-opacity: 0.20;' />
+<polyline points='67.12,301.01 67.91,301.79 68.70,302.56 69.50,303.34 70.29,304.11 71.08,304.89 71.87,305.66 72.67,306.44 73.46,307.22 74.25,307.99 75.04,308.77 75.83,309.54 76.63,310.32 77.42,311.09 78.21,311.87 79.00,312.65 79.80,313.42 80.59,314.20 81.38,314.97 82.17,315.75 82.96,316.52 83.76,317.30 84.55,318.08 85.34,318.85 86.13,319.63 86.93,320.40 87.72,321.18 88.51,321.95 89.30,322.73 90.09,323.51 90.89,324.28 91.68,325.06 92.47,325.83 93.26,326.61 94.06,327.38 94.85,328.16 95.64,328.94 96.43,329.71 97.22,330.49 98.02,331.26 98.81,332.04 99.60,332.81 100.39,333.59 101.19,334.36 101.98,335.14 102.77,335.92 103.56,336.69 104.35,337.47 105.15,338.24 105.94,339.02 106.73,339.79 107.52,340.57 108.32,341.35 109.11,342.12 109.90,342.90 110.69,343.67 111.48,344.45 112.28,345.22 113.07,346.00 113.86,346.78 114.65,347.55 115.44,348.33 116.24,349.10 117.03,349.88 117.82,350.65 118.61,351.43 119.41,352.21 120.20,352.98 120.99,353.76 121.78,354.53 122.57,355.31 123.37,356.08 124.16,356.86 124.95,357.64 125.74,358.41 126.54,359.19 127.33,359.96 128.12,360.74 128.91,361.51 129.70,362.29 130.50,363.06 131.29,363.84 132.08,364.62 132.87,365.39 133.67,366.17 134.46,366.94 135.25,367.72 136.04,368.49 136.83,369.27 137.63,370.05 138.42,370.82 139.21,371.60 140.00,372.37 140.80,373.15 141.59,373.92 142.38,374.70 143.17,375.48 143.96,376.25 144.76,377.03 145.55,377.80 ' style='stroke-width: 0.75;' />
+</g>
+<g clip-path='url(#cpMjA1LjQ0fDMyNy4zNnwyNjQuMjR8NDMwLjU2)'>
+<polygon points='216.49,372.19 217.32,372.22 218.15,372.24 218.98,372.27 219.80,372.30 220.63,372.33 221.46,372.36 222.29,372.40 223.12,372.44 223.95,372.48 224.77,372.52 225.60,372.57 226.43,372.62 227.26,372.67 228.09,372.73 228.91,372.79 229.74,372.85 230.57,372.92 231.40,372.99 232.23,373.06 233.06,373.14 233.88,373.23 234.71,373.32 235.54,373.41 236.37,373.51 237.20,373.62 238.02,373.74 238.85,373.86 239.68,373.99 240.51,374.12 241.34,374.27 242.17,374.42 242.99,374.59 243.82,374.76 244.65,374.95 245.48,375.14 246.31,375.35 247.14,375.57 247.96,375.81 248.79,376.06 249.62,376.32 250.45,376.60 251.28,376.90 252.10,377.22 252.93,377.55 253.76,377.91 254.59,378.28 255.42,378.67 256.25,379.09 257.07,379.53 257.90,379.99 258.73,380.47 259.56,380.98 260.39,381.51 261.21,382.06 262.04,382.63 262.87,383.23 263.70,383.85 264.53,384.50 265.36,385.16 266.18,385.85 267.01,386.56 267.84,387.29 268.67,388.03 269.50,388.80 270.33,389.58 271.15,390.38 271.98,391.20 272.81,392.03 273.64,392.87 274.47,393.73 275.29,394.61 276.12,395.49 276.95,396.38 277.78,397.29 278.61,398.21 279.44,399.13 280.26,400.07 281.09,401.01 281.92,401.96 282.75,402.92 283.58,403.89 284.40,404.86 285.23,405.84 286.06,406.82 286.89,407.81 287.72,408.80 288.55,409.80 289.37,410.81 290.20,411.82 291.03,412.83 291.86,413.85 292.69,414.87 293.51,415.89 294.34,416.92 295.17,417.95 296.00,418.98 296.83,420.02 297.66,421.06 298.48,422.10 298.48,362.77 297.66,362.73 296.83,362.69 296.00,362.65 295.17,362.60 294.34,362.55 293.51,362.50 292.69,362.44 291.86,362.39 291.03,362.32 290.20,362.26 289.37,362.19 288.55,362.11 287.72,362.03 286.89,361.95 286.06,361.86 285.23,361.76 284.40,361.66 283.58,361.56 282.75,361.44 281.92,361.32 281.09,361.19 280.26,361.06 279.44,360.91 278.61,360.76 277.78,360.60 276.95,360.42 276.12,360.24 275.29,360.04 274.47,359.84 273.64,359.62 272.81,359.38 271.98,359.14 271.15,358.87 270.33,358.59 269.50,358.30 268.67,357.98 267.84,357.65 267.01,357.30 266.18,356.93 265.36,356.54 264.53,356.12 263.70,355.69 262.87,355.23 262.04,354.75 261.21,354.25 260.39,353.72 259.56,353.17 258.73,352.60 257.90,352.00 257.07,351.38 256.25,350.74 255.42,350.08 254.59,349.39 253.76,348.69 252.93,347.96 252.10,347.22 251.28,346.45 250.45,345.67 249.62,344.87 248.79,344.06 247.96,343.23 247.14,342.39 246.31,341.53 245.48,340.66 244.65,339.78 243.82,338.88 242.99,337.98 242.17,337.06 241.34,336.14 240.51,335.20 239.68,334.26 238.85,333.31 238.02,332.35 237.20,331.39 236.37,330.42 235.54,329.44 234.71,328.46 233.88,327.47 233.06,326.47 232.23,325.47 231.40,324.47 230.57,323.46 229.74,322.45 228.91,321.43 228.09,320.41 227.26,319.39 226.43,318.36 225.60,317.33 224.77,316.30 223.95,315.27 223.12,314.23 222.29,313.19 221.46,312.14 220.63,311.10 219.80,310.05 218.98,309.00 218.15,307.95 217.32,306.89 216.49,305.84 ' style='stroke-width: 0.75; stroke: none; fill: #000000; fill-opacity: 0.20;' />
+<polyline points='216.49,339.02 217.32,339.56 218.15,340.10 218.98,340.64 219.80,341.17 220.63,341.71 221.46,342.25 222.29,342.79 223.12,343.33 223.95,343.87 224.77,344.41 225.60,344.95 226.43,345.49 227.26,346.03 228.09,346.57 228.91,347.11 229.74,347.65 230.57,348.19 231.40,348.73 232.23,349.27 233.06,349.81 233.88,350.35 234.71,350.89 235.54,351.43 236.37,351.97 237.20,352.51 238.02,353.04 238.85,353.58 239.68,354.12 240.51,354.66 241.34,355.20 242.17,355.74 242.99,356.28 243.82,356.82 244.65,357.36 245.48,357.90 246.31,358.44 247.14,358.98 247.96,359.52 248.79,360.06 249.62,360.60 250.45,361.14 251.28,361.68 252.10,362.22 252.93,362.76 253.76,363.30 254.59,363.84 255.42,364.38 256.25,364.92 257.07,365.45 257.90,365.99 258.73,366.53 259.56,367.07 260.39,367.61 261.21,368.15 262.04,368.69 262.87,369.23 263.70,369.77 264.53,370.31 265.36,370.85 266.18,371.39 267.01,371.93 267.84,372.47 268.67,373.01 269.50,373.55 270.33,374.09 271.15,374.63 271.98,375.17 272.81,375.71 273.64,376.25 274.47,376.79 275.29,377.33 276.12,377.86 276.95,378.40 277.78,378.94 278.61,379.48 279.44,380.02 280.26,380.56 281.09,381.10 281.92,381.64 282.75,382.18 283.58,382.72 284.40,383.26 285.23,383.80 286.06,384.34 286.89,384.88 287.72,385.42 288.55,385.96 289.37,386.50 290.20,387.04 291.03,387.58 291.86,388.12 292.69,388.66 293.51,389.20 294.34,389.73 295.17,390.27 296.00,390.81 296.83,391.35 297.66,391.89 298.48,392.43 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpMTI5Ljk1fDQ0Ni40OXwxMDguMTN8MzM3Ljgz'>
+    <rect x='129.95' y='108.13' width='316.54' height='229.70' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMTI5Ljk1fDQ0Ni40OXwxMDguMTN8MzM3Ljgz)'>
+</g>
+</svg>
diff --git a/inst/tinytest/_tinysnapshot/model_loess_by.svg b/inst/tinytest/_tinysnapshot/model_loess_by.svg
new file mode 100644
index 00000000..162134b6
--- /dev/null
+++ b/inst/tinytest/_tinysnapshot/model_loess_by.svg
@@ -0,0 +1,82 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' class='svglite' width='504.00pt' height='504.00pt' viewBox='0 0 504.00 504.00'>
+<defs>
+  <style type='text/css'><![CDATA[
+    .svglite line, .svglite polyline, .svglite polygon, .svglite path, .svglite rect, .svglite circle {
+      fill: none;
+      stroke: #000000;
+      stroke-linecap: round;
+      stroke-linejoin: round;
+      stroke-miterlimit: 10.00;
+    }
+    .svglite text {
+      white-space: pre;
+    }
+  ]]></style>
+</defs>
+<rect width='100%' height='100%' style='stroke: none; fill: #FFFFFF;'/>
+<defs>
+  <clipPath id='cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='504.00' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='447.34' y1='223.20' x2='468.94' y2='223.20' style='stroke-width: 0.75;' />
+<line x1='447.34' y1='237.60' x2='468.94' y2='237.60' style='stroke-width: 0.75; stroke: #DF536B;' />
+<line x1='447.34' y1='252.00' x2='468.94' y2='252.00' style='stroke-width: 0.75; stroke: #61D04F;' />
+<line x1='447.34' y1='266.40' x2='468.94' y2='266.40' style='stroke-width: 0.75; stroke: #2297E6;' />
+<line x1='447.34' y1='280.80' x2='468.94' y2='280.80' style='stroke-width: 0.75; stroke: #28E2E5;' />
+<text x='464.18' y='208.80' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='71.37px' lengthAdjust='spacingAndGlyphs'>factor(Month)</text>
+<text x='479.74' y='227.33' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='479.74' y='241.73' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>6</text>
+<text x='479.74' y='256.13' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>7</text>
+<text x='479.74' y='270.53' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>8</text>
+<text x='479.74' y='284.93' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>9</text>
+</g>
+<defs>
+  <clipPath id='cpMC4wMHw0MTEuMzl8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='411.39' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw0MTEuMzl8MC4wMHw1MDQuMDA=)'>
+<text x='235.22' y='485.28' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='27.34px' lengthAdjust='spacingAndGlyphs'>Wind</text>
+<text transform='translate(12.96,244.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='67.70px' lengthAdjust='spacingAndGlyphs'>I(Temp &gt; 80)</text>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='128.76' y1='430.56' x2='386.32' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='128.76' y1='430.56' x2='128.76' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='214.61' y1='430.56' x2='214.61' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='300.47' y1='430.56' x2='300.47' y2='437.76' style='stroke-width: 0.75;' />
+<line x1='386.32' y1='430.56' x2='386.32' y2='437.76' style='stroke-width: 0.75;' />
+<text x='128.76' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='214.61' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='300.47' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='386.32' y='456.48' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='13.35px' lengthAdjust='spacingAndGlyphs'>20</text>
+<line x1='59.04' y1='398.35' x2='59.04' y2='102.07' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='398.35' x2='51.84' y2='398.35' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='339.09' x2='51.84' y2='339.09' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='279.84' x2='51.84' y2='279.84' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='220.58' x2='51.84' y2='220.58' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='161.33' x2='51.84' y2='161.33' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='102.07' x2='51.84' y2='102.07' style='stroke-width: 0.75;' />
+<text transform='translate(41.76,398.35) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.0</text>
+<text transform='translate(41.76,339.09) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.2</text>
+<text transform='translate(41.76,279.84) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.4</text>
+<text transform='translate(41.76,220.58) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.6</text>
+<text transform='translate(41.76,161.33) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>0.8</text>
+<text transform='translate(41.76,102.07) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='16.68px' lengthAdjust='spacingAndGlyphs'>1.0</text>
+<polygon points='59.04,430.56 411.39,430.56 411.39,59.04 59.04,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpNTkuMDR8NDExLjM5fDU5LjA0fDQzMC41Ng=='>
+    <rect x='59.04' y='59.04' width='352.35' height='371.52' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpNTkuMDR8NDExLjM5fDU5LjA0fDQzMC41Ng==)'>
+<polyline points='140.78,398.35 161.38,398.35 169.97,398.35 169.97,398.35 180.27,398.35 180.27,398.35 190.57,398.35 190.57,398.35 200.87,398.35 209.46,398.35 209.46,398.35 209.46,398.35 209.46,398.35 230.07,398.41 240.37,398.41 240.37,398.41 240.37,398.41 248.95,400.12 248.95,400.12 248.95,400.12 259.26,398.03 269.56,384.29 279.86,368.34 288.45,360.94 298.75,353.89 298.75,353.89 298.75,353.89 327.94,360.00 327.94,360.00 358.85,381.30 388.04,416.80 ' style='stroke-width: 0.75;' />
+<polyline points='72.09,413.16 121.89,366.44 151.08,304.01 151.08,304.01 161.38,273.37 180.27,225.06 180.27,225.06 180.27,225.06 180.27,225.06 190.57,235.09 190.57,235.09 200.87,240.61 200.87,240.61 200.87,240.61 209.46,257.01 209.46,257.01 219.76,276.92 219.76,276.92 230.07,294.49 240.37,309.55 240.37,309.55 240.37,309.55 240.37,309.55 279.86,332.16 279.86,332.16 288.45,344.78 298.75,360.00 298.75,360.00 319.36,381.04 398.34,405.32 ' style='stroke-width: 0.75; stroke: #DF536B;' />
+<polyline points='113.30,83.64 121.89,101.08 130.47,114.96 130.47,114.96 140.78,126.65 151.08,133.11 151.08,133.11 161.38,134.73 161.38,134.73 169.97,133.45 169.97,133.45 169.97,133.45 169.97,133.45 180.27,119.53 190.57,103.90 190.57,103.90 190.57,103.90 200.87,97.46 200.87,97.46 200.87,97.46 209.46,94.65 219.76,92.14 230.07,96.76 230.07,96.76 240.37,118.02 240.37,118.02 248.95,137.62 288.45,216.97 288.45,216.97 298.75,235.32 298.75,235.32 ' style='stroke-width: 0.75; stroke: #61D04F;' />
+<polyline points='82.39,91.73 101.28,105.93 111.58,113.77 121.89,121.71 140.78,134.36 151.08,142.49 151.08,142.49 151.08,142.49 161.38,147.96 161.38,147.96 169.97,153.64 169.97,153.64 169.97,153.64 180.27,154.97 180.27,154.97 190.57,165.44 209.46,277.65 209.46,277.65 209.46,277.65 219.76,276.38 219.76,276.38 219.76,276.38 230.07,271.30 240.37,269.65 240.37,269.65 240.37,269.65 240.37,269.65 259.26,276.63 279.86,299.88 288.45,316.31 309.05,376.67 ' style='stroke-width: 0.75; stroke: #2297E6;' />
+<polyline points='90.98,72.80 121.89,158.23 130.47,180.18 151.08,231.30 161.38,259.04 161.38,259.04 161.38,259.04 169.97,276.49 180.27,293.53 180.27,293.53 200.87,326.70 209.46,341.95 219.76,367.69 219.76,367.69 219.76,367.69 219.76,367.69 219.76,367.69 230.07,381.68 230.07,381.68 230.07,381.68 240.37,390.77 240.37,390.77 259.26,381.64 269.56,367.85 279.86,350.42 288.45,333.54 298.75,316.02 309.05,302.71 309.05,302.71 327.94,280.96 ' style='stroke-width: 0.75; stroke: #28E2E5;' />
+</g>
+</svg>
diff --git a/inst/tinytest/_tinysnapshot/model_loess_facet.svg b/inst/tinytest/_tinysnapshot/model_loess_facet.svg
new file mode 100644
index 00000000..03b876f8
--- /dev/null
+++ b/inst/tinytest/_tinysnapshot/model_loess_facet.svg
@@ -0,0 +1,219 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' class='svglite' width='504.00pt' height='504.00pt' viewBox='0 0 504.00 504.00'>
+<defs>
+  <style type='text/css'><![CDATA[
+    .svglite line, .svglite polyline, .svglite polygon, .svglite path, .svglite rect, .svglite circle {
+      fill: none;
+      stroke: #000000;
+      stroke-linecap: round;
+      stroke-linejoin: round;
+      stroke-miterlimit: 10.00;
+    }
+    .svglite text {
+      white-space: pre;
+    }
+  ]]></style>
+</defs>
+<rect width='100%' height='100%' style='stroke: none; fill: #FFFFFF;'/>
+<defs>
+  <clipPath id='cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA='>
+    <rect x='0.00' y='0.00' width='504.00' height='504.00' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<text x='266.40' y='485.28' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='27.34px' lengthAdjust='spacingAndGlyphs'>Wind</text>
+<text transform='translate(12.96,244.80) rotate(-90)' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='67.70px' lengthAdjust='spacingAndGlyphs'>I(Temp &gt; 80)</text>
+</g>
+<defs>
+  <clipPath id='cpNTkuMDR8MTgwLjk2fDU5LjA0fDIyNS4zNg=='>
+    <rect x='59.04' y='59.04' width='121.92' height='166.32' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpNTkuMDR8MTgwLjk2fDU5LjA0fDIyNS4zNg==)'>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='83.16' y1='225.36' x2='172.29' y2='225.36' style='stroke-width: 0.75;' />
+<line x1='83.16' y1='225.36' x2='83.16' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='112.87' y1='225.36' x2='112.87' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='142.58' y1='225.36' x2='142.58' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='172.29' y1='225.36' x2='172.29' y2='230.11' style='stroke-width: 0.75;' />
+<text x='83.16' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='112.87' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='142.58' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='172.29' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>20</text>
+<line x1='59.04' y1='210.94' x2='59.04' y2='78.30' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='210.94' x2='54.29' y2='210.94' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='184.41' x2='54.29' y2='184.41' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='157.89' x2='54.29' y2='157.89' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='131.36' x2='54.29' y2='131.36' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='104.83' x2='54.29' y2='104.83' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='78.30' x2='54.29' y2='78.30' style='stroke-width: 0.75;' />
+<text transform='translate(47.64,210.94) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.0</text>
+<text transform='translate(47.64,184.41) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.2</text>
+<text transform='translate(47.64,157.89) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.4</text>
+<text transform='translate(47.64,131.36) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.6</text>
+<text transform='translate(47.64,104.83) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.8</text>
+<text transform='translate(47.64,78.30) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>1.0</text>
+<rect x='59.04' y='43.20' width='121.92' height='15.84' style='stroke-width: 0.75; stroke: none;' />
+<text x='120.00' y='55.24' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>5</text>
+<polygon points='59.04,225.36 180.96,225.36 180.96,59.04 59.04,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpMjA1LjQ0fDMyNy4zNnw1OS4wNHwyMjUuMzY='>
+    <rect x='205.44' y='59.04' width='121.92' height='166.32' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMjA1LjQ0fDMyNy4zNnw1OS4wNHwyMjUuMzY=)'>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='229.56' y1='225.36' x2='318.69' y2='225.36' style='stroke-width: 0.75;' />
+<line x1='229.56' y1='225.36' x2='229.56' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='259.27' y1='225.36' x2='259.27' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='288.98' y1='225.36' x2='288.98' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='318.69' y1='225.36' x2='318.69' y2='230.11' style='stroke-width: 0.75;' />
+<text x='229.56' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='259.27' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='288.98' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='318.69' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>20</text>
+<line x1='205.44' y1='210.94' x2='205.44' y2='78.30' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='210.94' x2='200.69' y2='210.94' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='184.41' x2='200.69' y2='184.41' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='157.89' x2='200.69' y2='157.89' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='131.36' x2='200.69' y2='131.36' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='104.83' x2='200.69' y2='104.83' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='78.30' x2='200.69' y2='78.30' style='stroke-width: 0.75;' />
+<text transform='translate(194.04,210.94) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.0</text>
+<text transform='translate(194.04,184.41) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.2</text>
+<text transform='translate(194.04,157.89) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.4</text>
+<text transform='translate(194.04,131.36) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.6</text>
+<text transform='translate(194.04,104.83) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.8</text>
+<text transform='translate(194.04,78.30) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>1.0</text>
+<rect x='205.44' y='43.20' width='121.92' height='15.84' style='stroke-width: 0.75; stroke: none;' />
+<text x='266.40' y='55.24' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>6</text>
+<polygon points='205.44,225.36 327.36,225.36 327.36,59.04 205.44,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpMzUxLjg0fDQ3My43Nnw1OS4wNHwyMjUuMzY='>
+    <rect x='351.84' y='59.04' width='121.92' height='166.32' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMzUxLjg0fDQ3My43Nnw1OS4wNHwyMjUuMzY=)'>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='375.96' y1='225.36' x2='465.09' y2='225.36' style='stroke-width: 0.75;' />
+<line x1='375.96' y1='225.36' x2='375.96' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='405.67' y1='225.36' x2='405.67' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='435.38' y1='225.36' x2='435.38' y2='230.11' style='stroke-width: 0.75;' />
+<line x1='465.09' y1='225.36' x2='465.09' y2='230.11' style='stroke-width: 0.75;' />
+<text x='375.96' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='405.67' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='435.38' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='465.09' y='242.47' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>20</text>
+<line x1='351.84' y1='210.94' x2='351.84' y2='78.30' style='stroke-width: 0.75;' />
+<line x1='351.84' y1='210.94' x2='347.09' y2='210.94' style='stroke-width: 0.75;' />
+<line x1='351.84' y1='184.41' x2='347.09' y2='184.41' style='stroke-width: 0.75;' />
+<line x1='351.84' y1='157.89' x2='347.09' y2='157.89' style='stroke-width: 0.75;' />
+<line x1='351.84' y1='131.36' x2='347.09' y2='131.36' style='stroke-width: 0.75;' />
+<line x1='351.84' y1='104.83' x2='347.09' y2='104.83' style='stroke-width: 0.75;' />
+<line x1='351.84' y1='78.30' x2='347.09' y2='78.30' style='stroke-width: 0.75;' />
+<text transform='translate(340.44,210.94) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.0</text>
+<text transform='translate(340.44,184.41) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.2</text>
+<text transform='translate(340.44,157.89) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.4</text>
+<text transform='translate(340.44,131.36) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.6</text>
+<text transform='translate(340.44,104.83) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.8</text>
+<text transform='translate(340.44,78.30) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>1.0</text>
+<rect x='351.84' y='43.20' width='121.92' height='15.84' style='stroke-width: 0.75; stroke: none;' />
+<text x='412.80' y='55.24' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>7</text>
+<polygon points='351.84,225.36 473.76,225.36 473.76,59.04 351.84,59.04 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpNTkuMDR8MTgwLjk2fDI2NC4yNHw0MzAuNTY='>
+    <rect x='59.04' y='264.24' width='121.92' height='166.32' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpNTkuMDR8MTgwLjk2fDI2NC4yNHw0MzAuNTY=)'>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='83.16' y1='430.56' x2='172.29' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='83.16' y1='430.56' x2='83.16' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='112.87' y1='430.56' x2='112.87' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='142.58' y1='430.56' x2='142.58' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='172.29' y1='430.56' x2='172.29' y2='435.31' style='stroke-width: 0.75;' />
+<text x='83.16' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='112.87' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='142.58' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='172.29' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>20</text>
+<line x1='59.04' y1='416.14' x2='59.04' y2='283.50' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='416.14' x2='54.29' y2='416.14' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='389.61' x2='54.29' y2='389.61' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='363.09' x2='54.29' y2='363.09' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='336.56' x2='54.29' y2='336.56' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='310.03' x2='54.29' y2='310.03' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='283.50' x2='54.29' y2='283.50' style='stroke-width: 0.75;' />
+<text transform='translate(47.64,416.14) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.0</text>
+<text transform='translate(47.64,389.61) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.2</text>
+<text transform='translate(47.64,363.09) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.4</text>
+<text transform='translate(47.64,336.56) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.6</text>
+<text transform='translate(47.64,310.03) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.8</text>
+<text transform='translate(47.64,283.50) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>1.0</text>
+<rect x='59.04' y='248.40' width='121.92' height='15.84' style='stroke-width: 0.75; stroke: none;' />
+<text x='120.00' y='260.44' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>8</text>
+<polygon points='59.04,430.56 180.96,430.56 180.96,264.24 59.04,264.24 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpMjA1LjQ0fDMyNy4zNnwyNjQuMjR8NDMwLjU2'>
+    <rect x='205.44' y='264.24' width='121.92' height='166.32' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMjA1LjQ0fDMyNy4zNnwyNjQuMjR8NDMwLjU2)'>
+</g>
+<g clip-path='url(#cpMC4wMHw1MDQuMDB8MC4wMHw1MDQuMDA=)'>
+<line x1='229.56' y1='430.56' x2='318.69' y2='430.56' style='stroke-width: 0.75;' />
+<line x1='229.56' y1='430.56' x2='229.56' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='259.27' y1='430.56' x2='259.27' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='288.98' y1='430.56' x2='288.98' y2='435.31' style='stroke-width: 0.75;' />
+<line x1='318.69' y1='430.56' x2='318.69' y2='435.31' style='stroke-width: 0.75;' />
+<text x='229.56' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='4.40px' lengthAdjust='spacingAndGlyphs'>5</text>
+<text x='259.27' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>10</text>
+<text x='288.98' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>15</text>
+<text x='318.69' y='447.67' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='8.80px' lengthAdjust='spacingAndGlyphs'>20</text>
+<line x1='205.44' y1='416.14' x2='205.44' y2='283.50' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='416.14' x2='200.69' y2='416.14' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='389.61' x2='200.69' y2='389.61' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='363.09' x2='200.69' y2='363.09' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='336.56' x2='200.69' y2='336.56' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='310.03' x2='200.69' y2='310.03' style='stroke-width: 0.75;' />
+<line x1='205.44' y1='283.50' x2='200.69' y2='283.50' style='stroke-width: 0.75;' />
+<text transform='translate(194.04,416.14) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.0</text>
+<text transform='translate(194.04,389.61) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.2</text>
+<text transform='translate(194.04,363.09) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.4</text>
+<text transform='translate(194.04,336.56) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.6</text>
+<text transform='translate(194.04,310.03) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>0.8</text>
+<text transform='translate(194.04,283.50) rotate(-90)' text-anchor='middle' style='font-size: 7.92px; font-family: "Liberation Sans";' textLength='10.99px' lengthAdjust='spacingAndGlyphs'>1.0</text>
+<rect x='205.44' y='248.40' width='121.92' height='15.84' style='stroke-width: 0.75; stroke: none;' />
+<text x='266.40' y='260.44' text-anchor='middle' style='font-size: 12.00px; font-family: "Liberation Sans";' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>9</text>
+<polygon points='205.44,430.56 327.36,430.56 327.36,264.24 205.44,264.24 ' style='stroke-width: 0.75;' />
+</g>
+<g clip-path='url(#cpNTkuMDR8MTgwLjk2fDU5LjA0fDIyNS4zNg==)'>
+<polyline points='87.32,210.94 94.45,210.94 97.42,210.94 97.42,210.94 100.99,210.94 100.99,210.94 104.55,210.94 104.55,210.94 108.12,210.94 111.09,210.94 111.09,210.94 111.09,210.94 111.09,210.94 118.22,210.97 121.78,210.97 121.78,210.97 121.78,210.97 124.75,211.73 124.75,211.73 124.75,211.73 128.32,210.80 131.88,204.65 135.45,197.50 138.42,194.19 141.98,191.04 141.98,191.04 141.98,191.04 152.08,193.77 152.08,193.77 162.78,203.31 172.88,219.20 ' style='stroke-width: 0.75;' />
+</g>
+<g clip-path='url(#cpMjA1LjQ0fDMyNy4zNnw1OS4wNHwyMjUuMzY=)'>
+<polyline points='209.96,217.57 227.19,196.65 237.29,168.71 237.29,168.71 240.85,154.99 247.39,133.36 247.39,133.36 247.39,133.36 247.39,133.36 250.95,137.86 250.95,137.86 254.52,140.33 254.52,140.33 254.52,140.33 257.49,147.67 257.49,147.67 261.05,156.58 261.05,156.58 264.62,164.45 268.18,171.19 268.18,171.19 268.18,171.19 268.18,171.19 281.85,181.31 281.85,181.31 284.82,186.96 288.38,193.77 288.38,193.77 295.51,203.19 322.84,214.06 ' style='stroke-width: 0.75;' />
+</g>
+<g clip-path='url(#cpMzUxLjg0fDQ3My43Nnw1OS4wNHwyMjUuMzY=)'>
+<polyline points='370.62,70.05 373.59,77.86 376.56,84.07 376.56,84.07 380.12,89.31 383.69,92.20 383.69,92.20 387.25,92.92 387.25,92.92 390.22,92.35 390.22,92.35 390.22,92.35 390.22,92.35 393.79,86.12 397.35,79.12 397.35,79.12 397.35,79.12 400.92,76.24 400.92,76.24 400.92,76.24 403.89,74.98 407.45,73.86 411.02,75.93 411.02,75.93 414.58,85.44 414.58,85.44 417.55,94.22 431.22,129.74 431.22,129.74 434.78,137.95 434.78,137.95 ' style='stroke-width: 0.75;' />
+</g>
+<g clip-path='url(#cpNTkuMDR8MTgwLjk2fDI2NC4yNHw0MzAuNTY=)'>
+<polyline points='67.12,278.88 73.66,285.23 77.22,288.74 80.79,292.30 87.32,297.96 90.89,301.60 90.89,301.60 90.89,301.60 94.45,304.05 94.45,304.05 97.42,306.59 97.42,306.59 97.42,306.59 100.99,307.19 100.99,307.19 104.55,311.87 111.09,362.11 111.09,362.11 111.09,362.11 114.65,361.54 114.65,361.54 114.65,361.54 118.22,359.26 121.78,358.52 121.78,358.52 121.78,358.52 121.78,358.52 128.32,361.65 135.45,372.06 138.42,379.41 145.55,406.44 ' style='stroke-width: 0.75;' />
+</g>
+<g clip-path='url(#cpMjA1LjQ0fDMyNy4zNnwyNjQuMjR8NDMwLjU2)'>
+<polyline points='216.49,270.40 227.19,308.64 230.16,318.47 237.29,341.35 240.85,353.78 240.85,353.78 240.85,353.78 243.82,361.59 247.39,369.22 247.39,369.22 254.52,384.07 257.49,390.89 261.05,402.42 261.05,402.42 261.05,402.42 261.05,402.42 261.05,402.42 264.62,408.68 264.62,408.68 264.62,408.68 268.18,412.75 268.18,412.75 274.72,408.66 278.28,402.49 281.85,394.68 284.82,387.13 288.38,379.28 291.95,373.33 291.95,373.33 298.48,363.59 ' style='stroke-width: 0.75;' />
+</g>
+<defs>
+  <clipPath id='cpMTI5Ljk1fDQ0Ni40OXwxMDguMTN8MzM3Ljgz'>
+    <rect x='129.95' y='108.13' width='316.54' height='229.70' />
+  </clipPath>
+</defs>
+<g clip-path='url(#cpMTI5Ljk1fDQ0Ni40OXwxMDguMTN8MzM3Ljgz)'>
+</g>
+</svg>
diff --git a/inst/tinytest/test-models.R b/inst/tinytest/test-models.R
new file mode 100644
index 00000000..8eec84fb
--- /dev/null
+++ b/inst/tinytest/test-models.R
@@ -0,0 +1,60 @@
+source("helpers.R")
+using("tinysnapshot")
+
+# confidence intervals
+for (l in c(0.5, 0.8, 0.95)) {
+  f = function() {
+    plt(I(Temp > 80) ~ Wind, data = airquality, 
+      type = type_glm(family = binomial, level = l))
+  }
+  lab = paste0("model_glm_", l * 100)
+  expect_snapshot_plot(f, label = lab)
+}
+
+for (l in c(0.5, 0.8, 0.95)) {
+  f = function() {
+    plt(I(Temp > 80) ~ Wind, data = airquality, 
+      type = type_lm(level = l))
+  }
+  lab = paste0("model_lm_", l * 100)
+  expect_snapshot_plot(f, label = lab)
+}
+
+# by
+f = function() {
+  plt(I(Temp > 80) ~ Wind | factor(Month), data = airquality, 
+    type = type_glm(family = binomial))
+}
+expect_snapshot_plot(f, label = "model_glm_by")
+
+f = function() {
+  plt(I(Temp > 80) ~ Wind | factor(Month), data = airquality, 
+    type = type_lm())
+}
+expect_snapshot_plot(f, label = "model_lm_by")
+
+f = function() {
+  plt(I(Temp > 80) ~ Wind | factor(Month), data = airquality, 
+    type = type_loess())
+}
+expect_snapshot_plot(f, label = "model_loess_by")
+
+
+# facet
+f = function() {
+  plt(I(Temp > 80) ~ Wind, facet = ~Month, data = airquality, 
+    type = type_glm(family = binomial))
+}
+expect_snapshot_plot(f, label = "model_glm_facet")
+
+f = function() {
+  plt(I(Temp > 80) ~ Wind, facet = ~Month, data = airquality, 
+    type = type_lm())
+}
+expect_snapshot_plot(f, label = "model_lm_facet")
+
+f = function() {
+  plt(I(Temp > 80) ~ Wind, facet = ~Month, data = airquality, 
+    type = type_loess())
+}
+expect_snapshot_plot(f, label = "model_loess_facet")

From 85a40c5675567f79c0452c35527ce5e8b0144d68 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Tue, 8 Oct 2024 20:03:09 -0400
Subject: [PATCH 68/72] missing parentheses

---
 NEWS.md | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/NEWS.md b/NEWS.md
index 5acf2e1c..49507140 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,6 +1,7 @@
 # News
 
 _If you are viewing this file on CRAN, please check the
+http://www.polljunkie.com/poll/qnbeij/fini
 [latest NEWS](https://grantmcdermott.com/tinyplot/NEWS.html) on our website
 where the formatting is also better._
 
@@ -19,9 +20,9 @@ New features:
   `plt(~Sepal.Length | Species, data = iris, type = "density", flip = TRUE)`.
   (#216 @grantmcdermott)
 - New plot types added in #222:
-    - `type_glm()` (shortcut: `"glm"`
-    - `type_lm()` (shortcut: `"lm"`
-    - `type_loess()` (shortcut: `"loess"`
+    - `type_glm()` (shortcut: `"glm"`)
+    - `type_lm()` (shortcut: `"lm"`)
+    - `type_loess()` (shortcut: `"loess"`)
 - Custom types can now be defined by users by creating `type_typename()`
   functions. (#222 @vincentarelbundock)
 - Types vignette on the website. (#222 @vincentarelbundock)

From 890d0981a749d7110009249861073afd78760629 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Tue, 8 Oct 2024 20:06:09 -0400
Subject: [PATCH 69/72] document model types

---
 R/tinyplot.R    | 3 +++
 man/tinyplot.Rd | 3 +++
 2 files changed, 6 insertions(+)

diff --git a/R/tinyplot.R b/R/tinyplot.R
index 58c66725..4e0361cd 100644
--- a/R/tinyplot.R
+++ b/R/tinyplot.R
@@ -96,6 +96,9 @@
 #'      - `"ribbon"` or `"area"` for polygon intervals (where area plots 
 #'        are a special case of ribbon plots with `ymin` set to 0 and `ymax` 
 #'        set to `y`; see below).
+#'      - `"lm"` or `type_lm()`: Linear model fit
+#'      - `"glm"` or `type_glm()`: Generalized linear model fit
+#'      - `"loess"` or `type_loess()`: Local regression fit
 #' @param xmin,xmax,ymin,ymax minimum and maximum coordinates of relevant area
 #'   or interval plot types. Only used when the `type` argument is one of
 #'   `"rect"` or `"segments"` (where all four min-max coordinates are required),
diff --git a/man/tinyplot.Rd b/man/tinyplot.Rd
index 4f7d6f76..3427a5da 100644
--- a/man/tinyplot.Rd
+++ b/man/tinyplot.Rd
@@ -215,6 +215,9 @@ type of plot desired.
 \item \code{"ribbon"} or \code{"area"} for polygon intervals (where area plots
 are a special case of ribbon plots with \code{ymin} set to 0 and \code{ymax}
 set to \code{y}; see below).
+\item \code{"lm"} or \code{type_lm()}: Linear model fit
+\item \code{"glm"} or \code{type_glm()}: Generalized linear model fit
+\item \code{"loess"} or \code{type_loess()}: Local regression fit
 }
 }}
 

From cbb430a9cdaae894451fd034ef98d2ecaa221810 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Tue, 8 Oct 2024 20:12:08 -0400
Subject: [PATCH 70/72] vignette

---
 vignettes/intro_tutorial.qmd | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/vignettes/intro_tutorial.qmd b/vignettes/intro_tutorial.qmd
index acd61e0a..56e0073b 100644
--- a/vignettes/intro_tutorial.qmd
+++ b/vignettes/intro_tutorial.qmd
@@ -21,14 +21,13 @@ knitr::opts_chunk$set(
 ```
 
 The goal of this intro tutorial is to give you a sense of the main features and
-syntax of **tinyplot**, a lightweight extension of the base R graphics system. We
-don't try to cover everything, but you should come away with a good
+syntax of **tinyplot**, a lightweight extension of the base R graphics system.
+We don't try to cover everything, but you should come away with a good
 understanding of how the package works and how it can integrate with your own
 projects.
 
 We start this tutorial by loading the package and a slightly modified version
 of the `airquality` dataset that comes bundled with base R:
-and create that now too.
 
 ```{r aq}
 library(tinyplot)
@@ -342,7 +341,7 @@ with(aq,
   tinyplot(
     Temp ~ Wind,
     facet = Month,
-    type = type_lm())
+    type = "lm"
 )
 ```
 
@@ -357,7 +356,7 @@ with(aq,
     x = Wind, y = Temp,
     facet = Month,
     facet.args = list(nrow = 1),
-    type = type_lm())
+    type = "lm")
 )
 ```
 
@@ -378,7 +377,7 @@ with(aq,
     facet.args = list(nrow = 1, list(bg = "grey90")),
     palette = "dark2",
     grid = TRUE, frame = FALSE,
-    type = type_lm())
+    type = "lm")
 )
 ```
 

From 16b707abcbefc927aac6f188740655c1066a0f35 Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Tue, 8 Oct 2024 20:16:28 -0400
Subject: [PATCH 71/72] typo

---
 vignettes/intro_tutorial.qmd | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/vignettes/intro_tutorial.qmd b/vignettes/intro_tutorial.qmd
index 56e0073b..e2432cf5 100644
--- a/vignettes/intro_tutorial.qmd
+++ b/vignettes/intro_tutorial.qmd
@@ -341,7 +341,7 @@ with(aq,
   tinyplot(
     Temp ~ Wind,
     facet = Month,
-    type = "lm"
+    type = "lm")
 )
 ```
 

From ae9cde9b87cfb3c09d2d4efc92e64e3e1a978cea Mon Sep 17 00:00:00 2001
From: Vincent Arel-Bundock <vincent.arel-bundock@umontreal.ca>
Date: Tue, 8 Oct 2024 20:18:39 -0400
Subject: [PATCH 72/72] colon

---
 vignettes/intro_tutorial.qmd | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/vignettes/intro_tutorial.qmd b/vignettes/intro_tutorial.qmd
index e2432cf5..c9c4adb6 100644
--- a/vignettes/intro_tutorial.qmd
+++ b/vignettes/intro_tutorial.qmd
@@ -27,7 +27,7 @@ understanding of how the package works and how it can integrate with your own
 projects.
 
 We start this tutorial by loading the package and a slightly modified version
-of the `airquality` dataset that comes bundled with base R:
+of the `airquality` dataset that comes bundled with base R.
 
 ```{r aq}
 library(tinyplot)
