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:
1 2 3 4 5 6 7 8 9 10 11 12 | #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" ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #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 ) |
1 2 3 4 5 6 7 | #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" ) |
1 2 3 4 5 6 7 8 9 | #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 |
1 2 3 4 5 6 7 | #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 |