Разработка географических тематических карт с помощью R
в R явно есть несколько пакетов для всех видов пространственного анализа. Что можно увидеть в CRAN Task View: анализ пространственных данных. Эти пакеты многочисленны и разнообразны, но все, что я хочу сделать, это просто тематические карты. У меня есть данные с кодами графства и штата FIPS, и у меня есть файлы формы ESRI границ графства и штата и сопутствующие коды FIPS, которые позволяют объединяться с данными. Файлы формы могут быть легко преобразованы в другие форматы, если это необходимо.
Итак, каков самый прямой способ создания тематических карт с помощью R?
эта карта выглядит так, как будто она была создана с помощью продукта ESRI Arc, но это то, что я хотел бы сделать с R:
alt текст http://www.infousagov.com/images/choro.jpg Карта скопировать отсюда.
6 ответов:
следующий код сослужил мне хорошую службу. Настроить его немного, и вы сделали. alt текст http://files.eduardoleoni.com/map.png
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))
Я подумал, что добавлю здесь новую информацию, так как после публикации в этой теме была некоторая активность. Вот две отличные ссылки на "картограмма Р вызов" на блоге революций:
надеюсь, это полезно для людей, просматривающих этот вопрос.
всего наилучшего,
Джей
проверить пакеты
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 (см. borh виньетка / руководство и демо) и этой О'Рейли мэшапы данных в R статья (К сожалению, это не бесплатно, но это стоит 4.99$, чтобы загрузить, согласно блог революций).
Это всего лишь три строки!
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;
в графической галерее R есть очень аналогичную карту что должно стать хорошей отправной точкой. Код здесь: www.ai.rug.nl / ~hedderik/R / US2004 . Вам нужно будет добавить легенду с функцией legend ().