Colorir apenas uma barra do gráfico com ggplot2

Essa pergunta foi enviada na aula sobre ggplot2, no curso R para Ciência de Dados I.

Como destacaria apenas uma barra com alguma cor?

# Carregar pacotes --------------------------------------------------------

library(tidyverse)

# Ler base IMDB -----------------------------------------------------------

imdb <- readr::read_csv("https://raw.githubusercontent.com/curso-r/main-r4ds-1/master/dados/imdb.csv")
#> 
#> ── Column specification ────────────────────────────────────────────────────────
#> cols(
#>   titulo = col_character(),
#>   ano = col_double(),
#>   diretor = col_character(),
#>   duracao = col_double(),
#>   cor = col_character(),
#>   generos = col_character(),
#>   pais = col_character(),
#>   classificacao = col_character(),
#>   orcamento = col_double(),
#>   receita = col_double(),
#>   nota_imdb = col_double(),
#>   likes_facebook = col_double(),
#>   ator_1 = col_character(),
#>   ator_2 = col_character(),
#>   ator_3 = col_character()
#> )

imdb <- imdb %>% mutate(lucro = receita - orcamento)


# Número de filmes dos diretores da base
imdb %>% 
  filter(!is.na(diretor)) %>% 
  count(diretor) %>%
  top_n(10, n) %>%
  ggplot() +
  geom_col(aes(y = diretor, x = n))

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

Olá!

Para responder, vamos imaginar que queremos destacar apenas o Tim Burton. E a cor escolhida é roxo!
Uma forma de resolver é:

  1. Criar uma variável que indica qual diretor deve ser colorido ou não.
  2. Usar essa variável para colorir no aesthetics fill.
  3. Esconder a legenda criada, pois nesse caso ela não agrega.
  4. E usar uma escala manual para indicar a cor que queremos pintar.

Segue o código:

# Carregar pacotes --------------------------------------------------------

library(tidyverse)

# Ler base IMDB -----------------------------------------------------------

imdb <- readr::read_csv("https://raw.githubusercontent.com/curso-r/main-r4ds-1/master/dados/imdb.csv")
#> 
#> ── Column specification ────────────────────────────────────────────────────────
#> cols(
#>   titulo = col_character(),
#>   ano = col_double(),
#>   diretor = col_character(),
#>   duracao = col_double(),
#>   cor = col_character(),
#>   generos = col_character(),
#>   pais = col_character(),
#>   classificacao = col_character(),
#>   orcamento = col_double(),
#>   receita = col_double(),
#>   nota_imdb = col_double(),
#>   likes_facebook = col_double(),
#>   ator_1 = col_character(),
#>   ator_2 = col_character(),
#>   ator_3 = col_character()
#> )
imdb <- imdb %>% mutate(lucro = receita - orcamento)


# Número de filmes dos diretores da base
imdb %>%
  filter(!is.na(diretor)) %>%
  count(diretor) %>%
  top_n(10, n) %>%
  # Criar uma variável que indica qual (ou quais) diretor deve ser colorido
  mutate(diretor_colorido = case_when(diretor == "Tim Burton" ~ TRUE,
                                      TRUE ~ FALSE)) %>%
  ggplot() +
  # Colorir usando a variável criada
  geom_col(aes(y = diretor, x = n, fill = diretor_colorido)) +
  # Esconder a legenda
  theme(legend.position = "none") +
  # Criar a escala de cores: quero deixar o Tim em roxo!
  scale_fill_manual(values = c("darkgray", "purple"))

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

1 curtida

Você também pode usar o pacote {gghighlight}: https://livro.curso-r.com/8-2-extensões-do-pacote-ggplot2.html#gghighlight

library(tidyverse)
imdb <- readr::read_csv("https://raw.githubusercontent.com/curso-r/main-r4ds-1/master/dados/imdb.csv")

imdb %>% 
  mutate(lucro = receita - orcamento) %>% 
  filter(!is.na(diretor)) %>%
  count(diretor) %>%
  top_n(10, n) %>%
  ggplot() +
  # Colorir usando a variável criada
  geom_col(
    aes(y = diretor, x = n),
    fill = "purple"
  ) +
  gghighlight::gghighlight(diretor == "Tim Burton")

Created on 2021-03-15 by the reprex package (v0.3.0)

2 curtidas

Não conhecia este recurso. Muito legais as soluções.