2017-02-10 15 views
1

Я пытаюсь сделать картограмму в R, чтобы показать количество вхождений в каждой области Великобритании.Создание картограммы в R

Мои данные в настоящее время выглядит следующим образом:

Area       Occurences  lon  lat 
1 Greater London East North UK  200 -0.0936496 51.43092 
2  Lambeth and Southwark UK  16 -0.1178424 51.49351 
3    Black Country UK  58 -2.0752861 52.52005 
4     Glasgow UK  45 -4.2518060 55.86424 
5      Leeds UK  331 -1.5490774 53.80076 
6  Sth Herts or Watford UK  210 -0.3903200 51.65649 

У меня есть широта и долгота для всех 120 наблюдений. До сих пор я использовал следующий код в попытке произвести картограмму:

library(rgdal) 
library(cartogram) 
library(tmap) 
library(maptools) 

ukgrid = "+init=epsg:27700" 

data(wrld_simpl) 

afr <- wrld_simpl[wrld_simpl$NAME == "United Kingdom",] 
afr <- spTransform(afr, CRS(ukgrid)) 

# construct cartogram 
afrc <- cartogram(afr, "POP2005", itermax=5) 

# plot it 
tm_shape(afrc) + tm_fill("POP2005", style="jenks") + 
tm_borders() + tm_layout(frame=F) 

Это производит карту Великобритании, но я не уверен, как использовать свои собственные данные для картограммы, в отличие от данных о численности населения в ' wrld_simpl ', на которых основана карта.

У кого-нибудь есть опыт в этом или знаете другой метод для достижения желаемого результата? Благодаря!

ответ

1

Я предполагаю, что ваши данные являются SpatialPointsDataFrame? Вам нужно найти правильный шейп-файл (SpatialPolygonsDataFrame), где каждая область Великобритании соответствует многоугольнику. Хорошим источником форм является http://www.naturalearthdata.com/

Это пример, который должен быть похож на ваш случай:

library(rgeos) 
library(sp) 
library(maptools) 
library(tmap) 
library(tmaptools) 
library(cartogram) 

data(wrld_simpl) 
data(metro) 

## count occurences per polygon: in this case, the number of cities per country 
x <- over(metro, wrld_simpl) 
res <- table(x$ISO3) 
dat <- data.frame(iso_a3=names(res), count=as.vector(res)) 

## add counts to polygon shape 
wrld_simpl <- append_data(wrld_simpl, dat, key.shp = "ISO3", key.data = "iso_a3", ignore.na = TRUE) 

## remove 0 counts 
wrld_simpl_sel <- wrld_simpl[which(wrld_simpl$count>0), ] 

## apply cartogram (doesn't result in a nice cartogram because the shape is too detailed and the counts are too few) 
wrld_simpl_carto <- cartogram(wrld_simpl_sel, weight = "count", itermax = 1) 

## plot it 
qtm(wrld_simpl_carto) 
+0

Спасибо - очень полезно! :) – George