Este post escrito por Sillas Gonzaga, um dos professores do curso Ciência de Dados com R, tem o objetivo de ensinar a inserir imagens da internet no ggplot2, extrair links de imagens de uma página na Wikipedia e usar o pacote BETS para pesquisar e baixar séries temporais brasileiras.

Durante este processo foram utilizados os pacotes:

library(tidyverse)
library(BETS)
library(magrittr)
library(rvest)
library(lubridate)
library(stringr)
library(magick)
library(grid)

Coleta dos dados

Vamos fazer um rápido exercício: baixar alguma série temporal brasileira de 20 anos para cá e mostrar como sua variável mudou ao longo dos diferentes mandatos dos presidentes da República.

Ao invés de procurar na Internet uma fonte para os dados, podemos realizar essa etapa da coleta dos dados dentro do próprio R, graças ao pacote BETS.
Suponha que desejamos pesquisar séries relacionadas ao consumo de energia elétrica no Brasil. Para isso, usamos a função BETS.search():

# apesar de ser um pacote brasileiro, os termos de busca devem ser em ingles
BETS.search("energy", view = FALSE) %>% head(20) %>% knitr::kable()
code description unit periodicity start last_value source
1402 Electric energy consumption – Brazil – commercial GWh M 31/01/1979 apr/2017 Eletrobras
1403 Electric energy consumption – Brazil – residential GWh M 31/01/1979 apr/2017 Eletrobras
1404 Electric energy consumption – Brazil – industrial GWh M 31/01/1979 apr/2017 Eletrobras
1405 Electric energy consumption – Brazil – other GWh M 31/01/1979 apr/2017 Eletrobras
1406 Electric energy consumption – Brazil – total GWh M 31/01/1979 apr/2017 Eletrobras
1407 Electric energy consumption – Northern region – commercial GWh M 31/01/1979 apr/2017 Eletrobras
1408 Electric energy consumption – Northern region – residential GWh M 31/01/1979 apr/2017 Eletrobras
1409 Electric energy consumption – Northern region – industrial GWh M 31/01/1979 apr/2017 Eletrobras
1410 Electric energy consumption – Northern region – other GWh M 31/01/1979 apr/2017 Eletrobras
1411 Electric energy consumption – Northern region – total GWh M 31/01/1979 apr/2017 Eletrobras
1412 Electric energy consumption – Northeast region – commercial GWh M 31/01/1979 apr/2017 Eletrobras
1413 Electric energy consumption – Northeast region – residential GWh M 31/01/1979 apr/2017 Eletrobras
1414 Electric energy consumption – Northeast region – industrial GWh M 31/01/1979 apr/2017 Eletrobras
1415 Electric energy consumption – Northeast region – other GWh M 31/01/1979 apr/2017 Eletrobras
1416 Electric energy consumption – Northeast region – total GWh M 31/01/1979 apr/2017 Eletrobras
1417 Electric energy consumption – Southern region – commercial GWh M 31/01/1979 apr/2017 Eletrobras
1418 Electric energy consumption – Southern region – residential GWh M 31/01/1979 apr/2017 Eletrobras
1419 Electric energy consumption – Southern region – industrial GWh M 31/01/1979 apr/2017 Eletrobras
1420 Electric energy consumption – Southern region – other GWh M 31/01/1979 apr/2017 Eletrobras
1421 Electric energy consumption – Southern region – total GWh M 31/01/1979 apr/2017 Eletrobras

Vale a pena ler a documentação da função BETS.search() para entender o que cada variável do dataframe retornado significa. Para este post, vamos usar a série 1404, referente ao consumo de energia elétrica na indústria nacional.

energia <- BETS.get(1404, data.frame = TRUE) rbind(head(energia), tail(energia)) %>% knitr::kable()
date value
1 1979-01-01 4215
2 1979-02-01 4221
3 1979-03-01 4329
4 1979-04-01 4405
5 1979-05-01 4563
6 1979-06-01 4672
457 2017-01-01 13088
458 2017-02-01 13251
459 2017-03-01 13810
460 2017-04-01 13900
461 2017-05-01 13503
462 2017-06-01 13770
# mudar nome das colunas
names(energia)<-c("data", "valor")

Temos então um dataframe de 462 linhas que vai desde Janeiro de 1979 até Junho de 2017. Plotar essa série com o ggplot2 é muito simples:

p <- ggplot(energia, aes(x = data, y = valor)) +
  geom_line() +
  geom_smooth(se = FALSE) +
  theme_minimal() +
  labs(x = NULL, y = "kWh",
       title = "Consumo de energia elétrica na indústria brasileira")
p
gerar grafico base 1

Temos então uma ideia diferente: que tal destacar no gráfico os períodos referentes aos diferentes presidentes da república que já tivemos? Para isso, criamos um data frame com os mandatos presidenciais da Nova República:

