SAUDAÇÕES!

Seja bem vindo à página do professor Pedro Albuquerque. Para saber mais sobre meu currículo, disciplinas ministradas e interesses de pesquisa, navegue no menu disponível no topo da página.

segunda-feira, 15 de agosto de 2016

Mapas Temáticos usando o R.


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)
Map
Caso 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