Comportamento inesperado: ggplot2 + rev(y)

Eu fui fazer um ggplot e daí apliquei aes(y = rev(y)) pra inverter a ordem dos valores de Y. Mas o resultado foi bem diferente do que eu esperava! Abaixo tem um exemplo. Vocês que isso está certo? Ou seria um bug que mereceria reportar?

OBS: eu esperava que ambos os gráficos mostrassem uma coluna em A e um quadrado em B.

library(tidyverse)
data <- tibble(
    group = c("A", "B"),
    x = list(1, 1:3),
    y = list(1:8, 1:3)
) %>%
    unnest(x) %>%
    unnest(y)

data
#> # A tibble: 17 x 3
#>    group     x     y
#>    <chr> <dbl> <int>
#>  1 A         1     1
#>  2 A         1     2
#>  3 A         1     3
#>  4 A         1     4
#>  5 A         1     5
#>  6 A         1     6
#>  7 A         1     7
#>  8 A         1     8
#>  9 B         1     1
#> 10 B         1     2
#> 11 B         1     3
#> 12 B         2     1
#> 13 B         2     2
#> 14 B         2     3
#> 15 B         3     1
#> 16 B         3     2
#> 17 B         3     3

p <- data %>%
    ggplot(aes(x = x, fill = x+y)) +
    geom_tile() +
    facet_wrap(~group)

sem rev()

p + aes(y = y)

com rev()

p + aes(y = rev(y))

Created on 2020-12-30 by the reprex package (v0.3.0)

Acho que rev() inverte o vetor (numérico), não os níveis (fator). Para desenhar o quadrado, o {ggplot2} vai transformar em vetor em factor antes de plotar, que vai ficar igual pois rev(y) continua sendo um inteiro.

Talvez o que você queira fazer é fct_rev()?

library(tidyverse)
data <- tibble(
  group = c("A", "B"),
  x = list(1, 1:3),
  y = list(1:8, 1:3)
) %>%
  unnest(x) %>%
  unnest(y)

data
#> # A tibble: 17 x 3
#>    group     x     y
#>    <chr> <dbl> <int>
#>  1 A         1     1
#>  2 A         1     2
#>  3 A         1     3
#>  4 A         1     4
#>  5 A         1     5
#>  6 A         1     6
#>  7 A         1     7
#>  8 A         1     8
#>  9 B         1     1
#> 10 B         1     2
#> 11 B         1     3
#> 12 B         2     1
#> 13 B         2     2
#> 14 B         2     3
#> 15 B         3     1
#> 16 B         3     2
#> 17 B         3     3

p <- data %>%
  ggplot(aes(x = x, fill = x+y)) +
  geom_tile() +
  facet_wrap(~group)

p + aes(y = fct_rev(factor(y)))

Created on 2020-12-30 by the reprex package (v0.3.0)

EDIT: coloquei factor(y) para garantir que o y seja transformado em fator com as.factor() e não as_factor(), já que são diferentes.

1 Curtida