[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