df_republica <- tribble(
  ~presidente, ~inicio,
  "José Sarney", dmy(15031985),
  "Fernando Collor", dmy(15031990),
  "Itamar Franco", dmy(29121992),
  "FHC", dmy(01011995),
  "Lula", dmy(01012003),
  "Dilma Rousseff", dmy(01012011),
  "Michel Temer", dmy(31082016)
)
# filtrar dados a partir do primeiro presidente da lista
energia %<>% filter(data >= min(df_republica$inicio))
# refazer o grafico com os dados filtrados
p <- ggplot(energia, aes(x = data, y = valor)) +
  geom_line() +
  geom_smooth(se = FALSE) +
  theme_minimal() +
  labs(x = NULL, y = "kWh",
       title = "Consumo de energia elétrica na indústria brasileira")
p <- p +
  # plotar inicio dos mandatos como uma linha tracejada vertical
  geom_vline(data = df_republica, aes(xintercept = inicio), linetype = "dashed")
p
incluir tracejados de presidentes 1

Contudo, podemos fazer algo diferente: Ao invés do nome, uma foto presidenciável!
Uma boa fonte para as fotos de nossos presidentes é a página da Wikipedia da lista de presidentes do Brasil. Precisamos ler o código fonte da página e extrair os links que estão marcados com a tag img.

url <- "https://pt.wikipedia.org/wiki/Lista_de_presidentes_do_Brasil"
fotos_presidentes %
  read_html() %>%
  html_nodes("img") %>%
  html_attr("src")
fotos_presidentes
##  "//upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Cscr-featured1.png/20px-Cscr-featured1.png"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Presidential_Standard_of_Brazil.svg/220px-Presidential_Standard_of_Brazil.svg.png"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/5/5e/Deodoro_da_Fonseca_%281889%29.jpg/90px-Deodoro_da_Fonseca_%281889%29.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/1/18/Floriano_Peixoto_%281891%29.jpg/90px-Floriano_Peixoto_%281891%29.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/f/f0/Prudentedemorais.jpg/90px-Prudentedemorais.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/b/b1/Campos_Sales.jpg/90px-Campos_Sales.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/d/d3/Rodrigues_Alves_3.jpg/90px-Rodrigues_Alves_3.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Afonso_Pena.jpg/90px-Afonso_Pena.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/c/c0/Nilo_Pe%C3%A7anha_02.jpg/90px-Nilo_Pe%C3%A7anha_02.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Hermes_da_Fonseca_%281910%29.jpg/90px-Hermes_da_Fonseca_%281910%29.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/c/cb/Venceslau_Br%C3%A1s.jpg/90px-Venceslau_Br%C3%A1s.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/d/d3/Rodrigues_Alves_3.jpg/90px-Rodrigues_Alves_3.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/a/a7/Delfim_Moreira_%281918%29.jpg/90px-Delfim_Moreira_%281918%29.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/1/19/Epitacio_Pessoa_%281919%29.jpg/90px-Epitacio_Pessoa_%281919%29.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/1/15/Artur_Bernardes_%281922%29.jpg/90px-Artur_Bernardes_%281922%29.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Washington_Lu%C3%ADs_%28foto%29.jpg/90px-Washington_Lu%C3%ADs_%28foto%29.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Retrato_J%C3%BAlio_Prestes.jpg/90px-Retrato_J%C3%BAlio_Prestes.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/5/56/Juntagovernativa1930.png/90px-Juntagovernativa1930.png"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/5/50/Getulio_Vargas_%281930%29.jpg/90px-Getulio_Vargas_%281930%29.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Jose_Linhares.jpg/90px-Jose_Linhares.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/5/55/GASPARDUTRA.jpg/90px-GASPARDUTRA.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/f/fb/17_-_Get%C3%BAlio_Dorneles_Vargas_1951_derivative.jpg/90px-17_-_Get%C3%BAlio_Dorneles_Vargas_1951_derivative.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/6/69/Cafe_Filho.jpg/90px-Cafe_Filho.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/e/e3/CarlosLuz.jpg/90px-CarlosLuz.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Presidente_Nereu_Ramos.jpg/90px-Presidente_Nereu_Ramos.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Juscelino.jpg/90px-Juscelino.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/9/93/Janio_Quadros.png/90px-Janio_Quadros.png"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/a/a6/Ranieri_Mazzilli_%281961%29.jpg/90px-Ranieri_Mazzilli_%281961%29.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/d/dc/Jango.jpg/90px-Jango.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/a/a6/Ranieri_Mazzilli_%281961%29.jpg/90px-Ranieri_Mazzilli_%281961%29.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/d/df/Castelobranco.jpg/90px-Castelobranco.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/6/66/Costa_e_Silva.jpg/90px-Costa_e_Silva.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Pedro_Aleixo.jpg/90px-Pedro_Aleixo.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Juntagovernativa1969.png/90px-Juntagovernativa1969.png"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/8/8c/Garrastazu_m%C3%A9dici.jpg/90px-Garrastazu_m%C3%A9dici.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Ernesto_Geisel.jpg/90px-Ernesto_Geisel.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/a/af/Figueiredo_%28colour%29.jpg/90px-Figueiredo_%28colour%29.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/6/64/Tancredo_Neves%2C_1983.jpg/90px-Tancredo_Neves%2C_1983.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Jose_Sarney_%28p%26b%29.jpg/90px-Jose_Sarney_%28p%26b%29.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/a/a6/Foto_oficial_de_Fernando_Collor.jpg/89px-Foto_oficial_de_Fernando_Collor.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/b/b1/Itamar_Franco.jpg/90px-Itamar_Franco.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Fernando_Henrique_Cardoso_%281994%29.jpg/90px-Fernando_Henrique_Cardoso_%281994%29.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/d/da/Lula_-_foto_oficial05012007.jpg/90px-Lula_-_foto_oficial05012007.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/8/81/Dilma_Rousseff_-_foto_oficial_2011-01-09.jpg/90px-Dilma_Rousseff_-_foto_oficial_2011-01-09.jpg"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/8/8d/Michel_Temer_em_27_de_outubro_de_2016.png/90px-Michel_Temer_em_27_de_outubro_de_2016.png"
##  "//upload.wikimedia.org/wikipedia/pt/timeline/2dee676c4d3f26392977d44fcad7b260.png"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Coat_of_arms_of_Brazil.svg/18px-Coat_of_arms_of_Brazil.svg.png"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Coat_of_arms_of_Brazil.svg/18px-Coat_of_arms_of_Brazil.svg.png"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/0/05/Flag_of_Brazil.svg/80px-Flag_of_Brazil.svg.png"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Presidential_Standard_of_Brazil.svg/80px-Presidential_Standard_of_Brazil.svg.png"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Coat_of_arms_of_Brazil.svg/50px-Coat_of_arms_of_Brazil.svg.png"
##  "//upload.wikimedia.org/wikipedia/commons/thumb/0/05/Flag_of_Brazil.svg/22px-Flag_of_Brazil.svg.png"
##  "//pt.wikipedia.org/wiki/Special:CentralAutoLogin/start?type=1x1"
##  "/static/images/wikimedia-button.png"
##  "/static/images/poweredby_mediawiki_88x31.png"

