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/