Разработка географических тематических карт с R
В R существует четкое количество пакетов для всех видов пространственного анализа. Это можно увидеть в CRAN Task View: Анализ пространственных данных. Эти пакеты многочисленны и разнообразны, но все, что я хочу сделать, это несколько простых тематических карт. У меня есть данные с кодами FIPS и графством и штатом, и у меня есть файлы формы ESRI границ графства и штата и сопровождающие коды FIPS, которые позволяют соединяться с данными. Файлы формы могут быть легко преобразованы в другие форматы, если это необходимо.
Итак, какой самый прямой способ создать тематические карты с R?
Эта карта выглядит так, как будто она была создана с помощью продукта ESRI Arc, но это тот тип вещей, который я хотел бы сделать с R:
alt text http://www.infousagov.com/images/choro.jpg Карта скопирована здесь,
Ответы
Ответ 1
Следующий код послужил мне хорошо. Настройте его немного, и все готово.
(источник: 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
[email protected]$noise <- rnorm(nrow([email protected]))
функция тепловой карты
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([email protected][,z],na.rm=TRUE)*10)/10
,
ceiling(max([email protected][,z],na.rm=TRUE)*10)/10
,.1)
}
[email protected]$zCat <- cut([email protected][,z],breaks,include.lowest=TRUE)
cutpoints <- levels([email protected]$zCat)
if (is.null(col.vec)) col.vec <- heat.colors(length(levels([email protected]$zCat)))
if (reverse) {
cutpointsColors <- rev(col.vec)
} else {
cutpointsColors <- col.vec
}
levels([email protected]$zCat) <- cutpointsColors
plot(counties.map,border=gray(.8), lwd=bw,axes = FALSE, las = 1,col=as.character([email protected]$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))
Ответ 2
Думаю, что я добавлю новую информацию здесь, так как с момента публикации была проведена какая-то деятельность по этой теме. Вот две отличные ссылки на "Choropleth Map R Challenge" в блоге Revolutions:
Choropleth Map R Challenge
Результаты Choropleth Challenge
Надеюсь, они полезны для людей, рассматривающих этот вопрос.
Все самое лучшее,
Джей
Ответ 3
Проверьте пакеты
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"
- отображаемая переменная. Скорее всего, с небольшой работой. Кажется, мне не разрешено загружать изображение, вот ссылка на изображение:
Ответ 4
Взгляните на пакет PBSmapping (см. borh vignette/manual и demo) и
this O'Reilly Data Mashups в статье R (к сожалению, это не бесплатно, но стоит 4.99 $для загрузки, согласно Блог Revolutions).
Ответ 5
Это всего лишь три строки!
library(maps);
colors = floor(runif(63)*657);
map("state", col = colors, fill = T, resolution = 0)
Готово!!
Просто измените вторую строку на любой вектор из 63 элементов (каждый элемент между 0 и 657, которые являются членами colors())
Теперь, если вы хотите получить фантазию, вы можете написать:
library(maps);
library(mapproj);
colors = floor(runif(63)*657);
map("state", col = colors, fill = T, projection = "polyconic", resolution = 0);
63 элемента представляют 63 области, имена которых вы можете получить, запустив:
map("state")$names;
Ответ 6
Графическая галерея R имеет очень похожую карту которая должна послужить хорошей отправной точкой. Код находится здесь: www.ai.rug.nl/~hedderik/R/US2004. Вам нужно добавить легенду с помощью функции legend().