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
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
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
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!