2012-03-04 31 views
21

Tôi muốn vẽ bản đồ thế giới bằng ggplot2 (v.9) kết hợp hai phần nếu thông tin. Ví dụ sau minh họa:bản đồ ggplot với l

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

# Data from http://thematicmapping.org/downloads/world_borders.php. 
# Direct link: http://thematicmapping.org/downloads/TM_WORLD_BORDERS_SIMPL-0.3.zip 
# Unpack and put the files in a dir 'data' 

gpclibPermit() 
world.map <- readOGR(dsn="data", layer="TM_WORLD_BORDERS_SIMPL-0.3") 
world.ggmap <- fortify(world.map, region = "NAME") 

n <- length(unique(world.ggmap$id)) 
df <- data.frame(id = unique(world.ggmap$id), 
       growth = 4*runif(n), 
       category = factor(sample(1:5, n, replace=T))) 

## noise 
df[c(sample(1:100,40)),c("growth", "category")] <- NA 


ggplot(df, aes(map_id = id)) + 
    geom_map(aes(fill = growth, color = category), map =world.ggmap) + 
    expand_limits(x = world.ggmap$long, y = world.ggmap$lat) + 
    scale_fill_gradient(low = "red", high = "blue", guide = "colorbar") 

Tuy nhiên, giải pháp này không phải là một cách tốt đẹp để hiển thị cả growthcategory. Growth rất dễ thấy, nhưng category hầu như không thể nhìn thấy vì nó chỉ là một đường viền.

Tôi đã cố gắng tăng kích thước đường viền nhưng không may mắn (geom_map mới khó làm việc). Có ai biết làm thế nào để tăng kích thước biên giới trong ví dụ trên, hoặc thậm chí tốt hơn, một cơ chế để hiển thị hai yếu tố?

Câu hỏi tiền thưởng: tên quốc gia, chẳng hạn như tên được sử dụng bởi gói bản đồ (có tính năng USSR!) Là dữ liệu được sử dụng trong ví dụ này là mong manh. Tôi thích sử dụng ISO 3166-1 alpha-3 (1). Có ai biết dữ liệu dễ dàng sử dụng với các tính năng mà ggplot2 tên ISO -... nước (bao gồm trong dữ liệu được liên kết)

Kết quả:

result http://ompldr.org/vY3hsYQ

+0

what is world.map? nó không được định nghĩa trong mã của bạn. Nếu tôi cố gắng củng cố (w, region = "NAME"), tôi nhận được lỗi 'multibyte character' không hợp lệ. Vui lòng cung cấp mã có thể tái sản xuất. –

+0

Xin lỗi, đã sửa. Đó là w. – Rasmus

+0

Tôi nhận được lỗi sau trên dòng củng cố: "Lỗi trong nchar (ID): chuỗi multibyte không hợp lệ 1" –

Trả lời

12

Tôi sẽ sử dụng dải màu sắc khác nhau cho điền và màu đường :

ggplot(df, aes(map_id = id)) + 
    geom_map(aes(fill = growth, color = category), map =world.ggmap) + 
    expand_limits(x = world.ggmap$long, y = world.ggmap$lat) + 
    scale_fill_gradient(high = "red", low = "white", guide = "colorbar") + 
    scale_colour_hue(h = c(120, 240)) 

enter image description here

OR, sử dụng điền cho thể loại và tính minh bạch cho mức tăng trưởng.

ggplot(df, aes(map_id = id)) + 
    geom_map(aes(alpha = growth, fill = category), map =world.ggmap) + 
    expand_limits(x = world.ggmap$long, y = world.ggmap$lat) + 
    scale_alpha(range = c(0.2, 1), na.value = 1) 

enter image description here

Nó phụ thuộc vào những gì bạn muốn hiển thị.

Chỉ trong trường hợp, đây là cách để thay đổi linesize:

ggplot(df, aes(map_id = id)) + 
geom_map(aes(fill = growth, color = category, size = factor(1)), map =world.ggmap) + 
expand_limits(x = world.ggmap$long, y = world.ggmap$lat) + 
scale_fill_gradient(high = "red", low = "white", guide = "colorbar") + 
scale_colour_hue(h = c(120, 240)) + 
scale_size_manual(values = 2, guide = FALSE) 

