以下代码适用于绘制多边形
SP <- SpatialPolygons(spd)
centroids <- coordinates(SP)
x <- centroids[,1]
y <- centroids[,2]
SP1 <- SpatialPolygonsDataFrame(SP, data = data.frame(x = x, y = y, z = z, row.names = row.names(SP)))
ggplot(data = SP1, aes(x = long, y = lat, group = group)) + geom_path()
相反,如果我更改代码的最后两行以根据某些值向量填充这些多边形,则它不起作用:
penetration <- runif(n = length(SP), min = 1, max = 10)
SP1 <- SpatialPolygonsDataFrame(SP, data = data.frame(x = x, y = y, z = z, value = penetration, row.names = row.names(SP)))
ggplot(data = SP1, aes(x = long, y = lat, group = group)) + geom_polygon(aes(fill=SP1$value))
使用以下链接中的数据创建spd:
数据来源:https://www.google.com/maps/d/viewer?mid=1mf9TQY3bocarO4SaIXAtco_C1LE&hl=en_US
然后我从kml文件中提取坐标...然后进入多边形列表,以便我可以使用一些绘图函数绘制它...
tkml <- getKMLcoordinates(kmlfile="Pune all Electoral Wards.kml", ignoreAltitude=T)
len <-length(tkml)
del <- NA
for(i in 1:len)
{
if(length(tkml[[i]]) == 2)
del <- c(del, i)
}
del <- del[-1]
tkmlCleaned <- tkml[!tkml %in% tkml[del]]
size <- length(tkmlCleaned)
sr <- vector(mode = "list", length = size)
srs <- vector(mode = "list", length = size)
spd <- list()
for(j in 1:length(sr))
{
sr[[j]] <- Polygon(tkmlCleaned[[j]])
srs[[j]] <- Polygons(list(sr[[j]]), j)
spd <- c(srs[[j]], spd)
}
答案 0 :(得分:0)
我发现我将多边形填充数据与Polygon数据合并的方式与ggplot的数据格式不兼容。所以下面的代码不起作用
SP1 <- SpatialPolygonsDataFrame(SP, data = data.frame(x = x, y = y, z = z, value = penetration, row.names = row.names(SP)))
首先我们需要使用ggplot2库中的fortify命令
SP1 <- SpatialPolygonsDataFrame(SP, data = data.frame(x = x, y = y, z = z, row.names = row.names(SP)))
abc <- fortify(SP1)
注意在将fortify命令应用到lat,long,id,group等列时,数据如何堆叠。
id列来自Polygons命令,其中每个Polygon都分配了一个id,如下面的代码所示。多边形函数中的第二个参数是id
for(j in 1:length(sr))
{
sr[[j]] <- Polygon(tkmlCleaned[[j]])
srs[[j]] <- Polygons(list(sr[[j]]), j)
spd <- c(srs[[j]], spd)
}
为了以ggplot可读的方式连接数据,我使用了dplyr库中的函数inner_join。 请注意,dplyr软件包不适用于R 3.1.0,我已更新到最新版本。
cde <- inner_join(abc, wardDensity1, by = "id")
当我们使用inner_join函数时,渗透通过合并映射到id,结果可由ggplot读取
wardDensity包含id(在这种情况下是选举区名称)和该病房的人口
baseHeatMap <- ggplot(data = cde, aes(long , lat, group = group, fill = penetration)) + geom_polygon(color = "black")