Разработка географических тематических карт с помощью R

StackOverflow https://stackoverflow.com/questions/1260965

  •  12-09-2019
  •  | 
  •  

Вопрос

Очевидно, что в R есть несколько пакетов для всех видов пространственного анализа.Это можно увидеть в Представление задач CRAN:Анализ пространственных данных.Эти пакеты многочисленны и разнообразны, но все, что я хочу сделать, это несколько простых тематические карты.У меня есть данные с кодами FIPS округа и штата, а также файлы форм ESRI с границами округов и штатов и сопутствующие коды FIPS, которые позволяют объединять данные.При необходимости файлы форм можно легко преобразовать в другие форматы.

Итак, каков самый простой способ создания тематических карт с помощью R?

Эта карта выглядит так, как будто она была создана с помощью продукта ESRI Arc, но именно это я хотел бы сделать с помощью R:

альтернативный текст http://www.infousagov.com/images/choro.jpg карта скопировано отсюда.

Это было полезно?

Решение

Следующий код сослужил мне хорошую службу.Немного настройте его, и все готово.alt text
(источник: eduardoleoni.com)

library(maptools)
substitute your shapefiles here
state.map <- readShapeSpatial("BRASIL.shp")
counties.map <- readShapeSpatial("55mu2500gsd.shp")
## this is the variable we will be plotting
counties.map@data$noise <- rnorm(nrow(counties.map@data))

функция тепловой карты

plot.heat <- function(counties.map,state.map,z,title=NULL,breaks=NULL,reverse=FALSE,cex.legend=1,bw=.2,col.vec=NULL,plot.legend=TRUE) {
  ##Break down the value variable
  if (is.null(breaks)) {
    breaks=
      seq(
          floor(min(counties.map@data[,z],na.rm=TRUE)*10)/10
          ,
          ceiling(max(counties.map@data[,z],na.rm=TRUE)*10)/10
          ,.1)
  }
  counties.map@data$zCat <- cut(counties.map@data[,z],breaks,include.lowest=TRUE)
  cutpoints <- levels(counties.map@data$zCat)
  if (is.null(col.vec)) col.vec <- heat.colors(length(levels(counties.map@data$zCat)))
  if (reverse) {
    cutpointsColors <- rev(col.vec)
  } else {
    cutpointsColors <- col.vec
  }
  levels(counties.map@data$zCat) <- cutpointsColors
  plot(counties.map,border=gray(.8), lwd=bw,axes = FALSE, las = 1,col=as.character(counties.map@data$zCat))
  if (!is.null(state.map)) {
    plot(state.map,add=TRUE,lwd=1)
  }
  ##with(counties.map.c,text(x,y,name,cex=0.75))
  if (plot.legend) legend("bottomleft", cutpoints, fill = cutpointsColors,bty="n",title=title,cex=cex.legend)
  ##title("Cartogram")
}

запланируйте это

plot.heat(counties.map,state.map,z="noise",breaks=c(-Inf,-2,-1,0,1,2,Inf))

Другие советы

Подумал, что добавлю сюда новую информацию, поскольку с момента публикации по этой теме наблюдалась некоторая активность.Вот две отличные ссылки на «Choropleth Map R Challenge» в блоге Revolutions:

Картографическая карта R Challenge

Результаты конкурса Choropleth Challenge

Надеюсь, это будет полезно для людей, просматривающих этот вопрос.

Всего наилучшего,

Джей

Ознакомьтесь с пакетами

library(sp)
library(rgdal)

которые хороши для геоданных, и

library(RColorBrewer)  

пригодится для раскрашивания. Эта карта сделано с использованием вышеуказанных пакетов и этого кода:

VegMap <- readOGR(".", "VegMapFile")
Veg9<-brewer.pal(9,'Set2')
spplot(VegMap, "Veg", col.regions=Veg9,
 +at=c(0.5,1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5),
 +main='Vegetation map')

"VegMapFile" это шейп-файл и "Veg" — отображаемая переменная.Вероятно, можно сделать лучше, если немного поработать.Кажется, мне не разрешено загружать изображение, вот ссылка на изображение:

Взгляните на пакет PBSmapping (см. пример/руководство и демонстрацию) иэтот О'Рейли Мэшапы данных в R статья (к сожалению, она не бесплатна, но ее загрузка стоит 4,99$, согласно Блог Революций ).

Это всего три строчки!

library(maps);
colors = floor(runif(63)*657);
map("state", col = colors, fill = T, resolution = 0)

Сделанный!!Просто измените вторую строку на любой вектор из 63 элементов (каждый элемент от 0 до 657, который является членом цвета()).

Теперь, если вы хотите пофантазировать, вы можете написать:

library(maps);
library(mapproj);
colors = floor(runif(63)*657);
map("state", col = colors, fill = T, projection = "polyconic", resolution = 0);

63 элемента представляют 63 региона, имена которых вы можете получить, выполнив:

map("state")$names;

В галерее R Graphics есть очень аналогичная карта что должно стать хорошей отправной точкой.Код здесь:www.ai.rug.nl/~hedderik/R/US2004.Вам нужно будет добавить легенду с помощью функции Legend().

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top