2012-02-25 20 views
12

我正在嘗試使用ggplot2和地圖來繪製紐約州的縣名。我的方法是找到縣的經緯度方法(我認爲這是縣的中心,但這可能是錯誤的想法),然後使用geom_text來繪製地圖上的名稱。這並不像我預計的那樣,因爲它正在繪製每縣的多個名字。ggplot居中在地圖上的名字

我要找的結果是每個文本(縣)的中心位於各自縣的中心。

除了解決這個問題,我很希望幫助理解我的想法與ggplot有什麼問題。

預先感謝您。

library(ggplot2); library(maps) 

county_df <- map_data('county') #mappings of counties by state 
ny <- subset(county_df, region=="new york") #subset just for NYS 
ny$county <- ny$subregion 
cnames <- aggregate(cbind(long, lat) ~ subregion, data=ny, FUN=mean) 

p <- ggplot(ny, aes(long, lat, group=group)) + geom_polygon(colour='black', fill=NA) 
p #p of course plots as expected 

#now add some county names (3 wrong attempts) 
p + geom_text(aes(long, lat, data = cnames, label = subregion, size=.5)) #not correct 

#I said maybe I'm confusing it with the same names for different data sets 
names(cnames) <-c('sr', 'Lo', 'La') 
p + geom_text(Lo, La, data = cnames, label = sr, aes(size=.5)) #attempt 2 
p + geom_text(aes(Lo, La, data = cnames, label = sr, size=.5)) #attempt 3 

回答

24

因爲要創建兩個層(一個用於多邊形和所述第二對的標記物),則需要正確地指定數據源和映射爲每個層:

ggplot(ny, aes(long, lat)) + 
    geom_polygon(aes(group=group), colour='black', fill=NA) + 
    geom_text(data=cnames, aes(long, lat, label = subregion), size=2) 

注:

  • 由於longlat出現在兩個數據幀中,所以可以在第一次調用ggplot時使用aes(long, lat)。您在此聲明的任何映射都可用於所有圖層。
  • 出於同樣的原因,您需要在多邊形圖層中聲明aes(group=group)
  • 在文本層中,您需要將數據源移動到aes之外。

一旦你做到了這一點,並在地圖繪製,你會認識到中點通過更好的range平均近似,使用地圖的座標系,尊重寬高比和投影:

cnames <- aggregate(cbind(long, lat) ~ subregion, data=ny, 
        FUN=function(x)mean(range(x))) 

ggplot(ny, aes(long, lat)) + 
    geom_polygon(aes(group=group), colour='black', fill=NA) + 
    geom_text(data=cnames, aes(long, lat, label = subregion), size=2) + 
    coord_map() 

enter image description here

+0

我想你已經做了我所問及的更多​​。所以我把這個線索標記爲已解決。謝謝。我對名稱的位置仍然不滿意,現在意識到我需要一種更好的對中方法。賈斯汀的方法看起來很有趣。我將在一些改進的定心技術上發佈另一個問題。 – 2012-02-25 05:37:35

+0

中點更好的是地圈包中的質心函數。下面是我做的,而不是在這個答案中的聚合函數: 'cnames < - ddply(ia_pop,。(縣,組),總結,質心=質心(cbind(long,lat)))' ,然後像這樣拆分出Centroid列: 'cnames $ long < - cnames $ Centroid [,1]' 和 'cnames $ lat < - cnames $ Centroid [,2]' – Danny 2018-03-02 19:20:42

0

它似乎kmeans中心將是有用的...這是一個糟糕的開始......它的晚!

center.points <- ddply(ny, .(group), function(df) kmeans(df[,1:2], centers=1)$centers)  
center.points$county <- ny$county[ny$group == center.points$group] 
p + geom_text(data=center.points, aes(x=V1, y=V2, label=county)) 
+1

不要看它......它的可怕! – Justin 2012-02-25 05:27:10

4

我知道這是一個已經回答了一個老問題,但我想添加這個萬一有人在這裏尋找對未來的幫助。

maps包具有map.text函數,該函數使用多邊形質心來放置標籤。查看其代碼,可以看到它使用apply.polygoncentroid.polygon函數來查找質心。這些功能在包裝加載時不可見,但仍然可以訪問:

library(ggplot2); library(maps) 

county_df <- map_data('county') #mappings of counties by state 
ny <- subset(county_df, region=="new york") #subset just for NYS 
ny$county <- ny$subregion 
cnames <- aggregate(cbind(long, lat) ~ subregion, data=ny, FUN=mean) 

# Use the map function to get the polygon data, then find the centroids 
county_poly <- map("county", "new york", plot=FALSE, fill = TRUE) 
county_centroids <- maps:::apply.polygon(county_poly, maps:::centroid.polygon) 

# Create a data frame for graphing out of the centroids of each polygon 
# with a non-missing name, since these are the major county polygons. 
county_centroids <- county_centroids[!is.na(names(county_centroids))] 
centroid_array <- Reduce(rbind, county_centroids) 
dimnames(centroid_array) <- list(gsub("[^,]*,", "", names(county_centroids)), 
           c("long", "lat")) 
label_df <- as.data.frame(centroid_array) 
label_df$county <- rownames(label_df) 

p <- ggplot(ny, aes(long, lat, group=group)) + geom_polygon(colour='black', fill=NA) 

plabels <- geom_text(data=label_df, aes(label=county, group=county)) 
p + plabels 
+0

如果代碼包含「p」所在的行,它會稍微有點幫助。另外,當我嘗試添加'p + plabels'時出現錯誤:'在eval(expr,envir,enclos)中出錯:找不到對象'組'' – 2016-01-26 08:58:50

+1

@ henry -e儘管很久以前部分。 – 2016-06-06 20:16:24