[Dplr-commits] r1009 - in pkg/dplR: . R man

noreply at r-forge.r-project.org noreply at r-forge.r-project.org
Fri Jan 22 18:41:37 CET 2016


Author: mvkorpel
Date: 2016-01-22 18:41:36 +0100 (Fri, 22 Jan 2016)
New Revision: 1009

Modified:
   pkg/dplR/ChangeLog
   pkg/dplR/DESCRIPTION
   pkg/dplR/NAMESPACE
   pkg/dplR/R/rasterPlot.R
   pkg/dplR/R/wavelet.plot.R
   pkg/dplR/man/rasterPlot.Rd
   pkg/dplR/man/wavelet.plot.Rd
   pkg/dplR/man/xskel.ccf.plot.Rd
   pkg/dplR/man/xskel.plot.Rd
Log:
* Added Cairo graphics support to rasterPlot(): new argument 'Cairo'
* wavelet.plot() can now pass ... arguments to rasterPlot()
* DESCRIPTION: Cairo (>= 1.5-0) is now in Suggests
* NAMESPACE: Importing dev.capture from grDevices
* The corresponding Rd manuals were updated accordingly
* Small tweaks in other manuals


Modified: pkg/dplR/ChangeLog
===================================================================
--- pkg/dplR/ChangeLog	2015-12-18 13:30:18 UTC (rev 1008)
+++ pkg/dplR/ChangeLog	2016-01-22 17:41:36 UTC (rev 1009)
@@ -7,8 +7,13 @@
 
 File: rasterPlot.R
 ------------------
