Построить географическую карту с символами в соответствии с частотами - PullRequest
4 голосов
/ 01 декабря 2011

Я хотел бы построить географическую карту с n номерами квадратов в зависимости от частоты заболевания в округе. Как этот здесь: enter image description here

Но я не мог понять, как это сделать с помощью R или qGIS. Спасибо за помощь.

Ответы [ 2 ]

7 голосов
/ 01 декабря 2011

Сначала напишите небольшую функцию 'stackbox', которая строит (используя «прямоугольник») квадраты стека в нужном месте.

Вот первая строка этой функции:

stackbox <- function(x,y,n,size,maxheight=5){
  • , где «size» - это высота и ширина блоков, а «maxheight» позволяет вам иметь стопку высотой 5, 10 или любую другую.

Затем вызовите эту функцию для каждого округа, в котором есть дела.

Где именно вы застряли в процессе?

Вот функция полностью:

stackbox <- function(x,y,n,size,maxheight=5,...){
  stackheight = seq(0,n,by=maxheight)
  stackheight=diff(unique(c(stackheight,n)))

  for(col in 1:length(stackheight)){
    xl=rep(x+(col-1)*size,stackheight[col]) - (length(stackheight)/2)*size
    yb=y+size*((1:stackheight[col])-1) - (max(stackheight)/2)*size
    xr=xl+size
    yt=yb+size
    rect(xl,yb,xr,yt,...)
  }
}

Пример:

plot(1:10)
for(i in 1:10){
 stackbox(i,i,i,3,size=.1,col="red",border="white")
}

Чтобы сделать это на карте, вам нужны пакеты sp и maptools и шейп-файл или другой источник геопространственных данных, в котором есть ваши данные:

africa=readShapeSpatial(file.path(mapLib,"africa.shp"))
plot(africa,border="gray")
coords=coordinates(africa)
for(i in 1:nrow(africa)){
  if(cases[i]>0){
    stackbox(coords[i,1],coords[i,2],africa$cases[i],1,border="#606060",col="#0083FE")
  }
}

Map using stacked boxes

Я выбрал цвета, которые немного похожи на ваш оригинал. Обратите внимание, что поля находятся в координатах графика, поэтому мне пришлось сделать их 0,1 градуса. Возможно, вы захотите преобразовать вашу карту в евклидову проекцию (используя spTransform из пакета: gdal), и тогда они будут в этих единицах и правильно выстроены.

Было бы сложно сделать красивые текстовые метки, как в оригинале ...

5 голосов
/ 01 декабря 2011

В качестве альтернативы я бы предложил пузырьковый график, который довольно просто сделать с помощью ggplot2 с использованием точечной геометрии.Пример формы справочных страниц (http://had.co.nz/ggplot2/geom_point.html):

p <- ggplot(mtcars, aes(wt, mpg)) 
p + geom_point(aes(size = qsec)) 

, что приводит к:

ggplot bubble plot

Размер пузырька представляет измеренную сумму. Примерне использует географические координаты, но их можно легко использовать. Пакет ggplot2 также поддерживает добавление пространственных полигонов в качестве дополнительного слоя, например, с использованием geom_path. Файл справки ordin_map показывает несколько примеров с использованием данных карты.также функция fortify для преобразования объекта SpatialPolygons в data.frame (который необходим для ggplot2).

...