使用spplot通过两个属性(通过颜色和符号)区分空间点

时间:2016-10-19 15:03:35

标签: r plot

假设我们有兴趣比较9种不同的cultivars植物物种,通过在田地中种植2 cuttings种植物。我想绘制整个布局,每次切割一个点,就像我们从上面看到的那样。使用zipsum R包,我知道如何根据一个因素属性使用颜色来区分切割,但是我无法在中使用符号成功因素属性。

需要更多细节来理解下面的可重复示例。我进一步假设切割种植在具有6行和3列(总共18个位置)的规则网格上。该田地被分成2个区块,每个区块有9个位置,因此每个区域中每个栽培品种只出现一次。所以我想使用颜色来区分块(例如,块A为蓝色,块B为红色)。此外,品种属于两个不同的类别。因此,我也希望使用符号来区分类别(例如,圆圈和三角形)。

len

这样的data.frame可以转换为空间对象:

sp

以下是我如何区分每种颜色的块:

lattice

spplot

当我指定(x <- data.frame(cultivar=rep(paste0("cv", 1:9), 2), row=rep(11:16, each=3), column=rep(5:7, 6), block=rep(c("A","B"), each=9), category=rep(c(5,5,rep(1,7)), 2))) 时,错误显示为:library(sp) x.sp <- SpatialPointsDataFrame(coords=x[,c("column","row")], data=x[,c("block","category")]) summary(x.sp)

我读到了spplot(obj=x.sp, zcol=c("block"), col.regions=c("blue","red"), key.space="right", scales=list(draw=TRUE), aspect="fill", xlab=colnames(coordinates(x.sp))[1], ylab=colnames(coordinates(x.sp))[2], main="Layout on the field") 的{​​{1}}选项以及zcol=c("block","category")的{​​{1}}选项(由all factors should have identical levels调用),但不太明白他们如何工作。有什么想法吗?

或者您知道另一种(简单)方法与其他包一起制作这样的情节吗?

1 个答案:

答案 0 :(得分:1)

我展示了两种方法,使用update并制作其他因素。

前者:首先,您创建一个具有"block" (color)信息的基础对象(它与您上面显示的内容几乎相同)。其次,您可以使用"category" (pch)添加legend信息和update()

后者:它基于制作和使用具有所有因子信息的组合因子的想法。

  ## "category" isn't numeric but factor. It would be better to change class.
x$category <- as.factor(x$category)
x.sp <- SpatialPointsDataFrame(coords=x[,c("column","row")], data=x[,c("block","category")])

  ## make a base graph ("block")
p <- spplot(obj = x.sp, zcol = c("block"),
            col.regions = c("blue","red"), key.space = "none", # <- modify not to make legend
            scales = list(draw=TRUE), aspect = "fill",
            xlab = colnames(coordinates(x.sp))[1],
            ylab = colnames(coordinates(x.sp))[2],
            main = "Layout on the field")

  ## add "category" information and legend
p <- update(p, pch = c(16, 17)[x.sp$category],
            key = list(right = list(fun = lattice::draw.key), 
                       points = list(col = c("blue", "red", 1, 1), pch = c(15, 15, 1, 2)), 
                       text = list(c(levels(x.sp$block), levels(x.sp$category))),
                       space = 'right', columns = 1)) 
p

enter image description here

后一种方法(使用因子组合)

x.sp2 <- SpatialPointsDataFrame(coords=x[,c("column","row")], 
                                data=cbind(x[,c("block","category")], comb = paste0(x$block, x$category)))

spplot(x.sp2, "comb", col.regions = rep(c("red", "blue"), each = 2), pch = rep(c(16, 17), 2), 
       scales=list(draw=TRUE), aspect="fill", key.space = "right",
       xlab=colnames(coordinates(x.sp))[1],
       ylab=colnames(coordinates(x.sp))[2],
       main="Layout on the field")