2014-02-27 44 views
5

我知道這個問題已經被回答elsewhere已經。我試圖按照@jlhoward的指示,但顯然我的技能太有限了。我可以再問你的幫助,R社區嗎?R ggplot2合併shapefile和csv數據以填充多邊形 - 具體

這是我有:

一種瑞士shape文件:Link

和相應的CSV文件各市的名字,以及他們的拉鍊碼:Link

數據的網站:cadastre.ch

上次投票的其他數據:Direct link, excel-file

我通過合併將一列添加到CSV文件(wow.csv)(我想說明的數據)。該文件現在看起來是這樣的:

Gemeinden code Ja.Anteil Ortschaft  PLZ Zusatzziffer Kantonskürzel E N 
1 Aadorf 4551 78.78638 Aawangen  8522 2   TG   710206 263564 
2 Aadorf 4551 78.78638 Ettenhausen TG 8356 0   TG   710129 259411 
3 Aadorf 4551 78.78638 Aadorf   8355 0   TG   710588 261648 
4 Aadorf 4551 78.78638 Guntershausen 8357 0   TG   711741 258934 
5 Aadorf 4551 78.78638 Wittenwil  9547 0   TG   712002 262572 

後來我試圖按照@jlhoward的指令:

  1. 進口溫度數據文件
  2. 進口多邊形直轄市shape文件
  3. 轉換muni多邊形繪製數據幀
  4. 加入從[email protected]ch12.df的列
  5. 加入列從wowch12.df
  6. 讓劇情

我用下面的代碼試了一下:

require("rgdal") 
require("maptools") 
require("ggplot2") 
require("plyr") 

# read share data and the file from cadastre.ch (zip-codes) 
asyl <- <- read.csv("~/FS14-1/PLZO_SHP_LV03/Asylgesetz_csv.csv", sep=";") 
mydata1 <- read.table("~/FS14-1/PLZO_SHP_LV03/PLZO_CSV_LV03.csv", sep=";", quote="\"") 

#merge the two files 
wow <- merge(x = asyl, y = mydata1, by = "Gemeinden", all = TRUE) 

# read municipality polygons 
ch12 <- readOGR(work.dir, layer = "PLZO_PLZ") 

# fortify and merge: muni.df is used in ggplot 
[email protected]$id <- rownames([email protected]) 
ch12.df <- fortify(ch12) 
ch12.df <- join(ch12.df, [email protected], by="id") 
ch12.df <- merge(ch12.df, wow, by="PLZ", all.x=T, a..ly=F) 

#create the map layers 
gp <- ggplot(data=ch12.df, aes(x=long, y=lat, group=group)) + 
     geom_polygon(aes(group = group))+   # draw polygons 
     geom_path(color="grey", linestyle=2)+ # draw boundaries 
     coord_equal() + 
     scale_fill_gradient(low = "#ffffcc", high = "#ff4444", 
          space = "Lab", na.value = "grey50", 
          guide = "colourbar")+ 
     labs(title="Zustimmung auf Gemeindelevel") 
gp 

好,直到最後一步,R工作(到目前爲止我可以告訴)但如果​​我嘗試創建ggplot,則不會出現錯誤,並且R會以某種方式終止。我想要實現的是根據數據控制多邊形的顏色(在我的城市中)...

任何人都可以幫助我嗎?

+0

