[R] Filled vector contours
dwinsemius at comcast.net
Mon Aug 25 00:58:27 CEST 2014
On Aug 24, 2014, at 1:30 PM, Jan Tosovsky wrote:
> On 2014-08-24 Prof Brian Ripley wrote:
>> On 24/08/2014 08:51, Jan Tosovsky wrote:
>>> I am trying to create vector output (SVG) of filled contours.
>>> I've found two approaches so far:
>>> #levelplot(volcano, panel=panel.levelplot.raster)
>>> rr <- raster(t(volcano))
>>> rc <- cut(rr, breaks= 10)
>>> pols <- rasterToPolygons(rc, dissolve=T)
>>> But I'd like to get smooth closed polygons not broken into small
>> How can a polygon be 'smooth'?
> This was related to the result of example (2), which is more coarse
> comparing it to the result of (1).
>> But the region between two contours is not in general a closed polygon.
> I appologize for not being precise here.
> My goal is to get something like this:
> which is a composition of level plots, e.g.
> By 'level plot' I mean the cut of the data at certain level. It is always a
> closed polygon (or multiple polygons) consisting of contour lines connected,
> if required, by border lines.
> For me it is preferred way over 'isoband', which doesn't include areas
> hidden by upper levels:
> Please note I am not sure if this terminology (isoband, level plot, etc) is
Most people with any R experience would have thought that "levelplot" referred to something like:
(Example 6.9 from Lattice, by Deepayan Sarkar to which I have only added the contour line parameter which it appears is what you were seeking.)
env <- environmental
env$ozone <- env$ozone^(1/3)
env$Radiation <- equal.count(env$radiation, 4)
fm1.env <- lm(ozone ~ radiation * temperature * wind, env)
fm2.env <- loess(ozone ~ wind * temperature * radiation, env, span = 0.75, degree = 1)
fm3.env <- loess(ozone ~ wind * temperature * radiation, env, parametric = c("radiation", "wind"), span = 0.75, degree = 2)
library("locfit") ; library(lattice)
fm4.env <- locfit(ozone ~ wind * temperature * radiation, env)
w.mesh <- with(env, do.breaks(range(wind), 50))
t.mesh <- with(env, do.breaks(range(temperature), 50))
r.mesh <- with(env, do.breaks(range(radiation), 3))
grid <- expand.grid(wind = w.mesh, temperature = t.mesh, radiation = r.mesh)
grid[["fit.linear"]] <- predict(fm1.env, newdata = grid)
grid[["fit.loess.1"]] <- as.vector(predict(fm2.env, newdata = grid))
grid[["fit.loess.2"]] <- as.vector(predict(fm3.env, newdata = grid))
grid[["fit.locfit"]] <- predict(fm4.env, newdata = grid)
print(levelplot(fit.linear + fit.loess.1 + fit.loess.2 + fit.locfit ~ wind * temperature | radiation, data = grid, contour=TRUE))
>>> Are there better methods in R ?
>> Neither of those are 'in R'!
>> But you could get a long way by looking at the following
>> all of which are part of R. R is a fully-fledged programming
>> language and you could write SVG directly from R: using the svg device
>> is limited by the steps to the R graphics primitives (see the 'R
>> Internals' manual) and cairographics.
> Thanks a lot for detailed explanation. Now I understand it more.
> Most of contouring libraries create the list of line fragments. And this
> seems to be the case also of R's 'contourLines'.
> But filling the areas requires a further post-processing (joining line
> fragments, joining contours, set the correct direction to preserve holes).
> And if I understand correctly, this is let to R 'libraries'. Unfortunately,
> none of these two is optimal for my use case.
> If there is any hidden option or another library (implementing e.g. Marching
> squares) which could produce output similar to that linked SVG file, I am
> one big ear.
> Thanks, Jan
> R-help at r-project.org mailing list
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
Alameda, CA, USA
More information about the R-help