Léa Simonet
Léa Simonet

Reputation: 13

Raincloud plot - histogram?

I would like to create a raincloud plot. I have successfully done it. But I would like to know if instead of the density curve, I can put a histogram (it's better for my dataset). This is my code if it can be usefull

ATSC <- ggplot(data = data, aes(y = atsc, x = numlecteur, fill = numlecteur)) +
  geom_flat_violin(position = position_nudge(x = .2, y = 0), alpha = .5) +
  geom_point(aes(y = atsc, color = numlecteur), position = position_jitter(width = .15), size = .5, alpha = 0.8) +
  geom_point(data = sumld, aes(x = numlecteur, y = mean), position = position_nudge(x = 0.25), size = 2.5) +
  geom_errorbar(data = sumld, aes(ymin = lower, ymax = upper, y = mean), position = position_nudge(x = 0.25), width = 0) +
  guides(fill = FALSE) +
  guides(color = FALSE) +
  scale_color_brewer(palette = "Spectral") +
  scale_y_continuous(breaks=c(0,2,4,6,8,10), labels=c("0","2","4","6","8","10"))+
  scale_fill_brewer(palette = "Spectral") +
  coord_flip() +
  theme_bw() +
  expand_limits(y=c(0, 10))+
  xlab("Lecteur") + ylab("Age total sans check")+
  raincloud_theme

I think we can maybe put the "geom_histogram()" but it doesn't work

Thank you in advance for your help !

(sources : https://peerj.com/preprints/27137v1.pdf https://neuroconscience.wordpress.com/2018/03/15/introducing-raincloud-plots/)

Upvotes: 1

Views: 279

Answers (1)

tjebo
tjebo

Reputation: 23737

This is actually not quite easy. There are a few challenges.

  1. geom_histogram is "horizontal by nature", and the custom geom_flat_violin is vertical - as are boxplots. Therefore the final call to coord_flip in that tutorial. In order to combine both, I think best is switch x and y, forget about coord_flip, and use ggstance::geom_boxploth instead.

  2. Creating separate histograms for each category is another challenge. My workaround to create facets and "merge them together".

  3. The histograms are scaled way bigger than the width of the points/boxplots. My workaround scale via after_stat function.

  4. How to nudge the histograms to the right position above Boxplot and points - I am converting the discrete scale to a continuous by mapping a constant numeric to the global y aesthetic, and then using the facet labels for discrete labels.

library(tidyverse)
my_data<-read.csv("https://data.bris.ac.uk/datasets/112g2vkxomjoo1l26vjmvnlexj/2016.08.14_AnxietyPaper_Data%20Sheet.csv")
my_datal <- 
  my_data %>%
  pivot_longer(cols = c("AngerUH", "DisgustUH", "FearUH", "HappyUH"), names_to = "EmotionCondition", values_to = "Sensitivity")

# use y = -... to position boxplot and jitterplot below the histogram
ggplot(data = my_datal, aes(x = Sensitivity, y = -.5, fill = EmotionCondition)) +
  # after_stat for scaling
  geom_histogram(aes(y = after_stat(count/100)), binwidth = .05,  alpha = .8) +
  # from ggstance
  ggstance::geom_boxploth( width = .1, outlier.shape = NA, alpha = 0.5) + 
  geom_point(aes(color = EmotionCondition), position = position_jitter(width = .15), size = .5, alpha = 0.8) +
  # merged those calls to one
  guides(fill = FALSE, color = FALSE) +
  # scale_y_continuous(breaks = 1, labels = unique(my_datal$EmotionCondition))
  scale_color_brewer(palette = "Spectral") +
  scale_fill_brewer(palette = "Spectral") +
  # facetting, because each histogram needs its own y
  # strip position = left to fake discrete labels in continuous scale
  facet_wrap(~EmotionCondition, nrow = 4, scales = "free_y" , strip.position = "left") +
  # remove all continuous labels from the y axis
  theme(axis.title.y = element_blank(), axis.text.y = element_blank(),
        axis.ticks.y = element_blank())

Created on 2021-04-15 by the reprex package (v1.0.0)

Upvotes: 2

Related Questions