spplot / lattice:未绘制/透支的对象

时间:2015-09-15 12:33:49

标签: r lattice sp

我有一个网格,我想用一些地图元素(比例尺,北箭头等)从这个网格中生成一个地图。我绘制网格和我需要的颜色没有问题,但额外的地图元素将不会显示在地图上。我尝试根据first=TRUE manualsp放到sp.layout参数中,但仍然没有成功。

我使用集成的meuse数据集重现了这个问题,因此您可以复制并粘贴该代码。我使用这些包版本:lattice_0.20-33sp_1.2-0

library(sp)
library(lattice) # required for trellis.par.set():
trellis.par.set(sp.theme()) # sets color ramp to bpy.colors()

alphaChannelSupported = function() { 
  !is.na(match(names(dev.cur()), c("pdf")))
}

data(meuse)
coordinates(meuse)=~x+y
data(meuse.riv)


library(gstat, pos = match(paste("package", "sp", sep=":"), search()) + 1)
data(meuse.grid)
coordinates(meuse.grid) = ~x+y
gridded(meuse.grid) = TRUE
v.uk = variogram(log(zinc)~sqrt(dist), meuse)
uk.model = fit.variogram(v.uk, vgm(1, "Exp", 300, 1))
meuse[["ff"]] = factor(meuse[["ffreq"]])
meuse.grid[["ff"]] = factor(meuse.grid[["ffreq"]])
zn.uk = krige(log(zinc)~sqrt(dist), meuse, meuse.grid, model = uk.model)
zn.uk[["se"]] = sqrt(zn.uk[["var1.var"]])

meuse.sr = SpatialPolygons(list(Polygons(list(Polygon(meuse.riv)),"meuse.riv")))
rv = list("sp.polygons", meuse.sr, fill = "lightblue")
sampling = list("sp.points", meuse.riv, color = "black")
scale = list("SpatialPolygonsRescale", layout.scale.bar(), 
             offset = c(180500,329800), scale = 500, fill=c("transparent","black"), which = 4)
text1 = list("sp.text", c(180500,329900), "0", cex = .5, which = 4)
text2 = list("sp.text", c(181000,329900), "500 m", cex = .5, which = 4)
arrow = list("SpatialPolygonsRescale", layout.north.arrow(), 
             offset = c(181300,329800), 
             scale = 400, which = 4)

library(RColorBrewer)
library(lattice)
trellis.par.set(sp.theme())
precip.pal <- colorRampPalette(brewer.pal(7, name="Blues"))

spplot(zn.uk, "var1.pred",
       sp.layout = list(rv, sampling, scale, text1, text2),
       main = "log(zinc); universal kriging standard errors",
       col.regions=precip.pal,
       contour=TRUE, 
       col='black',
       pretty=TRUE,
       scales=list(draw = TRUE),
       labels=TRUE)

这就是它的样子......所有裸体: enter image description here 所以我的问题:

  1. 比例尺,北箭等隐藏在哪里?我错过了什么?我在互联网上找到的每个例子都与此类似。在我自己的数据集中,我可以看到首先绘制比例尺和北箭头,但是一旦渲染网格,它就会叠加其他地图元素(地图上显示的比例文本除外 - 而不是条形图)因为某种原因,我似乎无法理解北箭头。
  2. 当我尝试添加采样位置sampling = list("sp.points", meuse.riv, color = "black")时,地图上显示的错误消息就会显示。如果没有此条目,地图将显示没有错误,但也没有其他地图元素。如何在地图上显示采样点(例如,在大小取决于此采样点的绝对值的圆圈中)?
  3. 这让我困扰了很多很多小时,我找不到任何解决办法。在Bivand等人的教科书(2013)“应用空间数据分析与R”中,我可以阅读以下内容:

    sp.layout参数中的项目顺序很重要;原则上是对象 按照它们出现的顺序绘制。默认情况下,当spplot的对象具有时 点或线,sp.layout项在点之前绘制以允许网格 和多边形绘制为背景。对于网格和多边形,sp.layout 之后绘制项目(因此项目不会被网格透支 和/或多边形)。对于网格,首先添加列表元素= TRUE可确保这一点 在绘制网格之前绘制项目(例如,添加填充多边形时)。组合图层时,透明度可能会有所帮助;它可用于 PDF设备和其他几个设备。 函数sp.theme返回一个可用于绘图的网格主题 由spplot制作;打开设备后使用trellis.par.set(sp.theme()) 或者改为使其有效。

    但是,除了这些附加信息,我还是无法解决这个问题。很高兴任何提示!

1 个答案:

答案 0 :(得分:2)

你错过的元素是在第四小组中绘制的,它不存在,因此不会被绘制。请尝试删除which = 4

您的示例中的

meuse.riv是一个矩阵,它会导致错误消息,但应该是SpatialPoints对象,因此请创建sampling

sampling = list("sp.points", SpatialPoints(meuse.riv), color = "black")

在使用示例时,我的建议是尽可能选择尽可能接近您需要的示例,并且一次只更改一件事。