Mapas Temáticos são muito utilizados na etapa de Análise Espacial Exploratória, a qual tem por principal objetivo apresentar visualmente a existência de algum possível padrão espacial.
O objetivo desse post é apresentar como é possível construir Mapas Temáticos usando o R.
O primeiro passo é a obtenção de uma malha digital. Usualmente, uma malha digital é um conjunto de pelo menos três arquivos com o mesmo nome, mas extensões diferentes (*.dbf,*.shx,*.shp). Essa malha nada mais é do que as delimitações geográficas do mapa de interesse. Por exemplo, suponha que desejamos construir um Mapas Temático para os municípios brasileiros, precisamos então da malha municipal.
O principal repositório de malhas digitais no Brasil é do IBGE. Nesse link (ftp://geoftp.ibge.gov.br/malhas_digitais/) podemos obter as mais diversas malhas digitais. Nesse exercício trabalharemos com a malha municipal de 2005.
O código a seguir lê a malha digital (55mu2500pc) e cria uma outra malha somente com o contorno das Unidades da Federação:
#Limpa o Workspace rm(list=ls()) #Chama a biblioteca library(ggplot2) library(rgdal) library(plyr) library(rgeos) #Carrega o objeto SpatialPolygon br <- readOGR(dsn = ".", "55mu2500pc", verbose=FALSE) #Faz o dissolve para as UF's UF <- gUnaryUnion(br, id = br@data$UF) UF <- fortify(UF, region="UF")Em seguida, precisamos obter um conjunto de dados que desejamos plotar no mapa. Esse conjunto deve possuir pelo menos uma variável identificada pelo Código do Município também presente na malha 55mu2500pc. Vamos usar como exercício os dados do IpeaData (basta pesquisar no campo Regional pelo tema "Número de homicídios" ou baixe o arquivo aqui.).
#Lê os dados all_content <- readLines("ipeadata.csv") #Pula o nome das colunas skip_first = all_content[-1] #Lê os dados indice<- read.csv2(textConnection(skip_first), header = TRUE, stringsAsFactors = FALSE) #Transforma o NA em zero indice[is.na(indice)] <- 0 #Corrige o nome dos municípios enconding indice[,3]<-iconv(indice[,3], "UTF-8", "LATIN2") indice<-indice[,-9] colnames(indice)<-c("Sigla","Codigo","Mun","C2005","C2006","C2007","C2008","C2009") #Renomeia as colunas indice$GEOCODIGO<-as.character(indice$Codigo) #Indice de Criminalodade em 2005 indice$Indice<-indice$C2005/sum(indice$C2005) #Cria as categorias indice$Categorias1<-cut(indice$Indice,c(0, 0.25,0.50,0.75,1), labels=c('<0.25','0.25|-0.50','0.50|-0.75','>=0.75')) #Categorias por quartil breaks<-c(quantile(indice$Indice, probs = seq(0, 1, by = 0.25))) breaks[1]<-breaks[2]-1e-5 indice$Categorias2<-cut(indice$Indice, breaks=breaks, labels=c("1º Quartil","2º Quartil","3º Quartil","4º Quartil"), include.lowest=TRUE)Agora é preciso unir os dados com a malha:
#Faz o merge com os dados br@data$id <- rownames(br@data) #Caso o código tenha apenas 6 dígitos: br@data$IBGE<-substr(br@data$GEOCODIGO,1,6) br@data <- join(br@data, indice, by="GEOCODIGO") #Cria o objeto para ggplot2 br.df <- fortify(br) br.df <- join(br.df,br@data, by="id")Em seguida fazemos o mapa:
#Define as cores do mapa library(RColorBrewer) myPalette <- colorRampPalette(brewer.pal(11, "Spectral")) #Faz o mapa Map <- ggplot(br.df, aes(long, lat)) + geom_polygon(aes(group = group, fill = Categorias2)) + coord_equal() + labs(x = "Longitude", y = "Latitude", fill = "Criminalidade\nRegional") + ggtitle("Índice:\n Criminalidade Regional") + geom_polygon(data=UF, aes(group=group), alpha=1,colour="black", fill=NA, size=0.5) MapCaso deseje fazer o mapa com o valor numérico também é possível usar o argumento scale_fill_gradientn:
#Faz o mapa Map2 <- ggplot(br.df, aes(long, lat)) + geom_polygon(aes(group = group, fill = Indice)) + coord_equal() + labs(x = "Longitude", y = "Latitude", fill = "Criminalidade\nRegional") + ggtitle("Índice:\n Criminalidade Regional") + scale_fill_gradientn(colours = myPalette(4))+ geom_polygon(data=UF, aes(group=group), alpha=1,colour="black", fill=NA, size=0.5) Map2