Как наложить средние значения и планки погрешностей на точки дрожания и плавное распределение с помощью ggplot2 в R?

Чтобы получить полное представление о наборах данных, одно из решений состоит в том, чтобы показать средние значения вместе с некоторыми планками погрешностей вокруг средних значений, а также неустойчивыми точками отдельных оценок и, наконец, сглаженным распределением этих оценок. Например, введите здесь описание изображения взято из Ян, Б.В. и др. (2021).

Как мы можем наложить точки, полосы погрешностей, точки дрожания и гистограмму на один и тот же график с небольшим интервалом между ними?

Для иллюстрации предположим, что данные

x1=c(2.0,2.1,2.5,2.7,2.8,3.1)
x2=c(2.5,2.9,3.0,3.2,3.3,3.9)
x=data.frame(cbind(x1,x2))

и что статистика, используемая для построения точек и планок погрешностей,

group = c(1, 2)
centr = c(2.53, 3.13) 
width = c(0.50, 0.50) 
stats = data.frame( cbind(group, centr, centr-width, centr+width ) )

Мне удалось сделать график с точками и планками ошибок с

ggplot( stats ) +
    geom_point( aes(x=group, y=centr, size = 1) ) +
    geom_errorbar(stat="identity", position=position_dodge(.9), aes( x=group, ymin=V3, ymax=V4), width=0.1 ) +
    scale_y_continuous("mean ratings") 

и точки дрожания с

ggplot( x ) +
    geom_jitter( aes( y= x1, x = 1, col=1), width=0.15 ) + 
    geom_jitter( aes( y= x2, x = 2, col=2), width=0.15 )

но я понятия не имею, что касается сглаженных распределений.

Кроме того, если я хочу, чтобы две группы данных были разделены (точка первой группы, полоса ошибок, точки дрожания и гистограмма слева, скажем, и точка второй группы, полоса ошибок, точки дрожания и гистограмма справа), какие изменения потребуются?


person Denis Cousineau    schedule 28.02.2021    source источник
comment
Недавно я узнал, что этот макет сюжета называется графиком дождевых облаков. См. Allen et al., 2019, чтобы узнать о геометрии, совместимой с ggplot2.   -  person Denis Cousineau    schedule 24.04.2021


Ответы (1)


В основном вы можете достичь желаемого результата следующим образом:

  1. Преобразуйте набор данных x в длинный формат
  2. Чтобы добавить плотности, поменяйте местами x и y и используйте вместо них coord_flip.
  3. Чтобы расположить полосы ошибок и точки дрожания, установите y=-2/-1
  4. Чтобы получить желаемый график, где группы данных разделены, вы можете фасетировать по группам, но удалить panel.spacing и strip.text
x1 <- c(2.0, 2.1, 2.5, 2.7, 2.8, 3.1)
x2 <- c(2.5, 2.9, 3.0, 3.2, 3.3, 3.9)
x <- data.frame(cbind(x1, x2))

x_long <- tidyr::pivot_longer(x, everything(), names_prefix = "x", names_to = "group")
x_long$group <- as.integer(x_long$group)

group <- c(1, 2)
centr <- c(2.53, 3.13)
width <- c(0.50, 0.50)
stats <- data.frame(cbind(group, centr, centr - width, centr + width))

library(ggplot2)

ggplot(stats, aes(color = factor(group))) +
  geom_point(aes(y = -2, x = centr), size = 1) +
  geom_errorbar(stat = "identity", aes(y = -2, xmin = V3, xmax = V4), width = 0.1) +
  geom_jitter(data = x_long, aes(x = value, y = -1), width = 0.1) +
  geom_density(data = x_long, aes(x = value, fill = factor(group), group = group), alpha = .7) +
  scale_x_continuous("mean ratings") +
  scale_y_continuous(expand = c(0, .2)) +
  coord_flip() +
  facet_wrap(~group) +
  theme(axis.text.x = element_blank(), axis.title.x = element_blank(), axis.ticks.x = element_blank(),
        panel.spacing.x = unit(0, "pt"),
        strip.text.x = element_blank()) +
  labs(color = NULL, fill = NULL)

person stefan    schedule 28.02.2021
comment
Большое спасибо за быстрый и подробный ответ! - person Denis Cousineau; 01.03.2021