post-image

Um GIF animado do desmatamento da Amazônia


Nesse post mostraremos uma imagem animada (GIF) detalhando a evolução do desmatamento na Amazônia de 2007 a 2019. Para os interessados, também discutiremos como gerar um GIF com dados estatísticos.

Introdução

Alguns meses atrás refiz o meu site Polling Data. Uma das razões era que o site me permitisse publicar posts, com análises estatísticas, de maneira eficiente. Minha meta pessoal é publicar um post novo semanalmente, mas esta semana eu quase não consegui cumprir a meta. Trabalhei paralelamente em dois posts trabalhosos, um sobre o preço de passagens áreas e o outro sobre o valor de carros usados, porém não consegui finalizar nenhum dos dois.

Decidi que ao invês de finalizar rapidamente um deles para garantir o post desta semana, iria dar continuação a um post mais antigo. Há mais de 2 meses, escrevi um post sobre a polêmica relacionada aos dados de desmatamento da Amazônia. Pensando sobre a questão, me dei conta de que seria interessante visualizar a localização do desmatamento num mapa, mostrando a dinâmica do processo ao longo dos anos. Com isso em mente, tive a ideia de fazer um GIF (Graphics Interchange Format) animado com os dados, o que permitiria que as pessoas pudessem ter uma visualização espacial da questão e que o gráfico pudesse ser facilmente divulgado nas mídias sociais e no WhatsApp.

O presente post explica como esse GIF animado foi desenvolvido. O GIF pode ser visualizado na seção abaixo, ou então baixado nesse link.

Dados sobre o desmatamento da Amazônia

As informações sobre desmatamento se baseiam nos dados obtidos por dois sistemas de apuração via satélite (DETER e PRODES) do Instituto Nacional de Pesquisas Espaciais (INPE), a partir dos quais as estatísticas do desmatamento são calculadas. Os dados fornecidos por esses sistemas são de naturezas diferentes e publicados para duas grandes áreas de referência: Amazônia Legal1 e o Bioma da Amazônia2.

Para gerar os mapas utilizados na animação, foram utilizados dados históricos de 1988 até 2018, além de dados parciais de 2019. Os dados históricos incluem o período de 1988 a 2018. A fonte das áreas desmatadas é o sistema PRODES. Esse sistema fornece as estimativas mais refinadas do desmatamento da Amazônia, embora demorem muito tempo para serem calculadas. Esses são os dados mais confiáveis disponíveis e servem para estatísticas oficiais. Os dados históricos foram obtidos nos seguintes links: dados acumulados 1988-2007 e incremento anual 2008-2018.

A fonte dos dados parciais de 2019 é o sistema DETER. Esse sistema fornece dados de alertas, visando a fiscalização mensal. Apesar de serem parciais, permitem que tenhamos alguma idea do desmatamento que está ocorrendo este ano. Depois do final do ano, quando esses dados forem consolidados, podem sofrer alterações. Esse é o link com os dados do desmatamento parcial de 2019.

Abaixo apresentamos o GIF animado. Para visualizar o código utilizado para gerar o mapa animado, clique no botão Mostrar Código abaixo da imagem.


Gerando um GIF

Quando tive a ideia de fazer um GIF animado do desmatamento da amazônia, achei que o meu maior desafio seria fazer o GIF em si, pois nunca tinha feito um. Porém, se você utilizar o pacote correto, é bem fácil fazê-lo. Eu utilizei o pacote magick, o qual é simples de usar e bastante poderoso.

Para gerar um GIF, basta gerar cada imagem que estará na animação separadamente. Depois essas imagens serão juntadas para gerar a animação. Ou seja, sua animação será tâo boa quanto as imagens individuais. Assim, o desafio na realidade é criar essas imagens para juntas formem o GIF desejado. Nesse primeiro bloco de código, mostro como baixar todos os dados necessários.


require(rgeos)
require(rgdal)
require(maptools)
require(gstat)
require(sp)
require(ggmap)
require(png)
require(magick)

dir.amazon <- tempdir()

###########################
### Download dos arquivos

#Download Shapefile - Amazônia legal
url <- "http://terrabrasilis.dpi.inpe.br/download/prodes-legal-amz/vector/brazilian_legal_amazon.zip"
file.data = tempfile(tmpdir=dir.amazon, fileext=".zip")
download.file(url,file.data,method="curl")
unzip(zipfile=file.data,exdir=dir.amazon)

