2012-02-25 24 views
13

Sớm tôi đã đăng câu hỏi về cách vẽ tên các quận trên bản đồ bằng ggplot và bản đồ được tìm thấy HERE. Cách tiếp cận đầu tiên của tôi là lấy các phương tiện của tất cả các tọa độ vĩ độ và độ dài trên mỗi hạt như được thấy ở đây: enter image description hereCải thiện tên trung tâm quận ggplot & bản đồ

Rất may Andrie có 2 đề xuất để cải thiện việc căn giữa bằng cách sử dụng một phạm vi và sau đó là coord_map() { để giữ tỷ lệ khung hình chính xác}. Điều này cho thấy sự tập trung nhiều như được thấy ở đây: enter image description here

Tôi nghĩ rằng điều này có vẻ tốt hơn nhưng vẫn gặp một số khó khăn với các vấn đề trùng lặp. Tôi hy vọng sẽ tiếp tục cải thiện việc định tâm (Trong cùng một chủ đề đó, Justin đã đề xuất phương pháp tiếp cận km). Tôi ok với văn bản luân phiên nếu cần thiết nhưng tôi hy vọng cho các tên được căn giữa và xoay vòng nếu cần thiết (chúng mở rộng ra ngoài biên giới hạt) để hiển thị tốt nhất tên quận trên bản đồ.

Bất kỳ ý tưởng nào?

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 
p <- ggplot(ny, aes(long, lat, group=group)) + geom_polygon(colour='black', fill=NA) 

#my first approach to centering 
cnames <- aggregate(cbind(long, lat) ~ subregion, data=ny, FUN=mean) 
ggplot(ny, aes(long, lat)) + 
    geom_polygon(aes(group=group), colour='black', fill=NA) + 
    geom_text(data=cnames, aes(long, lat, label = subregion), size=3) 

#Andrie's much improved approach to centering 
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=3) + 
    coord_map() 

Trả lời

8

Như tôi đã làm việc này ra đêm qua qua tại Thống kê Talk (link), nó thực sự khá dễ dàng (như là một sản phẩm của giờ tôi đã dành vào buổi sáng sớm!) Nếu bạn sử dụng các gói không gian R (sp) . Tôi đã thử nghiệm một số chức năng khác của chúng để tạo đối tượng SpatialPolygons mà bạn có thể sử dụng tọa độ để trả về một trung tâm đa giác. Tôi chỉ làm điều đó cho một quận, nhưng điểm nhãn của đối tượng Đa giác (S4) khớp với trọng tâm. Giả sử điều này là đúng, thì điểm nhãn của đối tượng Đa giác là centroids. Tôi sử dụng quá trình nhỏ này để tạo ra một khung dữ liệu của centroids và sử dụng chúng để vẽ trên bản đồ.

library(ggplot2) # For map_data. It's just a wrapper; should just use maps. 
library(sp) 
library(maps) 
getLabelPoint <- # Returns a county-named list of label points 
function(county) {Polygon(county[c('long', 'lat')])@labpt} 

df <- map_data('county', 'new york')     # NY region county data 
centroids <- by(df, df$subregion, getLabelPoint)  # Returns list 
centroids <- do.call("rbind.data.frame", centroids) # Convert to Data Frame 
names(centroids) <- c('long', 'lat')     # Appropriate Header 

map('county', 'new york') 
text(centroids$long, centroids$lat, rownames(centroids), offset=0, cex=0.4) 

Điều này sẽ không hoạt động tốt cho mọi đa giác. Thông thường quá trình ghi nhãn và chú thích trong GIS yêu cầu bạn điều chỉnh nhãn và chú thích cho những trường hợp đặc biệt không phù hợp với cách tiếp cận tự động (có hệ thống) mà bạn muốn sử dụng. Cách tiếp cận code-look-recode mà chúng ta sẽ thực hiện cho việc này không phải là apt. Tốt hơn để bao gồm một kiểm tra rằng một nhãn của một kích thước nhất định cho cốt truyện nhất định sẽ phù hợp trong đa giác; nếu không, hãy xóa nó khỏi bản ghi nhãn văn bản và chèn thủ công sau này để phù hợp với tình huống - ví dụ:, thêm dòng tiêu đề và chú thích ở bên cạnh đa giác hoặc xoay ngang nhãn như được hiển thị ở nơi khác.

+0

Điều này cải thiện định tâm hơn nữa nhưng khi bạn chỉ ra một số điều chỉnh tốt sẽ phải xoắn và quay, kéo và chọc (cũng có thể không chọc nhưng ...). Tôi nghĩ đây là câu trả lời tôi đang tìm kiếm. –

+1

Để biết thêm thông tin về định vị điểm (một hàm định vị cho ggplot), hãy xem [HERE] (http://stackoverflow.com/questions/9450873/locator-equivalent-in-ggplot2-for-maps). Chức năng này từ David Kahle cho phép bạn tạo một khung dữ liệu của các điểm được nhấp để thao tác dễ dàng các nhãn hạt thông qua các phương pháp tôi mô tả ở trên. –

0

Bạn có thể xem gói directlabels, điều này cung cấp vị trí nhãn tự động bằng cách sử dụng một số thuật toán tránh trùng lặp. Tôi không chắc chắn nếu nó có thể được sử dụng để giải quyết vấn đề của bạn, nhưng bạn có thể có một cái nhìn.

+0

Tôi đã phát các nhãn trực tiếp cho vấn đề này và không thấy cách áp dụng nó. 'directlabels' dường như làm việc với một huyền thoại (như là một thay thế) –

+0

Ok, quá tệ nó không hoạt động. –

1

Tôi nghĩ rằng câu trả lời dễ nhất cho câu hỏi này là Andrie đã giải quyết phần lớn công việc tay. Phần còn lại cần phải được hoàn thành với một số ol 'điều chỉnh và xem phương pháp tốt. Khi bạn nhìn vào cốt truyện sau đề nghị của Andrie, phần lớn mọi thứ đều tốt với ngoại lệ của một số vị trí pesky có thể được cải thiện với thay đổi lat/long hoặc xoay vòng. Tôi có một ví dụ cho suffolk (dưới cùng bên phải) và herkimer (center) như vị trí của suffolk có thể được cải thiện thông qua một lat/long điều chỉnh và herkimer thông qua một vòng quay.

Trước: Before

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

cnames[52, 2:3] <- c(-73, 40.855) #adjust the long and lat of poorly centered names 
cnames$angle <- rep(0, nrow(cnames)) #create an angle column 
cnames[22, 4] <- -90 #adjust the angle of atypically shaped 

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

này cho chúng ta: enter image description here

Trừ khi ai đó có một cách tốt hơn tôi sẽ đánh dấu câu trả lời này là đúng.

0

PAL labeling library dường như thực hiện chính xác những gì bạn đang tìm kiếm, tự động. ảnh chụp màn hình này được lấy từ trang web của họ:

PAL website screenshot

tôi đã không tìm thấy một giao diện R cho nó, mặc dù. Các quick guide to perform your own integration of PAL within your favourite GIS application cho thấy rằng hội nhập chính nó nên được doable. Tuy nhiên, trong bối cảnh ggplot2 điều này có nghĩa là vị trí nhãn phải được thực hiện trong khi hiển thị - tôi không biết liệu điều này có thể thực hiện được hay phải làm gì để đạt được điều này.

+0

Điều này có vẻ đầy hứa hẹn. Cám ơn vì đã chia sẻ. Nếu ai đó tạo ra và gói R giao diện theo cách hợp lý thì bạn có một gói rất hữu ích (mặc dù điều này vượt quá mức kỹ năng hiện tại của tôi). –

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