enter image description here

Đây là HSV phiên bản:

df$hue <- ifelse(is.na(df$category), 0, as.numeric(df$category)/max(as.numeric(df$category), na.rm=T)) 
df$sat <- ifelse(is.na(df$growth), 0, df$growth/max(df$growth, na.rm=T)) 
df$fill <- ifelse(is.na(df$category), "grey50", hsv(df$hue, df$sat)) 

ggplot(df, aes(map_id = id)) + 
geom_map(aes(fill = fill), map =world.ggmap) + 
expand_limits(x = world.ggmap$long, y = world.ggmap$lat) + 
scale_fill_identity(guide = "none") 

enter image description here

+1

Cảm ơn! Vấn đề là nhận được dòng chữ 'đủ dày' để được chú ý, ngay cả khi đồ họa được in nhỏ. – Rasmus

+1

Tôi nghĩ bạn đang hỏi quá nhiều. Tôi không nghĩ rằng nó có thể hiển thị rất nhiều thông tin với một tờ giấy nhỏ. – kohske

+0

Bạn có thể tìm cách để thay đổi dòng, nhưng thực sự tôi không nghĩ rằng điều này là hữu ích ... – kohske

7

Một lựa chọn là sự tăng trưởng bản đồ với kích thước của một số điểm được vẽ ở trọng tâm của đa giác.

centroids <- as.data.frame(coordinates(world.map)) 
df <- data.frame(df,centroids) 

choropleth <-ggplot() + 
    geom_map(aes(fill = category, map_id = id),data = df, map =world.ggmap) + 
    expand_limits(x = world.ggmap$long, y = world.ggmap$lat) + 
    scale_fill_hue(na.value=NA) 
choropleth 



choropleth + geom_point(aes(x=V1,y=V2,size=growth),data=df) + 
    scale_area(range=c(0,3)) 

enter image description here

Hoặc nếu bạn thực sự muốn tăng gấp đôi mã màu, bạn có thể tô màu cho các điểm thay thế. Lưu ý rằng bạn cũng có thể thêm bản đồ raster của hình ảnh vệ tinh với gói OpenStreetMap mới (plug shameless).

library(OpenStreetMap) 
library(raster) 
rastermap <- openmap(c(70,-179), 
     c(-70,179),zoom=2,type='bing') 
rastermap <- openproj(rastermap) 
autoplot(rastermap,expand=FALSE) + 
    geom_map(aes(x=70,y=70,fill = category, map_id = id),data = df, 
     map =world.ggmap) + 
    expand_limits(x = world.ggmap$long, y = world.ggmap$lat) + 
    scale_fill_hue(na.value=NA) + 
    geom_point(aes(x=V1,y=V2,colour=growth),data=df) + 
    scale_colour_gradient(low = "red", high = "blue", 
     guide = "colorbar",na.value=NA) 

enter image description here

+0

Ian , gói của bạn trông đẹp mắt [1] nó có thêm một liên lạc tốt đẹp. Thêm một alpha (ed) -fill có lẽ sẽ rất mát mẻ. BTW: Bạn có biết gói ggmap không? Dựa trên bản tóm tắt, chúng tương tự nhau. Ý tưởng điểm là một ý tưởng tuyệt vời. Bằng cách sử dụng một ngôi sao hoặc một cái gì đó trông ít liên kết một stink mực này có thể được biến thành một cái gì đó tốt đẹp. Cảm ơn! – Rasmus

+0

Tôi biết về gói. OpenStreetMap về cơ bản là một sự thay thế cho cả RGoogleMaps và ggmap. Nó làm những điều thú vị như lưu trữ lát gạch và phép biến đổi bản đồ. –

+0

@IanFellows Nếu quan tâm, tôi chỉ hỏi một câu hỏi liên quan (sử dụng cùng ví dụ) tại đây: http://stackoverflow.com/questions/13219387/world-map-map-halves-of-countries-to-different-colors –

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