#Download Shapefile - Amazonia Bioma
url <- "http://terrabrasilis.dpi.inpe.br/download/prodes-amz/vector/biome_border.zip"
file.data = tempfile(tmpdir=dir.amazon, fileext=".zip")
download.file(url,file.data,method="curl")
unzip(zipfile=file.data,exdir=dir.amazon)

#Download Shapefile - anos 1988 a 2007
url <- "http://terrabrasilis.dpi.inpe.br/download/prodes-amz/vector/accumulated_deforestation_1988_2007_biome.zip"
file.data = tempfile(tmpdir=dir.amazon, fileext=".zip")
download.file(url,file.data,method="curl")
unzip(zipfile=file.data,exdir=dir.amazon)

#Download Shapefile - anos 2008 a 2018
url <- "http://terrabrasilis.dpi.inpe.br/download/prodes-amz/vector/yearly_deforestation_2008_2018_biome.zip"
file.data = tempfile(tmpdir=dir.amazon, fileext=".zip")
download.file(url,file.data,method="curl")
unzip(zipfile=file.data,exdir=dir.amazon)

#Download Shapefile - anos 2019 DETER
url <- "http://terrabrasilis.dpi.inpe.br/file-delivery/download/deter-amz/shape"
file.data = tempfile(tmpdir=dir.amazon, fileext=".zip")
download.file(url,file.data,method="curl")
unzip(zipfile=file.data,exdir=dir.amazon)


Todos os arquivos baixados são shapefiles. Ou seja, arquivos que contém tanto dados quanto informações sobre o geo-referenciamento dos polígonos. Esses arquivos precisam ser importados para o R corretamente, como no código abaixo. As funções CRS são importantes para garantir que todos os polígonos utilizem as mesmas projeções, e o nome quer dizer Sistema de Coordenadas de Referência em inglês.


###########################
### Importando os arquivos

#Amazonia Legal
legal.shp <- readOGR(dir.amazon,"brazilian_legal_amazon")
legal.shp <- spTransform(legal.shp, CRS("+proj=longlat +datum=WGS84"))
legal.dados <- tidy(legal.shp)

#Amazonia Bioma
bioma.shp <- readOGR(dir.amazon,"biome")
bioma.shp <- bioma.shp[bioma.shp@data$ID == 1,]
bioma.shp <- spTransform(bioma.shp, CRS("+proj=longlat +datum=WGS84"))
bioma.dados <- tidy(bioma.shp)

#anos 1988 a 2007
desm2007.shp <- readOGR(dir.amazon,"accumulated_deforestation_1988_2007_biome")
desm2007.shp <- spTransform(desm2007.shp, CRS("+proj=longlat +datum=WGS84"))
desm2007.shp@data <- desm2007.shp@data[,c('ORIGIN_ID','VIEW_DATE','ANO')]

#anos 2008 a 2018
desm.shp <- readOGR(dir.amazon,"yearly_deforestation_2008_2018")
desm.shp <- spTransform(desm.shp, CRS("+proj=longlat +datum=WGS84"))
desm.shp@data <- desm.shp@data[,c('ORIGIN_ID','VIEW_DATE','ANO')]

#anos 2019 DETER
desm2019.shp <- readOGR(dir.amazon,"deter_public")
desm2019.shp <- spTransform(desm2019.shp, CRS("+proj=longlat +datum=WGS84"))
desm2019.shp@data$VIEW_DATE <- as.character(as.Date(desm2019.shp@data$DATE,format="%Y/%m/%d"))
desm2019.shp@data$ANO <- as.numeric(format(as.Date(desm2019.shp@data$DATE,format="%Y/%m/%d"),"%Y"))
desm2019.shp@data$anomes <- as.numeric(format(as.Date(desm2019.shp@data$DATE,format="%Y/%m/%d"),"%Y%m"))
desm2019.shp <- desm2019.shp[desm2019.shp@data$anomes >= 201808 & desm2019.shp@data$anomes <= 201907,]
desm2019.shp@data$ORIGIN_ID <- 2019000 + 1:nrow(desm2019.shp@data)
desm2019.shp@data <- desm2019.shp@data[,c('ORIGIN_ID','VIEW_DATE','ANO')]


