2017-02-18 20 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)