[R ggplot2合併shapefile和csv數據以填充多邊形]的可能重複(http://stackoverflow.com/questions/19791210/r-ggplot2-merge-with-shapefile-and-csv-data-to-填充多邊形) – zx8754

+0

是的,這正是我第一次表明的。但不幸的是,我無法用jlhoward的解釋來實現... :-( – Thomas

+0

)如果您可以添加更多關於系統的細節:'sessionInfo()',那麼也會嘗試一點一點地運行'ggplot'。 – zx8754

回答

6

這是有點不清楚你想要做什麼,所以我需要做一些假設。

  1. 您的Excel文件在Gemeinden(市政府)針對大規模移民的國家倡議中有臨時投票結果。所以我假設你想要顯示一個等值線圖,例如%YES。在下面的內容中,我通過提取包含實際投票結果(第13 - 2365行)的2353行,添加頭(從第11行開始)以及保存爲vote.csv來清理Excel文件。列Ja in %更名爲Yes.Pct
  2. 你的shapefile被組織(或多或少)通過郵政編碼(PLZ)。這會產生巨大的問題,這是由於後面解釋的各種原因。所以我在Google上探索了一下,幾乎立即發現了一個由市政當局組織的shapefile Swiss Federal Office of Topography。您必須「訂購」該文件,here,但它是免費的 - 所以基本上所有您需要做的就是註冊,並通過電子郵件向您發送文件鏈接。我使用的特定文件集是從地形辦公室文件的VEC200_Commune.*
  3. 一個優點是它具有本市數(大致相當於美國聯邦政府採用FIPS代碼)。您的Excel文件也具有這些編號(在Excel文件中稱爲Gemeinde-Nr.,在shapefile中稱爲BFSNR)。基於這些id匹配比嘗試使用名稱匹配更可靠。

所以把所有這些組合起來產生如下圖: 從這個代碼:

library(plyr) # for join(...) 
library(rgdal) # for readOGR(...) 
library(ggplot2) 

setwd("< directory with all files >") 
votes <- read.csv("vote.csv") 
map <- readOGR(dsn=".",layer="VEC200_Commune") 
map <- map[map$COUNTRY=="CH",] # extract just Swiss Gemeinde 

data <- data.frame(id=rownames([email protected]), 
        [email protected]$GEMNAME, 
        [email protected]$BFSNR) 
# convert id to char from factor 
data$id <- as.character(data$id) 
# merge vote data based on Gemeinden (different columns names in the two df...) 
data <- merge(data,votes,by.x="BFSNR",by.y="Gemeinde.Nr.", all.x=T) 

map.df <- fortify(map) 
map.df <- join(map.df,data,by="id") 
ggplot(map.df, aes(long,lat, group=group))+ 
    geom_polygon(aes(fill=Yes.Pct))+ 
    coord_fixed()+ 
    scale_fill_gradient(low = "#ffffcc", high = "#ff4444", 
         space = "Lab", na.value = "grey80", 
         guide = "colourbar")+ 
    labs(title="Zustimmung auf Gemeindelevel", x="", y="")+ 
    theme(axis.text=element_blank(),axis.ticks=element_blank()) 

有可能使用你的shape文件(基於郵政編碼),但是這增加了複雜性和可不可靠。有幾個原因:

  1. 您的shapefile有4175個多邊形,但只有3201個唯一的郵政編碼。這意味着許多PLZ是重複的(或更糟糕的)。您的PLZO_CSV_LV03.csv也是如此:PLZ不是唯一的。在PLZ上合併時,這是一個問題。考慮一個例子,您將基於公共列PLZ合併兩個數據框X和Y.如果X具有給定的PLZ的5行,並且Y具有3個具有相同PLZ的行,則結果將具有該PLZ的15行。
  2. 事實證明,合併 PLZ和Zusatzziffer改善了情況,但並沒有完全消除重複(即,即使考慮到PLC和Zusatzziffer的組合,有一些重複)。
  3. 沒有包含PLZ的文件有Gemeinde-Nr.,所以唯一的選擇是合併基於Gemeindename的投票數據。這是有風險的,因爲在不同的來源中名稱通常不會完全相同。
  4. PLZ shapefile非常大,部分原因是由於多邊形的數量(4175),部分是由於空間分辨率(例如每個多邊形有更多的點)。結果,fortify(...)非常慢,甚至渲染地圖本身也很慢。這可能是你的R會話崩潰的原因。

考慮到所有這些警告,有可能產生如下圖,使用PLZ-級shape文件: 與此代碼:

votes <- read.csv("vote.csv") 
zipcodes <- read.csv(sep=";","PLZO_CSV_LV03.csv") 
ch12 <- readOGR(dsn=".",layer="PLZO_PLZ") 
# associate id, PLZ, and Zusatzziffer 
data <- data.frame(id=rownames([email protected]), 
        [email protected]$PLZ, 
        [email protected]$ZUSZIFF) 
# convert id to char from factor 
data$id <- as.character(data$id) 
# need to merge based on PLZ *and* Zusatzziffer 
data <- merge(data,zipcodes[2:4],by=c("PLZ","Zusatzziffer"), all.x=T) 
# merge vote data based on Gemeinden (different columns names in the two df...) 
data <- merge(data,votes,by.x="Gemeindename",by.y="Gemeinden", all.x=T) 

ch12.df <- fortify(ch12) 
# join data to ch12.df based in id 
ch12.df <- join(ch12.df, data, by="id") 

gp <- ggplot(data=ch12.df, aes(x=long, y=lat, group=group)) + 
    geom_polygon(aes(fill = Yes.Pct))+ # draw polygons 
    coord_equal() + 
    scale_fill_gradient(low = "#ffffcc", high = "#ff4444", 
         space = "Lab", na.value = "grey80", 
         guide = "colourbar")+ 
    labs(title="Zustimmung auf Gemeindelevel", x="", y="")+ 
    theme(axis.text=element_blank(),axis.ticks=element_blank()) 
gp 

注意,兩張地圖都差不多,但不完全一樣。我傾向於相信第一個,因爲它使用了Gemeine Nr。而不是名稱,因爲它涉及更少的合併。

+0

這只是完美!謝謝[jlhoward](http://stackoverflow.com/users/2985007/jlhoward) – Thomas