2017-09-25 139 views
-1

我經常需要在R中創建地理熱圖。目前,我一直在我的辦公室計算機的Tableau許可版本中執行此操作,該操作的工作非常出色。但是當我不在辦公室時,我需要學習如何去做。數據有時是保密的,所以我不能通過互聯網使用Tableau公衆。我看,但找不到任何解決方案,產生我需要的結果。地理縣級熱圖

這些數據包括印度賈坎德邦州的地區名稱以及年齡在6至14歲的兒童人口,數千人。在Tableau中,我只需將DISTNAME列設置爲「縣級」的「地理角色」,並從互聯網(OpenStreetMap)將區域邊界與州的地圖一起拉出,並生成如此的熱圖我來自R想到,如果可能的話:

District-wise child population in Jharkhand

的數據是:

geo_data <- structure(list(DISTNAME = c("BOKARO", "CHATRA", "DEOGHAR", "DHANBAD", 
"DUMKA", "GARHWA", "GIRIDIH", "GODDA", "GUMLA", "HAZARIBAGH", 
"JAMTARA", "KHUNTI", "KODARMA", "LATEHAR", "LOHARDAGA", "PAKUR", 
"PALAMU", "PASHCHIMI SINGHBHUM", "PURBI SINGHBHUM", "RAMGARH", 
"RANCHI", "SAHIBGANJ", "SARAIKELA-KHARSAWAN", "SIMDEGA"), POP = c(521.5, 
196.5, 323.8, 445.5, 123, 373.9, 357.6, 248.2, 212.4, 686.7, 
626.7, 383.6, 391.9, 141, 436.1, 454.6, 301.3, 325.5, 193.7, 
238.3, 208.7, 587.4, 130.1, 268)), .Names = c("DISTNAME", "POP" 
), row.names = c(NA, 24L), class = "data.frame") 

,看起來像:

   DISTNAME POP 
1    BOKARO 521.5 
2    CHATRA 196.5 
3    DEOGHAR 323.8 
4    DHANBAD 445.5 
5    DUMKA 123.0 
6    GARHWA 373.9 
7    GIRIDIH 357.6 
8    GODDA 248.2 
9    GUMLA 212.4 
10   HAZARIBAGH 686.7 
11    JAMTARA 626.7 
12    KHUNTI 383.6 
13    KODARMA 391.9 
14    LATEHAR 141.0 
15   LOHARDAGA 436.1 
16    PAKUR 454.6 
17    PALAMU 301.3 
18 PASHCHIMI SINGHBHUM 325.5 
19  PURBI SINGHBHUM 193.7 
20    RAMGARH 238.3 
21    RANCHI 208.7 
22   SAHIBGANJ 587.4 
23 SARAIKELA-KHARSAWAN 130.1 
24    SIMDEGA 268.0 
+0

你需要找到一個shape文件進行(除非任何人的都知道包會自動將它們從OSM中拉出來)。如果你有一個你感興趣的縣的shapefile,那麼在R中映射它們非常簡單。 – Tumbledown

+0

你可以檢查這個問題/答案https://stackoverflow.com/questions/7747991/geographical-heat-map-in- r?rq = 1以及:https://www.computerworld.com/article/3175623/data-analytics/mapping-in-r-just-got-a-whole-lot-easier.html正如Tumbledown所說,你需要爲您的國家找到合適的shapefile以開始使用。 – Jul

+1

...你應該能夠在這裏找到這些形狀文件,你只需要將它們過濾到Jharkhand:http://gadm.org/download – Tumbledown

回答

0

在該解決方案在下面,我使用的地圖shapefiles從:下載0

編輯:稍後,我也嘗試從http://gadm.org/country提取的賈坎德手繪地圖,它顯示了地區邊界的細微差異。它與互聯網上可用的其他州政治地圖匹配得更好。

這裏是我的解決方案:

library(tmap) 
library(tmaptools) 

geo_data <- data.frame(
    DISTNAME = c("BOKARO", "CHATRA", "DEOGHAR", "DHANBAD", "DUMKA", "GARHWA", "GIRIDIH", "GODDA", "GUMLA", "HAZARIBAGH", "JAMTARA", "KHUNTI", "KODARMA", "LATEHAR", "LOHARDAGA", "PAKUR", "PALAMU", "PASHCHIMI SINGHBHUM", "PURBI SINGHBHUM", "RAMGARH", "RANCHI", "SAHIBGANJ", "SARAIKELA-KHARSAWAN", "SIMDEGA"), 
    POP = c(521.5, 196.5, 323.8, 445.5, 123, 373.9, 357.6, 248.2, 212.4, 686.7, 626.7, 383.6, 391.9, 141, 436.1, 454.6, 301.3, 325.5, 193.7, 238.3, 208.7, 587.4, 130.1, 268)) 

