根据人口数量为ggplot地图着色

Posted

技术标签:

【中文标题】根据人口数量为ggplot地图着色【英文标题】:Colorizing ggplot map based on number of population 【发布时间】:2017-06-20 08:31:34 【问题描述】:

我有一个包含 50,000 多个数据的数据集。该数据集包括物体、经度和纬度(结构如下)。

coord <- data.frame(object = c("a","b","c","d","e","f","h","i","j","k"), LON = c(-73.95 ,-73.97,-73.95,-73.91,-73.91,-73.93,-73.96, -73.90,-73.97,-73.94),LAT =c(40.60,40.68,40.68,40.85,40.83,40.72,40.65, 40.74, 40.69, 40.82))

我打算为地图的不同区域着色。我找到了下面的示例代码。

library(rgeos)
library(maptools)
library(geojsonio)
library(ggplot2)
URL <- "http://services5.arcgis.com/GfwWNkhOj9bNBqoJ/arcgis/rest/services/nycd/FeatureServer/0/query?where=1=1&outFields=*&outSR=4326&f=geojson"
fil <- "nyc_community_districts.geojson"
if (!file.exists(fil)) download.file(URL, fil)
nyc_districts <- geojson_read(fil, what="sp")
nyc_districts_map <- fortify(nyc_districts, region="BoroCD")
mids <- cbind.data.frame(as.data.frame(gCentroid(nyc_districts, byid=TRUE)),id=nyc_districts$BoroCD)
gg <- ggplot()
gg <- gg + geom_map(data=nyc_districts_map, map=nyc_districts_map,
                aes(x=long, y=lat, map_id=id),
                color="#2b2b2b", size=0.15, fill=NA)
gg <- gg + geom_text(data=mids, aes(x=x, y=y, label=id), size=2)
gg <- gg + coord_map()
gg <- gg + ggthemes::theme_map()

然后,我用这段代码为不同的区域着色

library(viridis)
# make up some fill data
set.seed(1492)
df <- data.frame(LON = c(-73.95770,-73.95445,-73.96215,-73.97739,-73.98136,-73.93974,-73.95061, -73.98609 ,-73.95724,-73.93351,-73.94931),LAT =c(40.81099,40.71415,40.71025,40.68983,40.66715,40.79821,40.66830, 40.68980, 40.71636, 40.76621, 40.80273))

pointsSp <- SpatialPoints(coords = df[,c("LON", "LAT")], 
                      proj4string = CRS(proj4string(nyc_districts)))
nyc_districts$pointCount <- 0
for(i in 1:length(nyc_districts))
    x <- nyc_districts[i,]
    nyc_districts$pointCount[i] <- length(x[pointsSp,])
 

choro <- data.frame(district=nyc_districts@data$BoroCD,
                fill=sample(100, nrow(nyc_districts@data)))
gg <- ggplot()
gg <- gg + geom_map(data=nyc_districts_map, map=nyc_districts_map,
                aes(x=long, y=lat, map_id=id),
                color="#2b2b2b", size=0.15, fill=NA)
gg <- gg + geom_map(data=choro, map=nyc_districts_map,
                aes(fill=fill, map_id=district),
                color="#2b2b2b", size=0.15) 
gg <- gg + geom_point(data=coord, aes(x=LON, y=LAT), 
                  colour= "red", alpha=1,na.rm=T)
gg <- gg + scale_fill_viridis(name="Pick ups\ndistribution") +      geom_text(data=mids, aes(x=x, y=y, label=id), size=2)
gg <- gg + coord_map()
gg <- gg + ggthemes::theme_map()
gg <- gg + theme(legend.position=c(0.1,0.5))
gg

在上面的代码中,使用 geom-point 我可以在地图上显示不同坐标的位置。但是我的地区着色是错误的。你能告诉我如何根据“坐标”数据集为我的地图着色。

【问题讨论】:

@hrbrmstr 你能帮帮我吗? 我一到家就试试。在这里我无法访问您要从网站下载的文件... 【参考方案1】:

您必须对与每个多边形相交的点数执行“空间连接”。因此,必须将这些点转换为SpatialPointsObject。

pointsSp <- SpatialPoints(coords = coord[,c("LON", "LAT")], 
                          proj4string = CRS(proj4string(nyc_districts)))

之后,我们获取nyc_districts 的每个多边形并计算每个多边形内的点数。

nyc_districts$pointCount <- 0
for(i in 1:length(nyc_districts))
  x <- nyc_districts[i,]
  nyc_districts$pointCount[i] <- length(pointsSp[x,])

然后,您只需将 choro 代码行更改为以下内容,这基本上会将 sample(...)(用于测试目的...)更改为我们在上面创建的变量。之后,您可以像在 Q 中那样创建情节。

choro <- data.frame(district=nyc_districts@data$BoroCD,
                    fill=nyc_districts$pointCount)

结果如下所示:

【讨论】:

当我查看图例时。我的 Pickups 分布图例介于 0 和 1 之间。 对不起,我的错。我的代码有错误。我更改了nyc_districts$pointCount[i] &lt;- length(x[pointsSp,]) 行,它现在应该可以工作了。让我们清理评论会话 如何将每个区的名称显示为图例或地图。 首先,您必须找到一个提供地区实际名称的数据集。您使用的数据集仅提供 BoroCD。您可以找到提供 BoroCD 和可用于连接名称的名称的数据集,或者找到提供空间级别名称的空间(点)数据集。然后可以通过[ 的空间连接来实现连接。

以上是关于根据人口数量为ggplot地图着色的主要内容,如果未能解决你的问题,请参考以下文章

如何根据条件为ggplot中的线条着色?

根据ggplot中的条件着色点

GGplot 对象不会根据数据框中指定的颜色对条形进行着色

R语言ggplot2可视化:使用R原生plot函数为指定曲线下面的区域着色ggplot2可视化在曲线的特定下方添加分割线ggplot2为指定曲线下面的区域着色

在ggplot中为特定行着色

如何在ggplot lineplot中为具有相似颜色的多个子类着色?