在传单中绘制 shp 文件,在 ggplot 中工作
Plotting shp file in leaflet, works in ggplot
我很难将我的数据框绘制在传单中。我合并了一个 shapefile 和一个 csv。生成的数据框有几列,包括 long、lat 和 "percent"。
我可以使用带有以下代码的 ggplot 绘制它:
p <- ggplot() +
geom_polygon(data = nyc_plotData, aes(x=long, y=lat, group = group,
fill=percent)) +
geom_polygon(data = county, aes(x=long, y=lat, group = group),
fill=NA, color = "black", size = 0.25) +
coord_map(xlim = c(-74.26, -73.71), ylim = c(40.49,40.92))
结果是纽约市收入分布的等值线图:
当我尝试在传单中使用相同的数据框时,出现此错误:
Don't know how to get path data from object of class data.frame
我知道我必须重新格式化我的数据框。我尝试了多种方法来转换为 SpatialPolygonDataFrame。例如:
xy <- nyc_plotData[,c(1,2)]
spdf <- SpatialPolygonsDataFrame(coords = xy, data = nyc_plotData,
proj4string = CRS("+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0"))
给出以下错误:
Error in SpatialPolygonsDataFrame(coords = xy, data = nyc_plotData, proj4string = CRS("+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0")) :
unused arguments (coords = xy, proj4string = CRS("+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0"))
我显然遗漏了一些东西,但我无法在网上的任何地方找到任何关于这个问题的例子。
我非常感谢处理 shapefile 和在传单中绘图的任何提示或建议。
正如其他人指出的(您也注意到了),您需要转换为 SpatialPolygonsDataFrame
。为此,我认为您需要将每个传单转换为 Polygon
,然后是 Polygons
,然后是 SpatialPolygons
,最后是 SpatialPolygonsDataFrame
。下面有代码。
替代方案:您从 SpatialPolygonsDataFrame
开始,然后使用 fortify
映射到 ggplot2
。您可以返回到原始 SpatialPolygonsDataFrame
并将数据槽与您的表格人口普查数据合并(注意不要更改行顺序)。
我对这两个选项进行了更详细的说明 here。
library(dplyr)
library(sp)
polyFunc<-function(groupname, dat){
poly<-filter(dat, id==groupname) %>%
select(long, lat)
return(Polygons(list(Polygon(poly)), groupname))
}
tracts <- distinct(ggtract, id, percent)
tractname <- tracts$id
polygons<-lapply(tractname, function(x) polyFunc(x, dat=ggtract))
sp.polygon<-SpatialPolygons(polygons)
df.polygon<-SpatialPolygonsDataFrame(sp.polygon,
data=data.frame(row.names=tractname, tracts))
我很难将我的数据框绘制在传单中。我合并了一个 shapefile 和一个 csv。生成的数据框有几列,包括 long、lat 和 "percent"。
我可以使用带有以下代码的 ggplot 绘制它:
p <- ggplot() +
geom_polygon(data = nyc_plotData, aes(x=long, y=lat, group = group,
fill=percent)) +
geom_polygon(data = county, aes(x=long, y=lat, group = group),
fill=NA, color = "black", size = 0.25) +
coord_map(xlim = c(-74.26, -73.71), ylim = c(40.49,40.92))
结果是纽约市收入分布的等值线图:
当我尝试在传单中使用相同的数据框时,出现此错误:
Don't know how to get path data from object of class data.frame
我知道我必须重新格式化我的数据框。我尝试了多种方法来转换为 SpatialPolygonDataFrame。例如:
xy <- nyc_plotData[,c(1,2)]
spdf <- SpatialPolygonsDataFrame(coords = xy, data = nyc_plotData,
proj4string = CRS("+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0"))
给出以下错误:
Error in SpatialPolygonsDataFrame(coords = xy, data = nyc_plotData, proj4string = CRS("+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0")) : unused arguments (coords = xy, proj4string = CRS("+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0"))
我显然遗漏了一些东西,但我无法在网上的任何地方找到任何关于这个问题的例子。
我非常感谢处理 shapefile 和在传单中绘图的任何提示或建议。
正如其他人指出的(您也注意到了),您需要转换为 SpatialPolygonsDataFrame
。为此,我认为您需要将每个传单转换为 Polygon
,然后是 Polygons
,然后是 SpatialPolygons
,最后是 SpatialPolygonsDataFrame
。下面有代码。
替代方案:您从 SpatialPolygonsDataFrame
开始,然后使用 fortify
映射到 ggplot2
。您可以返回到原始 SpatialPolygonsDataFrame
并将数据槽与您的表格人口普查数据合并(注意不要更改行顺序)。
我对这两个选项进行了更详细的说明 here。
library(dplyr)
library(sp)
polyFunc<-function(groupname, dat){
poly<-filter(dat, id==groupname) %>%
select(long, lat)
return(Polygons(list(Polygon(poly)), groupname))
}
tracts <- distinct(ggtract, id, percent)
tractname <- tracts$id
polygons<-lapply(tractname, function(x) polyFunc(x, dat=ggtract))
sp.polygon<-SpatialPolygons(polygons)
df.polygon<-SpatialPolygonsDataFrame(sp.polygon,
data=data.frame(row.names=tractname, tracts))