# the path to shape file 
shp_file <- "H:/Mapping/maps-master/Districts/Census_2011/2011_Dist.shp" 

india <- read_shape(shp_file, as.sf = TRUE, stringsAsFactors = FALSE) 
india$DISTRICT <- toupper(india$DISTRICT) 

jharkhand <- india[india$ST_NM =="Jharkhand", ] 

jharkhand_pop <- merge(x = jharkhand, 
         y = geo_data, 
         by.x = "DISTRICT", 
         by.y = "DISTNAME") 

#tmap_mode(mode = "plot") # static 
tmap_mode(mode = "view") # interactive 

qtm(jharkhand_pop, fill = "POP", 
    text = "DISTRICT", 
    text.size=.9) 

靜態地圖(plot模式)是非常好的,但在互動地圖(view模式)是超級真棒。它提供了從互聯網上的三個不同來源獲取更多地圖信息的選項。

非常感謝tmaptmaptools包的創造者。這種方法遠遠優於許多可在互聯網上找到的相對較長和尷尬的解決方案。

R interactive map

如果我們想要更多的定製:

tm_shape(jharkhand_pop) + 
    tm_polygons() + 
    tm_shape(jharkhand_pop) + 
    tm_borders() + 
    tm_fill("POP", 
      palette = get_brewer_pal("YlOrRd", n = 20), 
      n = 20, 
      legend.show = F, 
      style = "order") + # "cont" or "order" for continuous variable 
    tm_text("DISTRICT", size = .7, ymod = .1) + 
    tm_shape(jharkhand_pop) + 
    tm_text("POP", size = .7, ymod = -.2) 

我們得到以下的plot模式: R plot map

0

您需要使用SHP文件,該文件可以使用getData()找到。完整的工作代碼:

library(tidyverse) 
library(broom) 
library(rgdal) 

地理位置數據

geo_data <- structure(list(DISTNAME = c("BOKARO", "CHATRA", "DEOGHAR", "DHANBAD", "DUMKA", "GARHWA", "GIRIDIH", "GODDA", "GUMLA", "HAZARIBAGH", "JAMTARA", "KHUNTI", "KODARMA", "LATEHAR", "LOHARDAGA", "PAKUR", "PALAMU", "PASHCHIMI SINGHBHUM", "PURBI SINGHBHUM", "RAMGARH", "RANCHI", "SAHIBGANJ", "SARAIKELA-KHARSAWAN", "SIMDEGA"), 
         POP = c(521.5, 196.5, 323.8, 445.5, 123, 373.9, 357.6, 248.2, 212.4, 686.7, 626.7, 383.6, 391.9, 141, 436.1, 454.6, 301.3, 325.5, 193.7, 238.3, 208.7, 587.4, 130.1, 268)), 
        .Names = c("DISTNAME", "POP"), 
        row.names = c(NA, 24L), 
        class = "data.frame") 

獲取地圖在geo_data

library(raster) 
IN2 <- getData('GADM', country='IND', level=2) 
IN2 <- spTransform(IN2, CRS("+init=epsg:4326")) 
IN2_map <- tidy(IN2, region = "NAME_2") 

ID降低

geo_data$DISTNAME <- tolower(geo_data$DISTNAME) 


IN2_map %>% 
    mutate(id = tolower(id)) %>% 
    left_join(geo_data, by = c("id" = "DISTNAME")) %>% 
    ggplot() + 
    geom_polygon(aes(long, lat, group=group, fill = POP), color = "black") 
+0

這看起來像朝着正確的方向前進。謝謝。現在我必須弄清楚如何更接近Tableau產生的結果 - 僅僅是區域邊界的狀態(沒有擴展到狀態邊界之外),其中寫入了區域名稱和填充參數值。 – San

+0

提示:'geom_text' –

+0

是的,但'geom_text'只能在修剪掉狀態邊界以外的巨大區域之後應用。目前,想要的部分顯示爲圖像的非常小的區域。應該有一些方法來擴大它。 – San