Depois que todos os shapefiles foram importados, iremos consolidar todos os arquivos em um único arquivo. Isso fará com que o código rode de forma mais lenta, porém o código em si será mais simples, pois todos os gráficos individuais usarão a mesma base de dados. Depois de consolidada a base, usamos a função broom::tidy para transformar o shapefile num formato que pode ser utilizado com a função ggplot2::ggplot, a qual será utilizada para gerar os gráficos individuais.


### consolidando base com todos os desmatamentos 1988-2019
df.desm <- rbind(desm2007.shp,desm.shp)
df.desm <- rbind(df.desm,desm2019.shp)
df.desm@data$date <- as.Date(str_sub(df.desm@data$VIEW_DATE,start = 1,end = 10),format="%Y-%m-%d")
#não arrumei o View_date do arquivo de 2007
df.desm@data$ano <- as.numeric(df.desm@data$ANO)
df.desm@data$id <- as.character(rank(as.character(df.desm@data$ORIGIN_ID))-1)

### formatando base para usar com o ggplot
desm.dados <- tidy(df.desm)
desm.dados <- desm.dados %>% left_join(dplyr::select(df.desm@data,id,ano))
desm.dados$ordem <- desm.dados$ano
desm.dados <- desm.dados %>% drop_na(ano)


No bloco de código abaixo, criamos o mapa base, que será utilizado para plotar o desmatamento de cada ano. A ideia é que o mapa ggMap4 seja reutilizado para cada ano, garantindo que tudo será idêntico, menos as informações dos dados em si.

Uma das características interessantes desse gráfico é que o mapa do Google apareça em áreas que não tem dados. Para isso utilizamos a função ggmap::get_map, porém para utilizá-la é necessário se registrar no site do google. Siga as informações disponíveis no help do pacote ggmap.


######################################################
###### Mapa Brasil (fundo)

register_google(key = "XXXXXXX")

#mapa google - com bounding box
range.x = range(legal.dados$long) + c(-1,3)
range.y = range(legal.dados$lat) + c(-1,1)
ratio = range.x%*%c(-1,1) / range.y%*%c(-1,1)
brmap <- get_map(c(left=range.x[1],right=range.x[2],bottom=range.y[1],top=range.y[2]), maptype = "roadmap", source = "google")
brmap <- ggmap(brmap)

###### Adicionando dados ao mapa

ggMap <- brmap
ggMap3 <- ggMap + geom_polygon(data = legal.dados,aes(x=long, y=lat, group=group),fill=NA,colour="red",alpha = 0.2,size=2) + theme_bw()
ggMap4 <- ggMap3 + geom_polygon(data = bioma.dados,aes(x=long, y=lat, group=group),fill=NA,colour="orange",alpha = 0.2,size=1) + theme_bw()


No bloco de código abaixo, geramos todos os mapas. Para controlar cada mapa individulamente, criamos o dataframe df.png. Esse dataframe contém o nome dos arquivos de imagem a serem gravados, e também os anos a serem incluídos nos mapas.

A função gravar_png_ano é responsável por gerar cada mapa, e a função purrr::walk2 gera cada um dos gráficos, utilizando as especificações do dataframe df.png.


gravar_png_ano <- function(ordem,file,mapa){
  
  df <- desm.dados[desm.dados$ordem <= ordem,]
  df$ordem <- factor(df$ordem,levels=2007:2019,labels=c("1988-2007",2008:2018,"2019 (parcial)"))
  df.ano <- tibble(
    name = ordem,
    lon = -46,
    lat = 2.5
  )
  
  ggMap5 <- mapa + geom_polygon(data = df,aes(x=long, y=lat, group=group,fill=ordem),alpha = 0.9,size=0.1) + theme_bw()
  ggMap5 <- ggMap5 + geom_label(data = df.ano,aes(x = lon, y = lat, label = name), size=9,fill="darkorange",colour = "white", fontface = "bold")
  ggMap5 <- ggMap5 + theme(axis.title.x=element_blank(),axis.text.x=element_blank(),axis.ticks.x=element_blank(),
                           axis.title.y=element_blank(),axis.text.y=element_blank(),axis.ticks.y=element_blank(),
                           plot.margin=grid::unit(c(0,0,0,0), "mm"))
  ggMap5 <- ggMap5 + scale_fill_manual(values = c("#E5CB00", "#E1BB00", "#DEAB00", "#DB9B00", "#D88B00", "#D57B00", "#D26B00", "#CE5B00", "#CB4B00", "#C83B00", "#C52B00", "#C21B00", "#BF0C00"),name= "Ano", drop=FALSE)
  
  ggMap5 <- ggMap5 + labs(title = "Desmatamento Bioma Amazônia - Fonte: INPE (PRODES e DETER)", 
                          subtitle = "Incrementos anuais de 2008 a 2019(parcial)")
  
  ggsave(filename = file,plot = ggMap5,width = 8,height=8,dpi = 150)
  
}


