No Gráfico de barras no ggplot com características ordenadas eu mostrou como criar um gráfico de barras no ggplot utilizando dados categóricos (factor) ordenados. No último ano a equipe do RStudio apresentou à comunidade R o pacote forcats, que lida com variáveis categóricas apresentando diversas funções para a criação, ordenação, mudança de níveis e muito mais operações com variáveis categóricas. Quem trabalha com R está acostumado a lidar com variáveis categóricas, variáveis do tipo factor. O objetivo aqui não é explicar variáveis categóricas (uma boa referência é o site do forcats), e sim apresentar uma proposta alternativa ao post, onde utilizo a ordenação de variáveis categóricas para obter o gráfico em barras no ggplot com as barras ordenadas. No caso, o gráfico era de volume de negociação das ações TOP 10 da data 19/nov/2015, e sem a ordenação das variáveis categóricas as colunas aparecem ordenadas pelos nomes das empresas, dificultando a visualização das TOP 10 em volume negociado. A proposta alternativa que será apresentada neste post utiliza o pacote forcats para fazer a ordenação das variáveis categóricas.

Vou começar reproduzindo o código do post original, carregando os pacotes.

library(dplyr)
library(ggplot2)
library(rbmfbovespa)

Na sequência carrego o arquivo BDIN referente a data 19/nov/2015.

bdin <- read_marketdata('datasets/BDIN-2015-11-19.txt', template='BDIN')
bdin
## Part  1: Header [1 obs. of 9 variables] 
## Part  2: Resumo Diário dos Índices [23 obs. of 38 variables] 
## Part  3: Resumo Diário de Negociações por Papel [2929 obs. of 35 variables] 
## Part  4: Resumo Diário de Negociações por Código BDI [15 obs. of 8 variables] 
## Part  5: Maiores Oscilações do Mercado a Vista [20 obs. of 10 variables] 
## Part  6: Maiores Oscilação das Ações do IBOVESPA [20 obs. of 10 variables] 
## Part  7: As Mais Negociadas no Mercado a Vista [10 obs. of 7 variables] 
## Part  8: As Mais Negociadas [30 obs. of 16 variables] 
## Part  9: Resumo Diário dos IOPV's [15 obs. of 13 variables] 
## Part 10: BDR's Não Patrocinadas - Valor de Referência [84 obs. of 6 variables] 
## Part 11: Trailer [1 obs. of 8 variables]

Note que a sétima parte do arquivo (Part 7) traz as ações mais negociadas no mercado a vista. Agora é selecionar a sétima parte e criar o gráfico em barras com ggplot2.

top <- bdin[[7]]

ggplot(data=top,
       aes(x = cod_negociacao,
           y = volume_titulos_negociados,
           fill = cod_negociacao)) +
  geom_bar(stat = 'identity') +
  labs(x = NULL, y = 'Vol.') +
  guides(fill = FALSE) +
  theme_light()

plot of chunk ordenando-factor-versao-forcats-3

Neste gráfico as barras aparecem embaralhadas (ordenadas pelos códigos de negociação das empresas).

Vou importar o pacote forcats e utilizar a função fct_reorder para fazer a ordenação. A função fct_reorder ordena a variável cod_negociacao de acordo com a variável volume_titulos_negociados, em ordem descrescente (com .desc = TRUE) porque o objetivo é colocar a maior barra a esquerda do gráfico.

library(forcats)
ggplot(data = top,
       aes(x = fct_reorder(cod_negociacao, volume_titulos_negociados, .desc = TRUE), 
           y = volume_titulos_negociados,
           fill = cod_negociacao)) +
  geom_bar(stat = 'identity') +
  labs(x = NULL, y = 'Vol.') +
  guides(fill = FALSE) +
  theme_light()

plot of chunk ordenando-factor-versao-forcats-4

A função fct_reorder ajuda porque deixa o código mais limpo comunicando explicitamente o que se pretende fazer. Por esse motivo é relevante o uso das funções do pacote forcats e diversas outras presentes no tidyverse. O objetivo de programar não é apenas resolver ver os problemas, é também comunicar o que se deseja fazer ou como fazer.