Skip to content
Back to formatted view

Raw Message

Message-ID: <05256be8-de09-9a18-da71-ea3910a1c73b@gmail.com>
Date: 2021-04-14T14:21:16Z
From: Duncan Murdoch
Subject: [R-pkg-devel] Problem with S4 method for plotting a raster file
In-Reply-To: <962B2433-9D85-49FD-8099-F93E16359AA6@bios.au.dk>

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 at gmail.com 
>> <mailto:murdoch.duncan at 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 at landscape, x at type, sep=" - ")
>>> ????????????}
>>> ????????????# Define colours specific or 'type'
>>> ????????????if(missing(col) && x at 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 at crs=="NA") {
>>> ??????????????crs2 <- sp::CRS(as.character(NA))
>>> ????????????} else {
>>> ??????????????crs2 <- sp::CRS(x at crs)
>>> ????????????}
>>> ????????????rdata <- raster::raster(x=x at data, xmn=x at ext$xleft, 
>>> xmx=x at ext$xright,
>>> ????????????????????????????????????ymn=x at ext$ybottom, ymx=x at 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 at crs)
>>> rdata <- raster::raster(x = x at data, xmn = x at ext$xleft,
>>> xmx = x at ext$xright, ymn = x at ext$ybottom, ymx = x at 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
>