2012-02-25 41 views
12

Tôi đang cố gắng sử dụng ggplot2 và bản đồ để vẽ tên của các hạt ở bang NY. Cách tiếp cận của tôi là tìm các phương tiện vĩ độ và kinh độ theo quận (tôi cho rằng đây là trung tâm của quận nhưng điều này có thể là suy nghĩ sai lầm) và sau đó sử dụng geom_text để vẽ các tên trên bản đồ. Nó không hoạt động như tôi dự đoán vì nó âm mưu nhiều tên cho mỗi hạt.tên trung tâm ggplot trên bản đồ

Kết quả tôi đang tìm kiếm là trung tâm của mỗi văn bản (hạt) là trung tâm của hạt tương ứng của nó.

Ngoài việc giải quyết vấn đề, tôi đánh giá cao việc giúp đỡ để hiểu những gì sai với suy nghĩ của tôi với ggplot.

Cảm ơn bạn trước.

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 

Trả lời

24

Vì bạn đang tạo ra hai lớp (một cho đa giác và thứ hai cho các nhãn), bạn cần phải xác định nguồn dữ liệu và lập bản đồ một cách chính xác cho mỗi lớp:

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) 

Lưu ý:

  • longlat xảy ra trong cả hai khung dữ liệu, bạn có thể sử dụng aes(long, lat) trong cuộc gọi đầu tiên tới ggplot. Bất kỳ ánh xạ nào bạn khai báo ở đây đều có sẵn cho tất cả các lớp.
  • Vì lý do tương tự, bạn cần khai báo aes(group=group) bên trong lớp đa giác.
  • Trong lớp văn bản, bạn cần di chuyển nguồn dữ liệu bên ngoài aes.

Một khi bạn đã làm điều đó, và âm mưu bản đồ, bạn sẽ nhận ra rằng trung điểm là xấp xỉ tốt hơn bằng giá trị trung bình của range, và sử dụng một hệ thống bản đồ tôn trọng tỷ lệ khía cạnh và chiếu phối hợp:

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

Tôi nghĩ bạn đã làm những gì tôi hỏi và hơn thế nữa. Vì vậy, tôi đánh dấu chủ đề này là đã được giải quyết. Cảm ơn bạn. Tôi vẫn không hài lòng với việc đặt tên của các tên và bây giờ nhận ra rằng tôi cần một cách tiếp cận tốt hơn để tập trung. Cách tiếp cận của Justin có vẻ thú vị. Tôi sẽ đăng một câu hỏi khác về một số kỹ thuật định tâm được cải thiện. –

+0

Thậm chí tốt hơn cho điểm giữa là chức năng trung tâm trong gói địa tầng. Đây là những gì tôi đã làm thay vì chức năng tổng hợp trong câu trả lời này: 'cnames <- ddply (ia_pop,.(Quận, nhóm), tóm tắt, Centroid = centroid (cbind (dài, lat))) ' và sau đó tách ra khỏi cột Centroid như sau: ' cnames $ long <- cnames $ Centroid [, 1] ' và 'cnames $ lat <- cnames $ Centroid [, 2]' – Danny

0

Nó có vẻ như trung tâm km sẽ hữu ích ... Đây là một khởi đầu tồi tệ ... muộn của nó!

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

Đừng nhìn vào nó ... nó ghê gớm! – Justin

4

tôi biết đây là một câu hỏi cũ đó là được trả lời, nhưng tôi muốn để thêm video này trong trường hợp bất cứ ai trông vào đây để giúp đỡ trong tương lai.

Gói bản đồ có chức năng map.text, sử dụng các trung tâm đa giác để đặt nhãn. Nhìn vào mã của nó, người ta có thể thấy rằng nó sử dụng các hàm apply.polygoncentroid.polygon để tìm các centroid. Các chức năng này không hiển thị khi gói được tải, nhưng vẫn có thể được truy cập:

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

Sẽ hữu ích hơn một chút nếu mã bao gồm dòng cho 'p' là gì. Ngoài ra tôi nhận được một lỗi khi nó cố gắng thêm 'p + plabels':' Lỗi trong eval (expr, envir, enclos): đối tượng 'nhóm' không tìm thấy ' –

+1

@ henry-e Thay đổi được thực hiện, mặc dù dài quá hạn trên của tôi phần. –

Các vấn đề liên quan