spplot()中的国家标签

4

我希望在spplot()中为区域添加名称标签。

示例:

load(url('http://gadm.org/data/rda/FRA_adm0.RData'))
FR <- gadm
FR <- spChFIDs(FR, paste("FR", rownames(FR), sep = "_"))
load(url('http://gadm.org/data/rda/CHE_adm0.RData'))
SW <- gadm
SW <- spChFIDs(SW, paste("SW", rownames(SW), sep = "_"))
load(url('http://gadm.org/data/rda/DEU_adm0.RData'))
GE <- gadm
GE <- spChFIDs(GE, paste("GE", rownames(GE), sep = "_"))

df <- rbind(FR, SW, GE)

## working
plot(df)
text(getSpPPolygonsLabptSlots(df), labels = c("FR", "SW", "GE"))


## not working
spplot(df[1-2,])
text((getSpPPolygonsLabptSlots(df), labels = c("FR", "SW"))

第二个可能不起作用是因为格子问题!? 然而,我需要spplot功能。 如何在图上获取标签?

2
您不能混用基本图形和网格图形。text()使用前者,而lattice使用后者。您可以使用等效的ltext()来配合lattice使用,或者使用panel.text(),但我怀疑您需要编写一个面板函数才能使用它;我认为您不能像使用基础图形那样轻松地在网格图上绘制。 - Gavin Simpson
2个回答

6

添加文本的标准方式是使用lattice的函数ltext,但其中给出的坐标始终是绝对值。实际上,在添加文本后无法真正重新调整图形的比例。例如:

data(meuse.grid)
gridded(meuse.grid)=~x+y
meuse.grid$g = factor(sample(letters[1:5], 3103, replace=TRUE),levels=letters[1:10])
meuse.grid$f = factor(sample(letters[6:10], 3103, replace=TRUE),levels=letters[1:10])

spplot(meuse.grid, c("f","g"))
ltext(100,200,"Horror")

生成以下这些图形(缩放前后):

Horror 1 Horror 2

您可以使用自定义面板函数,使用每个面板内的坐标:

myPanel <- function(x,y,xx,yy,labels,...){
    panel.xyplot(x,y,...)
    ltext(xx,yy,labels)
}

xyplot(1:10 ~ 1:10,data=quakes,panel=myPanel,
        xx=(1:5),yy=(1:5)+0.5,labels=letters[1:5])

(运行它以查看其外观)

这个技巧也可以在spplot函数中使用,尽管你确实需要检查你使用的任何绘图函数。在spplot的帮助文件中,你可以找到可能的选项(polygonsplot、gridplot和pointsplot),因此你必须检查其中任何一个是否正在执行你想要的操作。继续上面的gridplot,代码如下:

myPanel <- function(x,y,z,subscripts,xx,yy,labels,...){
    panel.gridplot(x,y,z,subscripts,...)
    ltext(xx,yy,labels)
}
# I just chose some coordinates
spplot(meuse.grid, c("f","g"),panel=myPanel,xx=180000,yy=331000,label="Hooray")

这个功能可以提供可扩展的结果,在每个面板中添加文本:

enter image description here Hooray


5

谢谢您,Gavin Simpson!

我终于找到了一种方法。

为了帮助将来的他人,我发布了我的解决方案:

sp.label <- function(x, label) {
    list("sp.text", coordinates(x), label)
}

ISO.sp.label <- function(x) {
    sp.label(x, row.names(x["ISO"]))
}

make.ISO.sp.label <- function(x) {
    do.call("list", ISO.sp.label(x))
}

spplot(df['ISO'], sp.layout = make.ISO.sp.label(df))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接