我尝试了这个但是我在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+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"))
返回预期的内容。
所以我在哪里失败?
答案 0 :(得分:3)
如果其他人无法为他们获得接受的答案:@aosmith在对原始问题的评论中指出了一个关键。
添加geom_point(data=xy)
会在图上创建一个新图层。 ggplot2
期望这个新图层与原始图层的所有美学相匹配,因此您必须明确定义任何差异。在这种情况下,原始geom_polygon
图层使用group
和fill
美学,但geom_point
图层不使用group=NULL
图层。因此,您必须为fill=NULL
指定geom_point
和(myplot + geom_point(data=xy, aes(group=NULL, fill=NULL)))
,如下所示:
{{1}}
答案 1 :(得分: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
只是long
和lat
; geom_polygon
需要额外的美学group
和fill
,并且使用aes_string
进行设置,因为填充变量的名称正在传递给函数。
(p <- fx.ggplot(ctry))
这个版本中有一些工件但是(可能)做我正在使用的形状文件;我没有在你展示的情节中看到它们,所以你不应该有这个问题。
p + geom_point(data=xy)