TransWikia.com

Rotulo dos dados em gráficos de colunas na posição "dodge" no R

Stack Overflow em Português Asked on February 7, 2021

Estou trabalhando com o seguinte data frame:

library(tidyverse)

df<- data.frame(Ano=c(2017, 2018,2019,2020), Vagas=c(16, 14, 27, 32), Inscritos=c(70, 107,74,88), Aprovados=c(15,14,17, 12))

df

 Ano Vagas Inscritos Aprovados
1 2017    16        70        15
2 2018    14       107        14
3 2019    27        74        17
4 2020    32        88        12

Preciso expressar isso na forma de um gráfico de colunas.
Então, converto para o formato tidy como "gather"

df2<-df %>% 
  gather(Condicao, n, c(Vagas:Aprovados))

Ano  Condicao   n
1  2017     Vagas  16
2  2018     Vagas  14
3  2019     Vagas  27
4  2020     Vagas  32
5  2017 Inscritos  70
6  2018 Inscritos 107
7  2019 Inscritos  74
8  2020 Inscritos  88
9  2017 Aprovados  15
10 2018 Aprovados  14
11 2019 Aprovados  17
12 2020 Aprovados  12

Eu gostaria de expressar os dados na forma de colunas lado a lado.
Então uso o geom_col() com a posição dodge

df2 %>% 
  ggplot()+
  geom_col(aes(Ano, n, fill=Condicao), position="dodge")

grafico 1

Consigo criar os labels usando o geom_label():

df2 %>% 
  ggplot(aes(Ano, Condicao, label = n))+
  geom_label(aes(Ano, n, label=n))

grafico 2

No entanto, não consigo juntar ambos da forma correta.

Tentei:

df2 %>% 
  ggplot()+
  geom_col(aes(Ano, n, fill=Condicao), position="dodge")+
  geom_label(aes(Ano, n, label=n), position = "dodge")

inserir a descrição da imagem aqui

A minha intenção é que os rótulos estejam ALINHADOS às suas respectivas colunas:

2 Answers

Pode resolver o problema com

  1. Por aes(Ano, n) na chamada inicial a ggplot. Isto simplifica as geom_* seguintes uma vez que partilham os valores dos eixos.
  2. Definir a variável de agrupamento das barras também logo no início. Fica então aes(Ano, n, group = Condicao).
  3. Usar position_dodge(width = 1) em geom_label.

O gráfico final é o seguinte.

df2 %>% 
  ggplot(aes(Ano, n, group = Condicao)) +
  geom_col(aes(fill = Condicao), position = position_dodge()) +
  geom_label(aes(label = n), position = position_dodge(width = 1))

inserir a descrição da imagem aqui

Answered by Rui Barradas on February 7, 2021

Você pode utilizar position = position_dodge(width = 1)

Código:

df2 %>% 
  ggplot(aes(Ano, n, fill=Condicao))+
  geom_bar(stat = 'identity', position="dodge") +
  geom_label(aes(Ano, n, label= n), position = position_dodge(width = 1))

Answered by lmonferrari on February 7, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP