Skip to Content

Minha tentativa de reproduzir um gráfico do FiveThirtyEight com o ggplot2

Visualizacao de Dados


Introdução

Se você usar o código ou as informações deste guia em um trabalho publicado, solicito que cite-o como uma fonte nas referências bibliográficas.

DUTT-ROSS,Steven Visualização de dados no R. Rio de Janeiro. 2020. mimeo. Disponível em: https://blog.metodosquantitativos.com/api/


Você não precisa usar o R… pode usar o Python também.


Outro dia encontrei uma visualização de dados do site FiveThirtyEight. Era uma informação sobre a visão dos economistas sobre o desemprego. O gráfico parecia um box-plot só que mais bonito. Tinha uma informação sobre os percentis. Muito interessante.

Penso em usar esse gráfico nos meus próximos relatórios. Será que é dificil reporduzí-lo? O desafio estava feito. Provavelmente esse gráfico foi desenvolvido com o Adobe Illustrator, mas quero refazê-lo com o ggplot.

A Imagem do FiveThirtyEight

A visualização de dados do FiveThirtyEight é essa aqui.

Etapa 1 - Carregar a biblioteca

LI<- c(6, 7, 7, 7.5, 7.4, 7.5, 7.5, 7.0,8.1,8.1,8.1,8.1,5,7.0,7.0,8.1,8.1,8.1,7.5,7.0,8.1,8.1,8,9.8,9.8,9.6,9.6,8.1,7.0,8.1,10,9.8)
media<-c(8, 8, 9, 9  , 9.2, 9.4, 9.5, 10,10 ,10,10,10,10,10,10,10,10,10,10,10,10,10,10.1,10.2,10.3,11,11,11,11,12,12,13)
LS<-   c(11,12,11,11,10.9,12,12,12,12,12,12,12,14,14,14,14,14,14,17,18,18,18,14,12,14.5,14,14,16,18,15,16,18)
economista<-1:32
dados<-data.frame(LI,media,LS,economista)
dados$economista<-as.factor(dados$economista)

Etapa 2 - Carregar as bibliotecas

Nesse exercício, vamos usar duas bibliotecas: 1 - ggplot, 2 - magrittr (por causa do pipe).

library("ggplot2")
library(magrittr)

Acho que o primeiro passo será geraro ponto.

dados %>%
  ggplot(aes(x=economista, y=media, group=1)) +
  geom_point(shape=21, size=3, fill="white") 

Depois, vamos gerar a barra com o comando geom_linerange

dados %>%
  ggplot(aes(x=economista, y=media, group=1)) +
  geom_linerange(aes(ymin=LI, ymax=LS), colour="darkgreen", size = 2)+ 
  geom_point(shape=21, size=3, fill="white") 

Em seguida, vamos transpor o gráfico com o comando coord_flip().

dados %>%
  ggplot(aes(x=economista, y=media, group=1)) +
  geom_linerange(aes(ymin=LI, ymax=LS), colour="#8fb08d",alpha=0.5, size = 2)+ 
  geom_point(shape=21, size=3.5, fill="#50a64b") +
  coord_flip()

Agora, vamos colocar algumas anotações.

dados %>%
  ggplot(aes(x=economista, y=media, group=1)) +
  geom_linerange(aes(ymin=LI, ymax=LS), colour="#8fb08d",alpha=0.5, size = 2)+ 
  geom_point(shape=21, size=3.5, fill="#50a64b") +
  coord_flip()+
  annotate(geom = "text", x = 23, y = 5, label = "Expert consensus", hjust = "left")+
  annotate(geom = "text", x = 26, y = 4, label = "Cada barra é um \n intervalo com 80% \n de confiança", hjust = "left",label = "italic(R) ^ 2 == 0.75")

Vamos colocar também uma seta.

dados %>%
  ggplot(aes(x=economista, y=media, group=1)) +
  geom_linerange(aes(ymin=LI, ymax=LS), colour="#8fb08d",alpha=0.5, size = 2)+ 
  geom_point(shape=21, size=3.5, fill="#50a64b") +
  coord_flip()+
  annotate(geom = "text", x = 23, y = 5, label = "Expert consensus", hjust = "left")+
  annotate(geom = "text", x = 26, y = 4, label = "Cada barra é um \n intervalo com 80% \n de confiança", hjust = "left",label = "italic(R) ^ 2 == 0.75",colour="gray")+
  annotate(geom = "curve", x = 27, y = 6, xend = 29, yend = 8, curvature = .3, arrow = arrow(length = unit(2, "mm")) ) 

# dados2<-dados[32,]
# p<- dados2 %>%
#     ggplot(aes(x=economista, y=media, group=1)) +
#     geom_linerange(aes(ymin=LI, ymax=LS), colour="#8fb08d",alpha=0.5, size = 2)+ 
#     geom_point(shape=21, size=3.5, fill="#50a64b") +
#     coord_flip()
# dados3<-dados[1:31,]
# 
# q<- dados3 %>%
#   ggplot(aes(x=economista, y=media, group=1)) +
#   geom_linerange(aes(ymin=LI, ymax=LS), colour="#8fb08d",alpha=0.5, size = 2)+ 
#   geom_point(shape=21, size=3.5, fill="#50a64b") +
#   coord_flip()+
#   annotate(geom = "text", x = 23, y = 5, label = "Expert consensus", hjust = "left")+
#   annotate(geom = "text", x = 26, y = 4, label = "Cada barra é um \n intervalo com 80% \n de confiança", hjust = "left",label = "italic(R) ^ 2 == 0.75",colour="gray")+
#   annotate(geom = "curve", x = 27, y = 6, xend = 29, yend = 8, curvature = .3, arrow = arrow(length = unit(2, "mm")) ) 
# library(ggpubr)
# ggarrange(p, q, ncol = 1, nrow = 2)

Agora vamos terminar.Inseri dois espaços extras para fazer os comentários (percentil 10, percentil 90 e melhor estimativa). também vou inserir o título e o sub-título. Vou remover o rótulo dos eixos.

LI<- c(6, 7, 7, 7.5, 7.4, 7.5, 7.5, 7.0,8.1,8.1,8.1,8.1,5,7.0,7.0,8.1,8.1,8.1,7.5,7.0,8.1,8.1,8,9.8,9.8,9.6,9.6,8.1,7.0,8.1,10,NA, 9.8,NA)
media<-c(8, 8, 9, 9  , 9.2, 9.4, 9.5, 10,10 ,10,10,10,10,10,10,10,10,10,10,10,10,10,10.1,10.2,10.3,11,11,11,11,12,12,NA, 13,NA)
LS<-   c(11,12,11,11,10.9,12,12,12,12,12,12,12,14,14,14,14,14,14,17,18,18,18,14,12,14.5,14,14,16,18,15,16,NA,18,NA)
economista<-1:34
dados<-data.frame(LI,media,LS,economista)
dados$economista<-as.factor(dados$economista)

p<-dados %>%
  ggplot(aes(x=economista, y=media, group=1)) +
  geom_linerange(aes(ymin=LI, ymax=LS), colour="#8fb08d",alpha=0.5, size = 5)+ 
  geom_point(shape=21, size=5, fill="#50a64b") +
  coord_flip()+
    annotate(geom = "text", x = 32, y = 9.8, label = "percentil 10", hjust = "right",size = 5,family = "serif",colour="#545454")+
    annotate(geom = "text", x = 32, y = 18, label = "percentil 90", hjust = "left",size = 5,family = "serif",colour="#545454")+
    annotate(geom = "text", x = 34, y = 12, label = "melhor estimativa", hjust = "left",size = 5,family = "serif",colour="#545454")+
  annotate(geom = "text", x = 23, y = 7.8, label = "Consenso dos especialistas", hjust = "right",size = 5,family = "serif")+
  annotate(geom = "text", x = 26, y = 6, label = "Cada barra é um \n intervalo com 80% \n de confiança", hjust = "right",label = "italic(R) ^ 2 == 0.75",colour="#545454",size = 5,family = "serif")+
  annotate(geom = "curve", x = 27, y = 6, xend = 29, yend = 8, curvature = .3, arrow = arrow(length = unit(2, "mm")) )+
  annotate("segment", x = 32.5, xend = 33, y = 9.7, yend = 9.8)+
  annotate("segment", x = 32.5, xend = 33, y = 18.1, yend = 18)+
  ylim(4.7, 18.5)


p+ labs(title = "Economistas são pessimistas",
              subtitle = "Estimativas dos especialista",caption = "Fonte do gráfico:FiveThirtyEight")+
  xlab(" ")+
  ylab(" ")

Ok! Eu concordo com você. O gráfico original ainda é muito mais bonito que o meu. Mas estou chegando perto, não?

Para saber sobre outras funções no R e no Python, você pode acessar o meu blog https://blog.metodosquantitativos.com/ ou o meu site pessoal https://steven.metodosquantitativos.com/