-- rasterPlot() now reverts to normal plotting if png device is unavailable or
-  raster images are not supported. Previously an error would be produced.
+- Added option 'Cairo' to control the preferred bitmap
+  device. FALSE (the default) for png() as before, and TRUE for
+  Cairo() as a new option. If the preferred device is unavailable,
+  the other one will be tried.
+- rasterPlot() now reverts to normal plotting if bitmap device is
+  unavailable or raster images are not supported. Previously an
+  error would be produced.
 - The function now also works if no high level plot exists,
   i.e. if plot.new() has not been called.
 - Added option 'draw' to control whether the raster plot is to be drawn (TRUE,
@@ -25,9 +30,20 @@
 - Made a new function to calculate the mean value of each tree when there are 
   multiple cores.
 
+File: wavelet.plot.R
+--------------------
+- wavelet.plot() now passes ... arguments to rasterPlot().
+
+File: DESCRIPTION
+-----------------
+- New Suggested package: Cairo. Used (if available) in
+  rasterPlot() if the png() device is unavailable or if the user
+  specifies 'Cairo=TRUE'.
+
 File: NAMESPACE
 -------------
 - Added treeMean function.
+- Importing dev.capture() from grDevices.
 
 Various .R files
 ----------------

Modified: pkg/dplR/DESCRIPTION
===================================================================
--- pkg/dplR/DESCRIPTION	2015-12-18 13:30:18 UTC (rev 1008)
+++ pkg/dplR/DESCRIPTION	2016-01-22 17:41:36 UTC (rev 1009)
@@ -3,7 +3,7 @@
 Type: Package
 Title: Dendrochronology Program Library in R
 Version: 1.6.4
-Date: 2015-12-18
+Date: 2016-01-22
 Authors at R: c(person("Andy", "Bunn", role = c("aut", "cph",
         "cre", "trl"), email = "andy.bunn at wwu.edu"), person("Mikko",
         "Korpela", role = c("aut", "trl")), person("Franco", "Biondi",
@@ -22,8 +22,9 @@
         Matrix (>= 1.0-3), digest (>= 0.2.3), gmp (>= 0.5-5),
         matrixStats (>= 0.50.0), png (>= 0.1-1), R.utils (>= 1.32.0),
         stringi (>= 0.2-2), stringr (>= 0.4), XML (>= 2.1-0)
-Suggests: Biobase, dichromat (>= 1.2-3), foreach, forecast, iterators,
-        knitr, RColorBrewer, testthat (>= 0.8), tikzDevice, waveslim
+Suggests: Biobase, Cairo (>= 1.5-0), dichromat (>= 1.2-3), foreach,
+        forecast, iterators, knitr, RColorBrewer, testthat (>= 0.8),
+        tikzDevice, waveslim
 Description: Perform tree-ring analyses such as detrending, chronology
         building, and cross dating.  Read and write standard file formats
         used in dendrochronology.

Modified: pkg/dplR/NAMESPACE
===================================================================
--- pkg/dplR/NAMESPACE	2015-12-18 13:30:18 UTC (rev 1008)
+++ pkg/dplR/NAMESPACE	2016-01-22 17:41:36 UTC (rev 1009)
@@ -10,7 +10,7 @@
 importFrom(gmp, as.bigq, as.bigz, chooseZ, is.bigq)
 
 importFrom(grDevices, dev.hold, dev.flush, rainbow, dev.capabilities,
-           dev.cur, png, dev.off, dev.set, devAskNewPage)
+           dev.cur, png, dev.off, dev.set, devAskNewPage, dev.capture)
 
 importFrom(grid, gpar, grid.lines, grid.newpage, grid.polygon,
            grid.segments, grid.text, pushViewport, seekViewport, unit,

Modified: pkg/dplR/R/rasterPlot.R
===================================================================
--- pkg/dplR/R/rasterPlot.R	2015-12-18 13:30:18 UTC (rev 1008)
+++ pkg/dplR/R/rasterPlot.R	2016-01-22 17:41:36 UTC (rev 1009)
@@ -1,7 +1,8 @@
 rasterPlot <- function(expr, res = 150, region=c("plot", "figure"), antialias,
                        bg = "transparent", interpolate = TRUE, draw = TRUE,
-                       ...) {
+                       Cairo = FALSE, ...) {
     draw2 <- isTRUE(as.logical(draw)[1L])
+    Cairo2 <- isTRUE(as.logical(Cairo)[1L])
     ## Plotting commands 'expr' will be evaluated in the environment
     ## of the caller of rasterPlot()
     pf <- parent.frame()
@@ -11,9 +12,42 @@
         message("device does not support raster images")
         fallback <- TRUE
     }
-    if (sum(capabilities(c("cairo", "png", "aqua")), na.rm=TRUE) == 0) {
-        message("png device unavailable")
-        fallback <- TRUE
+    cairoRaster <- FALSE
+    fallback <- TRUE
+    for (k in 1:2) {
+        if (Cairo2) {
+            if (requireNamespace("Cairo", quietly = TRUE)) {
+                caps <- Cairo::Cairo.capabilities()
+                if (isTRUE(as.vector(caps["raster"]))) {
+                    fallback <- FALSE
+                    cairoRaster <- TRUE
+                } else if (isTRUE(as.vector(caps["png"]))) {
+                    fallback <- FALSE
+                } else {
+                    message("png and raster unsupported in this Cairo library")
+                }
+                if (!fallback) {
+                    if (k == 2) {
+                        message("using Cairo device")
+                    }
+                    break
+                }
+            } else {
+                message("Cairo device unavailable")
+            }
+            Cairo2 <- FALSE
+        } else {
+            if (sum(capabilities(c("cairo", "png", "aqua")), na.rm=TRUE) > 0) {
+                fallback <- FALSE
+                if (k == 2) {
+                    message("using png device")
+                }
+                break
+            } else {
+                message("png device unavailable")
+            }
+            Cairo2 <- TRUE
+        }
     }
     if (fallback && !draw2) {
         return(NULL)
@@ -94,7 +128,18 @@
     ## in the original device.  Resolution (points per inch) is the
     ## argument 'res'.
     fname <- tempfile(fileext = ".png")
-    if (missing(antialias)) {
+    if (Cairo2) {
+        if (cairoRaster) {
+            cairoType <- "raster"
+            cairoFile <- ""
+        } else {
+            cairoType <- "png"
+            cairoFile <- fname
+        }
+        Cairo::Cairo(width = pngWidthHeight[1], height = pngWidthHeight[2],
+                     units = "in", dpi = res, bg = bg,
+                     type = cairoType, file = cairoFile, ...)
+    } else if (missing(antialias)) {
         png(fname, width = pngWidthHeight[1], height = pngWidthHeight[2],
             units = "in", res = res, bg = bg, ...)
     } else {
@@ -104,7 +149,9 @@
     ## Record things to do on exit (will be removed from list one-by-one)
     on.exit(dev.off())
     on.exit(dev.set(curDev), add=TRUE)
-    on.exit(unlink(fname), add=TRUE)
+    if (!cairoRaster) {
+        on.exit(unlink(fname), add=TRUE)
+    }
     devAskNewPage(FALSE)
     par(mfcol=c(1,1))
     par(omi=rep(0, 4))
@@ -115,24 +162,33 @@
     plot.new()
     par(op)
     eval(expr, pf)
-    on.exit(dev.set(curDev))
-    on.exit(unlink(fname), add=TRUE)
-    ## Close the png device
-    dev.off()
-    on.exit(unlink(fname))
+    if (cairoRaster) {
+        ## Capture raster data from device before closing
+        rasterData <- dev.capture(native = TRUE)
+        on.exit(dev.set(curDev))
+        dev.off()
+        on.exit()
+    } else {
+        on.exit(dev.set(curDev))
+        on.exit(unlink(fname), add=TRUE)
+        dev.off()
+        on.exit(unlink(fname))
+    }
     ## Return to the original plot (device)
     dev.set(curDev)
-    ## Read the png image to memory
-    pngData <- readPNG(fname, native=TRUE)
-    on.exit()
-    ## Remove the temporary .png file
-    unlink(fname)
+    if (!cairoRaster) {
+        ## Read the png image to memory
+        rasterData <- readPNG(fname, native=TRUE)
+        on.exit()
+        ## Remove the temporary .png file
+        unlink(fname)
+    }
     if (!draw2) {
-        return(pngData)
+        return(rasterData)
     }
     if (plotRegion || marzero) {
         ## Add a raster image to the plot region of the original plot
-        rasterImage(pngData, xleft = usrLeft, ybottom = usrBottom,
+        rasterImage(rasterData, xleft = usrLeft, ybottom = usrBottom,
                     xright = usrRight, ytop = usrTop,
                     interpolate = interpolate)
     } else {
@@ -141,7 +197,7 @@
         on.exit(par(xpd = op[["xpd"]]))
         ## Add a raster image to the figure region of the original plot
         fc <- figCoord()
-        rasterImage(pngData, xleft = fc[1], ybottom = fc[2],
+        rasterImage(rasterData, xleft = fc[1], ybottom = fc[2],
                     xright = fc[3], ytop = fc[4],
                     interpolate = interpolate)
     }

Modified: pkg/dplR/R/wavelet.plot.R
===================================================================
--- pkg/dplR/R/wavelet.plot.R	2015-12-18 13:30:18 UTC (rev 1008)
+++ pkg/dplR/R/wavelet.plot.R	2016-01-22 17:41:36 UTC (rev 1009)
@@ -9,7 +9,7 @@
              crn.col = "black", crn.lwd = 1,coi.col='black',
              crn.ylim = range(wave.list$y) * c(0.95, 1.05),
              side.by.side = FALSE,
-             useRaster = FALSE, res = 150, reverse.y = FALSE)
+             useRaster = FALSE, res = 150, reverse.y = FALSE, ...)
 {
 
     ## Wavelet transform variables:
@@ -135,8 +135,34 @@
                                 as.double(wavelet.levels),
                                 key.cols))
     if (useRaster2) {
-        tryCatch(rasterPlot(cl, res = res,
-                            antialias = "none", interpolate = FALSE),
+        args <- list(...)
+        argNames <- names(args)
+        if (is.null(argNames)) {
+            args <- NULL
+        } else {
+            args <- args[!is.na(argNames) & nzchar(argNames)]
+        }
+        if (length(args) == 0L) {
+            Call <- as.call(c(as.name("rasterPlot"),
+                              alist(expr = cl, res = res, antialias = "none",
+                                    interpolate = FALSE)))
+        } else {
+            Call <- as.call(c(as.name("rasterPlot"), args))
+            Call <- as.list(match.call(rasterPlot, Call))
+            anam <- names(Call[-1L])
+            Call[["expr"]] <- quote(cl)
+            Call[["res"]] <- quote(res)
+            Call[["region"]] <- "plot"
+            Call[["draw"]] <- TRUE
+            if (!("antialias" %in% anam)) {
+                Call[["antialias"]] <- "none"
+            }
+            if (!("interpolate" %in% anam)) {
+                Call[["interpolate"]] <- FALSE
+            }
+            Call <- as.call(Call)
+        }
+        tryCatch(eval(Call),
                  error = function(e) {
                      message(as.character(e), appendLF = FALSE)
                      message("reverting to useRaster=FALSE")

Modified: pkg/dplR/man/rasterPlot.Rd
===================================================================
--- pkg/dplR/man/rasterPlot.Rd	2015-12-18 13:30:18 UTC (rev 1008)
+++ pkg/dplR/man/rasterPlot.Rd	2016-01-22 17:41:36 UTC (rev 1009)
@@ -6,13 +6,14 @@
 }
 \description{
   This function takes plotting commands and uses a temporary
-  \code{\link{png}} bitmap graphics device to capture their output.  The
+  bitmap graphics device to capture their output.  The
   resulting raster image is drawn in the plot or figure region of the
   active high-level plot.  A new plot is started if one does not exist.
 }
 \usage{
 rasterPlot(expr, res = 150, region = c("plot", "figure"), antialias,
-           bg = "transparent", interpolate = TRUE, draw = TRUE, \dots)
+           bg = "transparent", interpolate = TRUE, draw = TRUE,
+           Cairo = FALSE, \dots)
 }
 \arguments{
   \item{expr}{
@@ -38,11 +39,12 @@
     Antialiasing argument passed to \code{\link{png}}.  The default
     (missing argument) is probably good for line plots but
     \code{"none"} is preferred for images in which color signifies value
-    of data.
+    of data.  Unused if a \code{\link[Cairo]{Cairo}} device is used instead of
+    \code{png}.
   }
   \item{bg}{
     Background color of the raster plot, an argument passed to
-    \code{\link{png}}.  If the default \code{"transparent"} does not
+    the bitmap device.  If the default \code{"transparent"} does not
     work, try \code{"white"} or another color.  Note that a
     non-transparent background will mask any previous content in the
     figure or plot region, depending on the value of \code{\var{region}}.
@@ -57,13 +59,19 @@
     A \code{logical} flag.  Draw the results (\code{TRUE}, the default)
     or return an image object (\code{FALSE})?
   }
+  \item{Cairo}{
+    A \code{logical} flag.  \code{TRUE} for preferring a
+    \code{\link[Cairo]{Cairo}} to \code{\link{png}} as the bitmap device,
+    \code{FALSE} (the default) for the opposite.  If the preferred
+    device cannot be used, the other one will be tried.
+  }
   \item{\dots}{
-    Other arguments to \code{\link{png}}.
+    Other arguments to \code{\link{png}} or \code{\link[Cairo]{Cairo}}.
   }
 }
 \details{
   The appropriate graphical parameters of the current graphics device
-  are copied to the temporary \code{\link{png}} device.  Therefore the
+  are copied to the temporary bitmap device.  Therefore the
   appearance of the raster contents should be almost the same as when
   directly drawn.
 
@@ -85,21 +93,29 @@
   If \code{\var{draw}} is \code{FALSE}, an object of class
   \code{"nativeRaster"} is returned.  The object can be used as input
   for \code{\link{rasterImage}} or \code{\link{grid.raster}}.  See
-  \code{\link{readPNG}}.  If no \code{\link{png}} device is available
+  \code{\link{readPNG}}.  If no bitmap device is available
   (see \sQuote{Note}), \code{NULL} is returned.
 }
 \author{
   Mikko Korpela
 }
 \note{
-  The graphics device used for the output must have support for
-  including raster images.  See \code{"rasterImage"} in
-  \code{\link{dev.capabilities}}.
 
-  The \R build must have a functional \code{\link{png}} device, which
-  requires one of the following \code{\link{capabilities}}:
-  \code{"png"}, \code{"aqua"} or \code{"cairo"}.
+  \itemize{
 
+    \item{The graphics device used for the output must have support for
+      including raster images.  See \code{"rasterImage"} in
+      \code{\link{dev.capabilities}}.}
+
+    \item{The \R build must have a functional \code{\link{png}} device,
+      which requires one of the following \code{\link{capabilities}}:
+      \code{"png"}, \code{"aqua"} or \code{"cairo"}.  Alternatively, a
+      \code{\link[Cairo]{Cairo}} device from package Cairo must be
+      available with \code{\link[Cairo]{Cairo.capabilities}}
+      \code{"raster"} or \code{"png"}.}
+
+  }
+
   If either of these requirements is not met, at least one
   \code{\link{message}} is generated and the function reverts to regular
   plotting.  The \code{\var{bg}} argument is then handled by drawing a

Modified: pkg/dplR/man/wavelet.plot.Rd
===================================================================
--- pkg/dplR/man/wavelet.plot.Rd	2015-12-18 13:30:18 UTC (rev 1008)
+++ pkg/dplR/man/wavelet.plot.Rd	2016-01-22 17:41:36 UTC (rev 1009)
@@ -18,7 +18,7 @@
              crn.col = "black", crn.lwd = 1,coi.col='black',
              crn.ylim = range(wave.list$y) * c(0.95, 1.05),
              side.by.side = FALSE,
-             useRaster = FALSE, res = 150, reverse.y = FALSE)
+             useRaster = FALSE, res = 150, reverse.y = FALSE, \dots)
 }
 \arguments{
   \item{wave.list}{A \code{list}.  Output from \code{\link{morlet}}.}
@@ -61,6 +61,10 @@
   \item{reverse.y}{A \code{logical} flag.  If \code{TRUE}, the Y-axis
     will be reversed, i.e. period increasing towards the bottom.  The
     default is \code{FALSE}. }
+  \item{\dots}{Arguments passed to \code{\link{rasterPlot}}.  Only
+    relevant when the filled contours are drawn as a raster image.  See
+    \code{\var{useRaster}}.
+  }
 }
 \details{
   This produces a plot of a continuous wavelet transform and plots the

Modified: pkg/dplR/man/xskel.ccf.plot.Rd
===================================================================
--- pkg/dplR/man/xskel.ccf.plot.Rd	2015-12-18 13:30:18 UTC (rev 1008)
+++ pkg/dplR/man/xskel.ccf.plot.Rd	2016-01-22 17:41:36 UTC (rev 1009)
@@ -51,7 +51,7 @@
   and second half of the time series using function \code{\link{ccf}} as
   \code{ccf(x=series,y=master,lag.max=5)}.
 
-  The plot is built using the \code{\link[grid]{Grid}} package which
+  The plot is built using the \link[grid]{Grid} package which
   allows for great flexibility in building complicated plots.  However,
   these plots look best when they don\enc{’}{'}t cover too wide a range
   of years (unless the plotting device is wider than is typical).  For

Modified: pkg/dplR/man/xskel.plot.Rd
===================================================================
--- pkg/dplR/man/xskel.plot.Rd	2015-12-18 13:30:18 UTC (rev 1008)
+++ pkg/dplR/man/xskel.plot.Rd	2016-01-22 17:41:36 UTC (rev 1009)
@@ -51,7 +51,7 @@
   and second half of the time series using function \code{\link{ccf}} as
   \code{ccf(x=series,y=master,lag.max=5)}.
 
-  The plot is built using the \code{\link[grid]{Grid}} package which
+  The plot is built using the \link[grid]{Grid} package which
   allows for great flexibility in building complicated plots.  However,
   these plots look best when they don\enc{’}{'}t cover too wide a range
   of years (unless the plotting device is wider than is typical).  For



More information about the Dplr-commits mailing list