Nuvens de Chuva

As chamadas Nuvens de Chuva não apenas incluem as informações de distribuição de um Boxplot, mas também a distribuição dos valores brutos. Pois diferentes distribuições podem levar a um mesmo Boxplot. O exemplo a seguir é de um post de blog de Cédric Scherer, onde é explicado (em inglês) muito bem por que os Boxplots às vezes não são tão bons.

Código para criar o conjunto de dados fictício

Temos um conjunto de dados fictício que resulta no seguinte Boxplot: Portanto, à primeira vista, os dados parecem ser semelhantes com base nas estatísticas do Boxplot. Vamos adicionar agora os números de casos:

Embora o mesmo Boxplot seja gerado, o número de casos por grupo é muito diferente. Agora vamos adicionar os valores brutos (geom_point()):

ggplot(
  data, 
  aes(
    x = group, 
    y = value
  )
) +
  geom_boxplot(fill = "grey92") +
  geom_point(
    size = 2,
    alpha = .3,
    position = position_jitter(
      seed = 1,
      width = .2
    )
  )

À primeira vista, já é evidente que a distribuição entre os grupos não é tão semelhante como os Boxplots podem ter sugerido.

Para incluir essas informações em um Raincloud-Plot, os dados brutos e a distribuição são plotados. Para isso, você precisa instalar e carregar a biblioteca ggdist:

install.packages("ggdist")
library("ggdist")

Da biblioteca ggdist, você utiliza a função stat_halfeye() para exibir a distribuição. Vamos dar esse primeiro passo:

ggplot(data, aes(x = group, y = value)) + 
  ## add half-violin from {ggdist} package
  stat_halfeye(
    ## custom bandwidth
    adjust = .5, 
    ## adjust height
    width = .6, 
    ## move geom to the right
    justification = -.2, 
    ## remove slab interval
    .width = 0, 
    point_colour = NA
  ) + 
  geom_boxplot(
    width = .12, 
    ## remove outliers
    outlier.color = NA ## `outlier.shape = NA` works as well
  )

Agora você vê a distribuição ao lado do Boxplot. Mas a informação dos pontos de dados brutos também foi muito útil para entender visualmente os dados. Para isso, você utiliza a função stat_dots() de ggdist.

ggplot(
  data, 
  aes(
    x = group, 
    y = value
    )
  ) + 
  stat_halfeye(
    adjust = .5, 
    width = .6, 
    justification = -.2, 
    .width = 0, 
    point_colour = NA
  ) + 
  geom_boxplot(
    width = .12, 
    outlier.color = NA 
  ) +
  ## Rohdatenpunkte hinzfügen
  stat_dots(
    # in welche Richtung die Punkt sich türmen sollen, probiere right einfach aus!
    side = "left", 
    # leichtes Einrücken von geom_boxplot()
    justification = 1.1, 
    # Größe der Punkte
    binwidth = .25
  )

Por último, você pode remover o white space limitando o eixo x:

ggplot(
  data, 
  aes(
    x = group, 
    y = value
    )
  ) + 
  stat_halfeye(
    adjust = .5, 
    width = .6, 
    justification = -.2, 
    .width = 0, 
    point_colour = NA
  ) + 
  geom_boxplot(
    width = .12, 
    outlier.color = NA 
  ) +
  ## Rohdatenpunkte hinzfügen
  stat_dots(
    # in welche Richtung die Punkt sich türmen sollen, probiere right einfach aus!
    side = "left", 
    # leichtes Einrücken von geom_boxplot()
    justification = 1.1, 
    # Größe der Punkte
    binwidth = .25
  ) + 
  # Entferne white space
  coord_cartesian(
  xlim = c(
      1.2,
      NA
    )
  )

Quando você tem muitos pontos de dados e muitos grupos, a visualização com stat_dots() às vezes pode ser confusa. Alternativamente, você pode usar: geom_halfpoint()!

ggplot(
  data, 
  aes(
    x = group, 
    y = value
    )
  ) + 
  stat_halfeye(
    adjust = .5, 
    width = .6, 
    justification = -.2, 
    .width = 0, 
    point_colour = NA
  ) + 
  geom_boxplot(
    width = .12, 
    outlier.color = NA 
  ) +
  geom_half_point(
    # links ausgerichtet
    side = "l", 
    ## horizontale Linien anstatt Punkten
    shape = 95,
    # kein jittern
    range_scale = 0,
    size = 10, 
    alpha = .2
  ) + 
  # Entferne white space
  coord_cartesian(
  xlim = c(
      1.2,
      NA
    )
  )

Ou com pontos jitterizados:

ggplot(
  data, 
  aes(
    x = group, 
    y = value
    )
  ) + 
  stat_halfeye(
    adjust = .5, 
    width = .6, 
    justification = -.2, 
    .width = 0, 
    point_colour = NA
  ) + 
  geom_boxplot(
    width = .12, 
    outlier.color = NA 
  ) +
  geom_half_point(
    # Ausrichtung links
    side = "l", 
    # jittering
    range_scale = .4, 
    # Transparenz
    alpha = .3
  ) + 
  coord_cartesian(
  xlim = c(
      1.2,
      NA
    )
  )

Portanto, um Raincloud fornece uma visão muito melhor do que um Boxplot!