Veja que as fotos dos presidentes da Nova República começam no elemento 39 e vão até o 45 do vetor de links. Além de extrair esses 7 links em específicos, precisamos também completá-los com um https: para que possamos fazer o download das imagens.

fotos_presidentes <- fotos_presidentes[39:45]
# acrescentar url completa
fotos_presidentes <- str_c("https:", fotos_presidentes)

Após extrair os links das fotos, usamos o ótimo pacote magick para as trazer para o R e inseri-las sobre o gráfico gerado com o ggplot2:

# ler urls das fotos
imgs <- image_read(fotos_presidentes)

Se você digitar imgs[7], irá aparecer a foto do Michel Temer no painel Viewer do seu Rstudio.
Finalmente, depois de obter as imagens, podemos as “colar” no gráfico do ggplot2 que criamos. Por enquanto, ainda não há um jeito muito automático de posicionar corretamente as imagens em um gráfico: os parâmetros de posicionamento do código abaixo foram obtidos por meio de tentativa e erro.

w = 0.05
h = 0.15
y1 = 0.15
p + scale_y_continuous(limits = c(5000, 16000))
grid.raster(imgs[1], width = w * 1.3, height = h, x = 0.18, y = y1) # sarney
grid.raster(imgs[2], width = w, height = h, x = 0.285, y = y1) # collor
grid.raster(imgs[3], width = w, height = h, x = 0.345, y = y1) # itamar
grid.raster(imgs[4], width = w * 1.5, height = h, x = 0.50, y = y1) # fhc
grid.raster(imgs[5], width = w * 1.5, height = h, x = 0.70, y = y1) # lula
grid.raster(imgs[6], width = w * 1.5, height = h, x = 0.85, y = y1) # dilma
grid.raster(imgs[7], width = w * 1.2, height = h, x = 0.97, y = y1) # temer
unnamed chunk 4 1

Juntar as imagens geradas pelo magick com o gráfico do ggplot2 é feito por meio do pacote grid. Imagine que, ao criar um gráfico do ggplot2, o grid o interpreta como uma folha em branco, cujos eixos x e y vão de 0 a 1. Ou seja, quanto mais próximo a 1 for o argumento x da função grid.raster(), mais a direita a imagem ficará no gráfico.

Quer aprender a programar com linguagem R?

A linguagem em R é um ambiente de programação com bastante destaque na Ciência de Dados. O curso Ciência de Dados com R contará com mais de 10 aulas práticas, ao vivo para interação com os professores e execução das atividades no StudioR. 

 

Inscreva-se agora e confira todos os detalhes!