#gerando df com todos as infos
df.png <- desm.dados %>% group_by(ano,ordem) %>% count() %>% dplyr::select(-n)
df.png$file <- paste0(dir.amazon,"/desmatamento_",df.png$ordem,".png")
df.png <- df.png %>% arrange(as.numeric(ordem))

#gravando todos os mapas
walk2(df.png$ordem,df.png$file,~gravar_png_ano(.x,.y,mapa=ggMap4))


No bloco de código abaixo, a GIF animado é gerado. Para gerar um GIF, basta utilizar a função image_animate para ler todas as imagens e gerar a animação.


### arquivo com titulo e logo
files <- list.files(path=dir.amazon, pattern = "desmatamento_[0-9]{4}\\.png", full.names = T)

files %>% 
  map(image_read) %>% # lê cada arquivo
  map(image_trim) %>% # retirar os espaços em branco no entorno da figura
  image_join() %>% # junta as imagens
  image_animate(fps=0.5) %>% # anima as imagens - fps indica quantos quadros por segundo
  image_write(paste0(dir.amazon,"/amazonia_ano.gif"))


Conclusão

Se uma imagem vale mais do que mil palavras, quanto vale um GIF animado mostrando a evolução temporal de um processo? Cada vez mais tenho utilizado recursos animados ou interativos para analisar os dados. Dependo dos dados sendo analisados, e do problema sendo estudado, esses recursos podem ser muito úteis. Podem dar insights muito importantes sobre a estrutura ou a dinâmica do problema.

No caso específico da análise do desmatamento da amazônia, esses recursos serviram apenas para ilustrar como o desmatamento ocorreu, usualmente acompanhando o leito de rios para adentrar a Amazônia, ou então expandido áreas previamente desmatadas. Mas não geraram nenhum insight que contribuiu de forma importante para esse post, no qual uma análise imparcial dos dados de desmatamento foi realizada.

Mesmo quando nenhum insight novo é produzido, fazer gráficos (animados ou não) é uma parte essencial da análise de dados; é uma forma ótima de entender um problema, de visualizar dados complexos e de comunicar resultados à terceiros. Como o famoso estatístico John Tukey disse:

“Essa é a minha parte favorita da análise dos dados: dar vida a dados tabulares sem graça ao visulizá-los”


  1. A Amazônia Legal é uma área que engloba nove estados do Brasil pertencentes à bacia Amazônica e à área de ocorrência das vegetações amazônicas. O governo federal, reunindo regiões de idênticos problemas econômicos, políticos e sociais, com o intuito de melhor planejar o desenvolvimento social e econômico da região amazônica, instituiu o conceito de “Amazônia legal.” A atual área de abrangência da Amazônia Legal corresponde à totalidade dos estados do Acre, Amapá, Amazonas, Mato Grosso, Pará, Rondônia, Roraima e Tocantins e parte do estado do Maranhão (a oeste do meridiano de 44º de longitude oeste), perfazendo uma superfície correspondente a cerca de 61% do território brasileiro. Sua população, entretanto, corresponde a 12,32% do total de habitantes do Brasil.↩︎

  2. Bioma é uma unidade biológica ou espaço geográfico cujas características específicas são definidas pelo macroclima, a fitofisionomia, o solo e a altitude, dentre outros critérios. São tipos de ecossistemas, habitats ou comunidades biológicas com certo nível de homogeneidade.↩︎


comments powered by Disqus

Voltar ao blog