Como colocar o total em um gráfico de barras acumulado e os rótulos em cada barra?

Prezadxs , boa noite!

Preciso de uma ajuda com um gráfico no ggplot2.

Estou com dificuldade de colocar os rótulos dentro do meu gráfico de barras acumulado (horizontal) e também o total das barras no final de cada um.

Na hora de colocar os rótulos eles ficam bagunçados e errados, simplesmente não consigo fazer o número ficar dentro da barra certa.

Já para o total da barra, eu não faço a menor ideia de como colocar o valor haha.

Minha tentativa no R: (rótulos zoados e sem total)

Tentativa no excel para exemplificar o resultado final:

Agradeço a ajuda!

Segue código:

# data: 19/03/2021

# instala e carrega os pacotes necessários

# if(!require(pacman)) {install.packages("pacman")}
# pacman::p_load(magrittr, tidyverse,dataedu)
# remotes::install_github("data-edu/dataedu") # Adicionado pela Bea para o código não quebrar
# carrega apenas o pipe
library(magrittr)

# utilizando o pacote datapasta para copiar a base de dados diretamente do excel
database <- 
  tibble::tribble(
           ~tipo,  ~uf,    ~n,
          "Soja", "SC", 1288,
         "Milho", "SP",  370,
          "Soja", "PR",  331,
         "Milho", "PR",  262,
  "Soja - Velha", "SC",  179,
          "Soja", "SP",  123,
  "Soja - Velha", "PR",   56,
          "Cafe", "PR",   31,
          "Cana", "PR",   15,
          "Cafe", "SP",    1
  )

# montando gráfico
database %>%
  dplyr::mutate(tipo = forcats::fct_reorder(tipo, n)) %>%
  ggplot2::ggplot() +
  ggplot2::geom_col(ggplot2::aes(x = n, y = tipo, fill = uf)) +
  ggplot2::scale_fill_manual(
    breaks =
      c("SP", "PR", "SC"),
    values =
      c("SP" = "#FBB4AE",
        "PR" = "#CCEBC5",
        "SC" = "#B3CDE3")
  ) +
  ggplot2::labs(title = "Quantidade de linhas com duplicidade",
                x = "Quantidade de observações",
                y = "",
                fill = "Estados") +
  ggplot2::geom_label(ggplot2::aes(x = n,  y = tipo , label = n)) +
  dataedu::theme_dataedu() +
  ggplot2::theme(
    plot.title = ggplot2::element_text(hjust = 0.5),
    legend.position = c(.80, .50),
    legend.justification = c("right", "top"),
    legend.box.just = "right",
    legend.box.background = ggplot2::element_rect(color = "black", size =
                                                    .5),
  )

Tenta mover todos os aesthetics pro ggplot2::ggplot():

...
ggplot2::ggplot(ggplot2::aes(x = n, y = tipo, fill = uf, label = n)) +
  ggplot2::geom_col() +
  ggplot2::scale_fill_manual(
    breaks =
      c("SP", "PR", "SC"),
    values =
      c("SP" = "#FBB4AE",
        "PR" = "#CCEBC5",
        "SC" = "#B3CDE3")
  ) +
  ggplot2::labs(title = "Quantidade de linhas com duplicidade",
                x = "Quantidade de observações",
                y = "",
                fill = "Estados") +
  ggplot2::geom_label() +
...

Talvez você tenha também que ver os argumentos de geom_label(): nudge_x, nudge_y, label.padding etc…

1 Curtida

Boa tarde!

Jose, obrigado pela resposta.

Infelizmente não mudou muita coisa, segui sua recomendação e a única diferença é que agora o
preenchimento da label acompanha as cores que defini.

Tentei alterar alguns parâmetros no nudge_x porém ele só muda o lugar, só que no geral a ordem ainda fica bagunçada.

Att.

@maykongpedro, consegui fazendo as seguintes mudanças:

  1. Mapear o group= no geom_label() para ele saber que existem as UFs, e
  2. Adicionar position = ggplot2::position_stack(vjust = .5) para colocar as labels empilhadas, e as labels no meio de cada barra.

Você pode mudar, claro, para colocar a label em outra parte da barrinha. Ou então usar o pacote {ggrepel} para que as labels nao fiquem sobrepostas.

Para adicionar os totais, você pode fazer uma base auxiliar e colocá-la num novo geom_label()

O código completo ficou assim:

library(magrittr)

# utilizando o pacote datapasta para copiar a base de dados diretamente do excel
database <- tibble::tribble(
    ~tipo,  ~uf,    ~n,
    "Soja", "SC", 1288,
    "Milho", "SP",  370,
    "Soja", "PR",  331,
    "Milho", "PR",  262,
    "Soja - Velha", "SC",  179,
    "Soja", "SP",  123,
    "Soja - Velha", "PR",   56,
    "Cafe", "PR",   31,
    "Cana", "PR",   15,
    "Cafe", "SP",    1
  )

# Calcula base auxiliar com totais
base_auxiliar <- database %>% 
  dplyr::group_by(tipo) %>% 
  dplyr::summarise(n = sum(n))

# montando gráfico
database %>%
  dplyr::mutate(tipo = forcats::fct_reorder(tipo, n)) %>%
  ggplot2::ggplot() +
  ggplot2::geom_col(ggplot2::aes(x = n, y = tipo, fill = uf)) +
  ggplot2::scale_fill_manual(
    breaks =
      c("SP", "PR", "SC"),
    values =
      c("SP" = "#FBB4AE",
        "PR" = "#CCEBC5",
        "SC" = "#B3CDE3")
  ) +
  ggplot2::labs(
    title = "Quantidade de linhas com duplicidade",
    x = "Quantidade de observações",
    y = "",
    fill = "Estados"
  ) +
  # MUDANCAS A PARTIR DAQUI
  ggplot2::geom_text(
    ggplot2::aes(x = n, y = tipo, label = n, group = uf),
    position = ggplot2::position_stack(vjust = .5),
  ) +
  # TOTAIS
  ggplot2::geom_label(
    ggplot2::aes(x = n, y = tipo, label = n),
    nudge_x = 80,
    data = base_auxiliar
  ) +
  dataedu::theme_dataedu() +
  ggplot2::theme(
    plot.title = ggplot2::element_text(hjust = 0.5),
    legend.position = c(.80, .50),
    legend.justification = c("right", "top"),
    legend.box.just = "right",
    legend.box.background = ggplot2::element_rect(color = "black", size =                                                 .5),
  )

Created on 2021-03-25 by the reprex package (v1.0.0)

Espero que ajude!

1 Curtida

Funcionou perfeitamente, Julio!

Bom que entendi onde estava cometendo o erro. E os valores totais foi bem mais simples do que imaginei.

Muito obrigado pela ajuda!