2017-02-18 83 views
0

如何将道路(或任何交通基础设施)添加到我在R中制作的地图?我认为这个问题的概括将是我怎样才能使用geom_polygon()在彼此的顶部绘制两层,而没有第二层覆盖第一层?使用ggplot2添加道路地图

我特意试图用芝加哥的病房地图和它的巴士路线图来做到这一点。两者均可在线获取:https://data.cityofchicago.org/Facilities-Geographic-Boundaries/Boundaries-Wards-2015-/sp34-6z76和这里:https://data.cityofchicago.org/Transportation/CTA-Bus-Routes-Shapefile/d5bx-dr8z

代码分别绘制每个:

library(ggplot2) 
library(rgdal) 

wards <- readOGR(dsn=path.expand("~/Desktop/Wards"), layer ="geo_export_d15e486d-2802-4700-afe7-9063b55d3e27") 
buses <- readOGR(dsn=path.expand("~/Desktop/CTA_Routes"), layer ="CTA_Routes") 

#Fortify Wards 
wards.point <- fortify(wards, region = "ward") 
colnames(wards.point)[6] <- "ward" 
wardsmap.df <- join(wards.point, [email protected], by = "ward") 

#Fortify Buses 
buses.point <- fortify(buses, by = "OBJECTID") 
colnames(buses.point)[5] <- "OBJECTID" 
buses.df <- join(buses.point, [email protected], by = "OBJECTID") 

#Simple Ward map 
ggplot() + geom_polygon(data = wardsmap.df, aes(x = long, y = lat, group = group), 
       fill = NA, color = "black", size = 0.25) + theme_nothing(legend = TRUE) 

#Simple buses map 
ggplot() + geom_polygon(data = buses.df, aes(x = long, y = lat, group = group), 
       fill = NA, color = "black", size = 0.25) + theme_nothing(legend = TRUE) 

回答

1

主要问题是你的数据。他们有不同的投影,所以他们看起来像他们在地球的不同部分。

[email protected] 
CRS arguments: +proj=longlat +ellps=WGS84 +no_defs 

[email protected] 
CRS arguments: 
+proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=300000 
+y_0=0 +datum=NAD83 +units=us-ft +no_defs +ellps=GRS80 +towgs84=0,0,0 

一旦我们转变到一个单一的投影全部是固定的:

buses <- spTransform(buses, CRS("+proj=longlat +datum=WGS84")) 
wards <- spTransform(wards, CRS("+proj=longlat +datum=WGS84")) 

在此之后,继续为你做:

wards.point <- fortify(wards, region = "ward") 
colnames(wards.point)[6] <- "ward" 
wardsmap.df <- join(wards.point, [email protected], by = "ward") 

#Fortify Buses 
buses.point <- fortify(buses, by = "OBJECTID") 
colnames(buses.point)[5] <- "OBJECTID" 
buses.df <- join(buses.point, [email protected], by = "OBJECTID") 

#Simple Ward map 
ggplot() + 
    geom_polygon(data = wardsmap.df, aes(x = long, y = lat, group = group), fill = 'black', color = "black", size = 0.25, alpha = .5) + 
    geom_path(data = buses.df, aes(x = long, y = lat, group = group), color = "red", size = 0.35) 

不过看起来有点怪异我要什么,我了解芝加哥,但也可能是一些我不知道的木桶投影。这应该足以让你开始

enter image description here

+2

其实你可以通过添加coord_cartesian()修复投影问题,所以如果你把它下面应该罚款。 (x = long,y = lat,组=组),fill ='black',color =“black”,size = 0.25, alpha = .5)+ geom_path(data = bus.df,aes(x = long,y = lat,group = group),color =“red”,size = 0.35) – ike

1

所以这里的东西:它要在地块(或覆盖像你说的),因为你并没有使用的变量ggplot,所以它写入到每一次。您需要将一个分配给ggplot(病房),然后再分配另外两个数据集。

发生什么事是每个对象ggplot和geom正在制作一个地图图层。如果没有分配给ggplot,则假定来自第一个geom的变量。所以这就是为什么它看起来像是在骑马,而事实上它只是第二次写一层。在下面列出的内衬下面绘制两层(几何对象)在基础顶部(病房数据)。

这应该很好。

ggplot(data = wardsmap.df, aes(x = long, y = lat, group = group)) + 
geom_polygon(data = wardsmap.df, aes(x = long, y = lat, group = group), 
      fill = NA, color = "black", size = 0.25) + 
geom_polygon(data = buses.df, aes(x = long, y = lat, group = group), 
      fill = NA, color = "red", size = 0.25) + 
theme_nothing(legend = TRUE) 

p.s.如果你把所有的图层写成color = black,它看起来好像不是它们,但我认为这只是一个错字,所以我在这里更正了

也从上面改进,因为我看到coords没有被分配:

ggplot(data = wardsmap.df, aes(x = long, y = lat, group = group)) + 
coord_cartesian()+ 
geom_polygon(data = wardsmap.df, aes(x = long, y = lat, group = group), 
      fill = NA, color = "black", size = 0.25) + 
geom_polygon(data = buses.df, aes(x = long, y = lat, group = group), 
      fill = NA, color = "red", size = 0.25) + 
theme_nothing(legend = TRUE)