No começo da semana, recebi um pedido de ajuda de um seguidor que estava travado em um pequeno detalhe do seu projeto.
Ele estava criando uma animação e tentando colocar as bandeiras dos estados brasileiros em seu gráfico.
O projeto já estava adiantado e o que ele tinha feito chamou a minha atenção:
Ou seja, o gráfico seguia uma lógica interessante. Ele mostrava as quantidades de mortes por cada 100 mil pessoas ao passar dos dias e para os 10 piores estados.
Ele está nos contando a história do que aconteceu desde março até julho. E, ao mesmo tempo, comparando a evolução dos estados.
Storytelling é a arte de contar histórias.
É um artifício utilizado por todos nós há milhares de anos.
Contamos histórias para criar um laço mais forte com pessoas próximas, com potenciais clientes ou até para facilitar a compreensão de uma explicação que seria difícil.
Dentro da Ciência de Dados, um campo importante é o Data Storytelling.
Ou seja, contamos história usando dados.
O seu projeto terá mais valor quando mostrar os resultados de uma forma simples, limpa e seguindo uma lógica.
Imagine que um professor sabe absolutamente tudo da matéria, porém, nenhum aluno consegue entender o que ele está falando.
Ele será menos útil do que um outro professor que, talvez não saiba tanto, mas é eficiente ao passar a sua mensagem.
E contar história tem tudo a ver com isso. Estamos acostumados a escutar histórias desde quando éramos crianças.
Isso facilitará o entendimento da sua audiência e, além disso, torna o seu trabalho mais interessante.
Agora, com a devida permissão, vou compartilhar com vocês o código desenvolvido pelo Francisco, o seguidor que me enviou esse projeto pela Instagram.
Para criar o gráfico, usei as bandeiras de todos os estados brasileiros. Caso você queira reproduzir o código em seu computador, faça o download das bandeiras clicando aqui.
Irei deixar os dados disponíveis em nesse link
library(readr)
dados_estados <- read_delim("dados_estados.txt",
"\t", escape_double = FALSE, trim_ws = TRUE)
head(dados_estados)
## # A tibble: 6 x 5
## estado data populacaoTCU2019 casosAcumulado obitosAcumulado
## <chr> <date> <dbl> <dbl> <dbl>
## 1 RO 2020-02-25 1777225 0 0
## 2 RO 2020-02-26 1777225 0 0
## 3 RO 2020-02-27 1777225 0 0
## 4 RO 2020-02-28 1777225 0 0
## 5 RO 2020-02-29 1777225 0 0
## 6 RO 2020-03-01 1777225 0 0
Caso tenha alguma dúvida sobre como ler os seus dados no R, sugiro que consulte esse outro post: luisotavio.pro/blog/como-ler-um-arquivo-de-texto-txt-ou-csv-no-r-ou-rstudio/
Também foi criada uma tabela que irá nos auxiliar na leitura da imagem da bandeira de cada estado:
bandeiras<- data.frame(estado = c("AC","AL","AM","AP","BA","CE","DF","ES",
"GO","MA","MG","MS","MT","PA","PB","PE",
"PI","PR","RJ","RN","RO","RR","RS","SC",
"SE","SP","TO"),
imagem = c("AC.png","AL.png","AM.png","AP.png","BA.png",
"CE.png","DF.png","ES.png","GO.png","MA.png",
"MG.png","MS.png","MT.png","PA.png","PB.png",
"PE.png","PI.png","PR.png","RJ.png","RN.png",
"RO.png","RR.png","RS.png","SC.png","SE.png",
"SP.png","TO.png"),stringsAsFactors = F)
head(bandeiras)
## estado imagem
## 1 AC AC.png
## 2 AL AL.png
## 3 AM AM.png
## 4 AP AP.png
## 5 BA BA.png
## 6 CE CE.png
Iremos criar uma nova coluna mortalidade.100hab com a quantidade de óbitos por 100 mil habitantes.
library(dplyr)
mortalidade<-dados_estados %>%
#criar coluna com óbitos por 100 mil habitantes
mutate(mortalidade.100hab=(obitosAcumulado/populacaoTCU2019)*100000)
#selecionar colunas que serão úteis
mortalidade<- select(mortalidade,estado,data,obitosAcumulado,mortalidade.100hab)
Para uma melhor experiência na visualização dos dados, não iremos mostrar todos os estados em nosso gráfico.
O gráfico irá mostrar os 10 estados com as maiores taxas de óbito para cada dia.
Portanto, para filtrar essas informações, iremos executar o script a seguir:
mortalidade <- mortalidade %>%
# Aqui separamos as informações por dia.
group_by(data) %>%
# Criar um ranking decrescente de mortalidade entre os estados para cada dia
dplyr::mutate(rank = rank(-mortalidade.100hab)) %>%
# selecionando os 10 maiores registros por dia.
filter(rank <=10) %>%
ungroup()
#arredondar o resultado para 2 casas decimais
mortalidade$mortalidade.100hab <- round(mortalidade$mortalidade.100hab , digits = 2)
head(mortalidade)
## # A tibble: 6 x 5
## estado data obitosAcumulado mortalidade.100hab rank
## <chr> <date> <dbl> <dbl> <dbl>
## 1 RO 2020-03-31 1 0.06 8
## 2 RO 2020-04-01 1 0.06 9
## 3 RO 2020-04-02 1 0.06 10
## 4 AC 2020-04-08 2 0.23 9
## 5 AC 2020-04-09 2 0.23 10
## 6 AC 2020-04-16 5 0.570 10
A nossa última manipulação de dados irá acrescentar as bandeiras aos nossos dados e criar rankings auxiliares.
Esses rankings auxiliares irão nos ajudar para ordenarmos os nossos dados de forma que tudo se encaixe na criação do gráfico.
im_mort <- mortalidade %>%
# acrescentando as bandeiras na tabela de mortalidade
left_join(bandeiras, by = "estado") %>%
group_by(estado) %>%
dplyr::arrange(data) %>%
dplyr::mutate(prev.rank = lag(rank)) %>%
ungroup() %>%
group_by(data) %>%
dplyr::arrange(rank, prev.rank) %>%
dplyr::mutate(x = seq(1, n())) %>%
ungroup()
head(im_mort)
## # A tibble: 6 x 8
## estado data obitosAcumulado mortalidade.100~ rank imagem prev.rank
## <chr> <date> <dbl> <dbl> <dbl> <chr> <dbl>
## 1 SP 2020-03-18 4 0.01 1 SP.png 1
## 2 SP 2020-03-21 15 0.03 1 SP.png 1
## 3 SP 2020-03-22 22 0.05 1 SP.png 1
## 4 SP 2020-03-23 30 0.07 1 SP.png 1
## 5 SP 2020-03-24 40 0.09 1 SP.png 1
## 6 SP 2020-03-25 48 0.1 1 SP.png 1
## # ... with 1 more variable: x <int>
Antes de criar a nossa animação, iremos criar gráficos estáticos
library(gganimate)
library(hrbrthemes)
library(png)
library(ggimage)
staticplot.m<-ggplot(im_mort, aes(rank, group = estado)) +
geom_tile(aes(y = mortalidade.100hab/2,
height = mortalidade.100hab,
width = 0.7), alpha = 1,
fill ="#590000",color = "#590000") +
geom_image(aes(x = x, image = imagem), y = 0, # Adicionar a bandeira
size = 0.1, hjust = 0,
inherit.aes = FALSE) +
geom_text(aes(y=mortalidade.100hab,label = mortalidade.100hab,
hjust=0),colour="#ffffff", size=6,fontface="bold")+
geom_text(aes(y = mortalidade.100hab, label = paste(estado, "")),
colour="#ffffff",
hjust = 1, size=6, fontface="bold") +
geom_text(aes(y = mortalidade.100hab, label ="",
hjust=2))+
coord_flip(clip = "off", expand = FALSE) +
scale_y_continuous(labels = scales::comma) +
scale_x_reverse() +
guides(color = FALSE, fill = FALSE) +
theme(axis.line=element_blank(),
axis.text.x=element_blank(),
axis.text.y=element_blank(),
axis.ticks=element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_blank(),
legend.position="none",
panel.background=element_rect(fill = "grey8", colour = "grey8"),
panel.border=element_blank(),
panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
plot.title=element_text(size=25, hjust=0.5, face="bold", colour="White", vjust=-1),
plot.subtitle=element_text(size=20, hjust=0.5, face="italic", color="White"),
plot.caption =element_text(size=20, hjust=0.5, face="italic", color="White"),
plot.background=element_rect(fill = "grey8", colour = "grey8"),
plot.margin = margin(1,4, 4, 4, "cm"))
anim.m<- staticplot.m + transition_states(data, transition_length = 2, state_length = 1)+
view_follow(fixed_x = TRUE) +
labs(title = 'Mortalidade COVID-19 no \n Brasil:{closest_state}',
subtitle = "Top 10 estados",
caption = "Óbitos por 100 mil hab.|Fonte: covid.saude.gov.br
@FranciscoTadeuFoz")
library(gifski)
animate(anim.m, 100, fps = 10, width = 1200, height = 1000,
renderer = gifski_renderer("covid_estados.gif"))
Faça parte do nosso grupo exclusivo e receba as novidades mais interessantes sobre Data Sciente e R em primeira mão.