[R-pkg-devel] Problem with S4 method for plotting a raster file
Duncan Murdoch
murdoch@dunc@n @end|ng |rom gm@||@com
Wed Apr 14 16:21:16 CEST 2021
On 14/04/2021 9:26 a.m., Jacob Nabe-Nielsen wrote:
> Hi Duncan
>
> Thanks a lot for the help. This works, but unfortunately it does not
> result in a landscape which is cropped to the extent of the bathymetry
> raster file... it would be nice to be able to do that as well (as you
> can if you use the 'raster' and 'sp' packages).
>
I wasn't suggesting that my code was a solution, it's just a hint about
what is going wrong. I don't know how the coastline plot determines the
bounds of the plot region, but if that isn't working, then you'd have
problems similar to what you saw.
Duncan Murdoch
> Best wishes,
> Jacob
>
>
>> On 14 Apr 2021, at 14.44, Duncan Murdoch <murdoch.duncan using gmail.com
>> <mailto:murdoch.duncan using gmail.com>> wrote:
>>
>> On 14/04/2021 5:41 a.m., Jacob Nabe-Nielsen wrote:
>>> Dear all,
>>> I have just discovered an error in a package that I have already
>>> uploaded to
>>> CRAN, and cannot figure out how to fix it. All help will be greatly
>>> appreciated.
>>> The package is called DEPONS2R, and is available from:
>>> https://cran.r-project.org/web/packages/DEPONS2R/index.html
>>> <https://cran.r-project.org/web/packages/DEPONS2R/index.html>
>>> The problem is related to one of the included examples, where I plot
>>> the coastline
>>> on top of a raster file. In the example, where the plotting is
>>> embedded in
>>> an S4 method called plot.DeponsRaster, the coastline does not show.
>>> But if
>>> I run the functions that the method is composed of, everything works
>>> fine (see
>>> below). So I am wondering if the graphics devise is not passed on
>>> correctly
>>> within the package, or what actually happens.
>>> The example that does not run correctly is available from
>>> ?plot.DeponsRaster:
>>> library(DEPONS2R)
>>> data("bathymetry")
>>> plot(bathymetry)
>>> data("coastline")
>>> library(rgdal)
>>> # Change projection of coastline to match that of bathymetry data
>>> coastline2 <- spTransform(coastline, crs(bathymetry))
>>> plot(coastline2, add=TRUE, col="lightyellow2")
>>> Here the coastline is not plotted. The method is defined as:
>>> setMethod("plot", signature("DeponsRaster", "ANY"),
>>> function(x, y, maxpixels=500000, col, alpha=NULL, colNA=NA,
>>> add=FALSE,
>>> ext=NULL, useRaster=TRUE, interpolate=FALSE,
>>> addfun=NULL,
>>> nc, nr, maxnl=16, main, npretty=0, axes=TRUE,
>>> legend=TRUE, trackToPlot=1, ...) {
>>> oldpar <- graphics::par(no.readonly = TRUE)
>>> on.exit(graphics::par(oldpar))
>>> if (missing(main)) {
>>> main <- paste(x using landscape, x using type, sep=" - ")
>>> }
>>> # Define colours specific or 'type'
>>> if(missing(col) && x using type=="bathymetry") {
>>> tmp.col <- grDevices::rainbow(1000)[501:800]
>>> col <- c(tmp.col[1:100], rep(tmp.col[101:250], each=5))
>>> }
>>> # Use {raster}-package for plotting
>>> if(x using crs=="NA") {
>>> crs2 <- sp::CRS(as.character(NA))
>>> } else {
>>> crs2 <- sp::CRS(x using crs)
>>> }
>>> rdata <- raster::raster(x=x using data, xmn=x using ext$xleft,
>>> xmx=x using ext$xright,
>>> ymn=x using ext$ybottom, ymx=x using ext$ytop,
>>> crs=crs2)
>>> raster::plot(rdata, col=col, main=main,
>>> alpha=alpha, add=add, ext=ext, axes=axes,
>>> legend=legend)
>>> }
>>> )
>>> But when I use the functions that are at the core of this method it is
>>> not a problem adding the coastline correctly:
>>> x <- bathymetry
>>> crs2 <- raster::crs(x using crs)
>>> rdata <- raster::raster(x = x using data, xmn = x using ext$xleft,
>>> xmx = x using ext$xright, ymn = x using ext$ybottom, ymx = x using ext$ytop,
>>> crs = crs2)
>>> raster::plot(rdata)
>>> plot(coastline2, add=TRUE, col="lightyellow2")
>>> If would be fantastic if someone can figure out how I should modify
>>> the method
>>> to plot the coastline correctly on top of the map.
>>
>> I'm not sure exactly what is going wrong, but if you plot the
>> coastline first and the bathymetry second, things do show up. Maybe
>> that's enough of a hint for you:
>>
>> library(DEPONS2R)
>> data("coastline")
>> library(rgdal)
>> coastline2 <- spTransform(coastline, crs(bathymetry))
>> plot(coastline2, col="lightyellow2")
>>
>> data("bathymetry")
>> plot(bathymetry, add=TRUE)
>>
>> This puts the legend on top of the plotted coastline data, so my guess
>> is that the limits of the bathymetry plot aren't being made available
>> to the coastline plot when you do things in the original order.
>>
>> Duncan Murdoch
>
More information about the R-package-devel
mailing list