2016-03-17 32 views
10

Tôi đã tìm thấy câu trả lời tương tự cho các câu hỏi như thế này, nhưng hầu hết trong số họ đang sử dụng gói rworldmap, ggmap, ggsubplot hoặc geom_subplot2d. Xem ví dụ here hoặc here.Cách vẽ sơ đồ trên bản đồ ggplot2

Tôi muốn biết làm cách nào tôi có thể vẽ các đối tượng ggplot khác như biểu đồ thanh trên bản đồ, được tạo từ shapefile. Người tôi đang sử dụng có thể được tải xuống here.

EDIT

Như @beetroot một cách chính xác chỉ ra, các tập tin mới mà có thể được tải về dưới liên kết được đăng trên đã thay đổi đáng kể. Do đó, tên của shapefile vv được điều chỉnh.

library(rgdal) 
library(ggplot2) 
library(rgeos) 
library(maptools) 

map.det<- readOGR(dsn="<path to your directory>/swissBOUNDARIES3D100216/swissBOUNDARIES3D/V200/SHAPEFILE_LV03", layer="VECTOR200_KANTONSGEBIET") 
map.kt <- map.det[[email protected]$KANTONSNUM=="CH01000000"|[email protected]$KANTONSNUM=="CH19000000",] 


#get centroids 
map.test.centroids <- gCentroid(map.kt, byid=T) 
map.test.centroids <- as.data.frame(map.test.centroids) 
map.test.centroids$KANTONSNR <- row.names(map.test.centroids) 

#create df for ggplot 
kt_geom <- fortify(map.kt, region="KANTONSNUM") 

#Plot map 
map.test <- ggplot(NULL)+ 
     geom_polygon(data=kt_geom, aes(long, lat, group=group), fill="white")+ 
     coord_fixed()+ 
     geom_path(data=kt_geom, color="gray48", mapping=aes(long, lat, group=group), size=0.2)+ 
     geom_point(data=map.test.centroids, aes(x=x, y=y), size=9, alpha=6/10) 

mapp 

Kết quả này trong một bản đồ như vậy. Càng xa càng tốt. enter image description here

Tuy nhiên, tôi đang gặp khó khăn kết hợp hai lô như bản đồ map.test và, ví dụ, điều này một:

geo_data <- data.frame(who=rep(c(1:2), each=2), 
        value=as.numeric(sample(1:100, 4, replace=T)), 
        KANTONSNR=rep(c(1,19), 2)) 

bar.testplot <- ggplot()+ 
    geom_bar(data=geo_data, aes(factor(id),value,group=who),position='dodge',stat='identity') 

Các barcharts nên nằm ở trung tâm của hai đa giác, tức là nơi hai điểm là. Tôi có thể sản xuất các barcharts và vẽ chúng trên bản đồ một cách riêng biệt, nếu điều đó làm cho mọi thứ dễ dàng hơn.

+0

vậy tại sao không 'ggsubplot' không làm việc cho bạn như trong ví dụ bạn đề cập đến? –

+1

@DavidH Dường như gói đã bị xóa khỏi kho lưu trữ CRAN. – Thomas

+0

