1

我试过了,但在 eval(expr, envir, enclos) 中出现错误:找不到对象“组”。pj4s 是一个包含 latlong 投影的对象。

我的代码

fx.ggplot<-function(ctry,aesfill="id",scalefill="Country",pathcol="white"){
    #ctry is a shapefile of countries
     ctry@data$id = rownames(ctry@data)
    ctry.points = fortify(ctry, region="id")
    ctry.df = join(ctry.points, ctry@data, by="id")
    (txt<-paste("p<-ggplot(ctry.df) + aes(long,lat,group=group,fill=",aesfill,")"))
    eval(parse(text=txt))
    p<-p+   geom_polygon() +
        geom_path(color=pathcol) +
        coord_equal() +
        scale_fill_brewer(scalefill)
    return(p)
}

#generate a grid of points
xo<-seq(25,45,0.5)
yo<-seq(-15,5,0.5)
head(xy<-cbind(expand.grid(xo,yo)));names(xy)<-c("lon","lat")
head(xy.sp <- SpatialPoints(xy,proj4string=pj4s))
Overlay<-over(xy.sp,ctry)
xy<-xy[!apply(Overlay, 1, function(x) any(is.na(x))),]

#plot
(p<-fx.ggplot(ctry))

这是 (p) 返回的国家的图

(P<-p+geom_point(data=xy, aes(x=lon, y=lat))) #addpoints returns Error

ggplot()+geom_point(data=xy, aes(x=lon, y=lat)) #This plots the points (as below) without error but in a new plot. 

点的情节是成功的

#matrix
mat.ctry<-fx.polygon2raster2array(shp=ctry,xo,yo,cTim=1)
mat<-cbind(expand.grid(xo,yo),c(mat.ctry));names(mat)<-c(names(xy),"Z")
mat<-mat[!apply(mat, 1, function(x) any(is.na(x))),]
p+geom_raster(data=mat,aes(x=lon,y=lat,colour="red"))

#returns 错误但ggplot()+geom_raster(data=mat,aes(x=lon,y=lat,colour="red"))返回预期的内容。 这是结果

那么我在哪里失败了?

4

2 回答 2

5

万一其他人无法为他们获得公认的答案:关键是@aosmith 在对原始问题的评论中指出的内容。

添加在geom_point(data=xy)绘图上创建一个新层。ggplot2期望这个新层与原始层的所有美学相匹配,因此您必须明确定义任何差异。在这种情况下,原始geom_polygon图层使用groupfill美学,但geom_point图层没有。因此,您必须指定group=NULLfill=NULLfor geom_point,如下所示:

(myplot + geom_point(data=xy, aes(group=NULL, fill=NULL)))
于 2015-09-30T05:16:30.490 回答
2

让我们分解正在发生的事情并解决一些问题。首先,为代码/示例加载必要的库。

library("rgeos")
library("sp")
library("ggplot2")
library("plyr")

查看您的示例地图,我知道您拥有哪些东非国家。我从rworldmap包中为它们提取了形状文件。这些可能不如您的形状文件好,但它们现在可以了。

library("rworldmap")
data(countriesLow)
ctry <- countriesLow[countriesLow$ISO3.1 %in% c("TZA", "KEN", "UGA", "RWA", "BDI"),]

创建您拥有的点网格。我整理了一些代码,放弃了一些调用head并简化了子集代码。

#generate a grid of points
xy<-expand.grid(long=seq(25,45,0.5),lat=seq(-15,5,0.5))
xy.sp <- SpatialPoints(xy, proj4string=CRS(proj4string(ctry)))
Overlay<-over(xy.sp,ctry)
xy<-xy[!is.na(Overlay$ISO3.1),]

现在你的fx.ggplot电话可以重写为

fx.ggplot<-function(ctry, aesfill="id", scalefill="Country", pathcol="white") {
    ##ctry is a shapefile of countries
    ctry@data$id = rownames(ctry@data)
    ctry.points = fortify(ctry, region="id")
    ctry.df = join(ctry.points, ctry@data, by="id")
    ggplot(ctry.df, aes(long, lat)) +
        geom_polygon(aes_string(group="group", fill=aesfill)) +
        geom_path(colour = pathcol) +
        scale_fill_brewer(scalefill)
}

整体aes就是longlat; geom_polygon需要额外的美学groupfill, 并且这些是使用设置的,aes_string因为用于填充的变量的名称被传递到函数中。

(p <- fx.ggplot(ctry))

在此处输入图像描述

此版本中有一些工件,但那(可能)是我使用的形状文件;我没有在你展示的情节中看到它们,所以你不应该有问题。

p + geom_point(data=xy)

在此处输入图像描述

于 2013-10-07T22:30:02.013 回答