在R中使用ggplot的填充多边形不起作用

时间:2016-08-19 05:43:43

标签: r ggplot2

以下代码适用于绘制多边形

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)
}

1 个答案:

答案 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)

SP1 data snap abc data snap

注意在将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")