Mặc dù vậy vẫn còn trên [github] (https://github.com/garrettgman/ggsubplot). Bạn không chắc nó có hoạt động hay không sau tất cả các thay đổi gần đây trong 'ggplot2'. – Axeman

Trả lời

8

Tôi đã sửa đổi một chút mã của bạn để làm ví dụ minh họa hơn. Tôi đang âm mưu không chỉ 2 kantons, nhưng 47.

library(rgdal) 
library(ggplot2) 
library(rgeos) 
library(maptools) 
library(grid) 
library(gridExtra) 

map.det<- readOGR(dsn="c:/swissBOUNDARIES3D/V200/SHAPEFILE_LV03", layer="VECTOR200_KANTONSGEBIET") 
map.kt <- map.det[map.det$ICC=="CH" & (map.det$OBJECTID %in% c(1:73)),] 

# Merge polygons by ID 
map.test <- unionSpatialPolygons(map.kt, [email protected]$OBJECTID) 

#get centroids 
map.test.centroids <- gCentroid(map.test, byid=T) 
map.test.centroids <- as.data.frame(map.test.centroids) 
map.test.centroids$OBJECTID <- row.names(map.test.centroids) 

#create df for ggplot 
kt_geom <- fortify(map.kt, region="OBJECTID") 

#Plot map 
map.test <- ggplot(kt_geom)+ 
    geom_polygon(aes(long, lat, group=group), fill="white")+ 
    coord_fixed()+ 
    geom_path(color="gray48", mapping=aes(long, lat, group=group), size=0.2)+ 
    geom_point(data=map.test.centroids, aes(x=x, y=y), size=2, alpha=6/10) 

map.test 

initial plot

Hãy tạo dữ liệu cho barplots.

set.seed(1) 
geo_data <- data.frame(who=rep(c(1:length(map.kt$OBJECTID)), each=2), 
         value=as.numeric(sample(1:100, length(map.kt$OBJECTID)*2, replace=T)), 
         id=rep(c(1:length(map.kt$OBJECTID)), 2)) 

Bây giờ, hãy tạo 47 ô thanh ở giữa điểm sau đó.

bar.testplot_list <- 
    lapply(1:length(map.kt$OBJECTID), function(i) { 
    gt_plot <- ggplotGrob(
     ggplot(geo_data[geo_data$id == i,])+ 
     geom_bar(aes(factor(id),value,group=who), fill = rainbow(length(map.kt$OBJECTID))[i], 
       position='dodge',stat='identity', color = "black") + 
     labs(x = NULL, y = NULL) + 
     theme(legend.position = "none", rect = element_blank(), 
       line = element_blank(), text = element_blank()) 
    ) 
    panel_coords <- gt_plot$layout[gt_plot$layout$name == "panel",] 
    gt_plot[panel_coords$t:panel_coords$b, panel_coords$l:panel_coords$r] 
    }) 

Ở đây chúng ta chuyển đổi ggplot s vào gtable s và sau đó cắt chúng chỉ có tấm của mỗi barplot. Bạn có thể sửa đổi mã này để giữ tỷ lệ, thêm chú thích, tiêu đề, v.v.

Chúng tôi có thể thêm thanh này vào bản đồ ban đầu với sự trợ giúp của annotation_custom.

bar_annotation_list <- lapply(1:length(map.kt$OBJECTID), function(i) 
    annotation_custom(bar.testplot_list[[i]], 
        xmin = map.test.centroids$x[map.test.centroids$OBJECTID == as.character(map.kt$OBJECTID[i])] - 5e3, 
        xmax = map.test.centroids$x[map.test.centroids$OBJECTID == as.character(map.kt$OBJECTID[i])] + 5e3, 
        ymin = map.test.centroids$y[map.test.centroids$OBJECTID == as.character(map.kt$OBJECTID[i])] - 5e3, 
        ymax = map.test.centroids$y[map.test.centroids$OBJECTID == as.character(map.kt$OBJECTID[i])] + 5e3)) 

result_plot <- Reduce(`+`, bar_annotation_list, map.test) 

enter image description here

+0

Điều này thật tuyệt! Cảm ơn. Một câu hỏi: Có cách nào để kiểm soát kích thước của các ô? Trong trường hợp của tôi, chúng gần như không hiển thị trên bản đồ ... –

+1

+/- 5e3 ở cuối mỗi dòng bên trong 'chú thích tùy chỉnh 'xác định kích thước, cố gắng làm cho nó không phải là 5 nhưng 20 hoặc 50 nghìn - phụ thuộc vào các trục 'x' và' y' của bạn dao động – inscaven

+0

Hoạt động tuyệt vời! Cảm ơn!! –

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