Объедините сюжет спагетти (с переменной группировки) со скрипками сплит (без него) в ggplot2 - PullRequest
3 голосов
/ 14 июня 2019

Вот минимальный воспроизводимый пример:

library(ggplot2)


mydata <- data.frame(condition = c(rep("One",40), rep("Two",40)),
                     participant = rep(1:40,2),
                     observation = c(rnorm(40,2,1), rnorm(40,0,1)))

#my.plot <- ggplot(mydata, aes(x=condition, y=observation, group=participant)) +
my.plot <- ggplot(mydata, aes(x=condition, y=observation)) +
  geom_point(size=3) +
  geom_line(size=1, alpha=0.5) +
  xlab('condition') +
  ylab('Observation') 

dataDensity <- mydata %>%
  group_by(condition) %>%
  do(data.frame(loc = density(.$observation)$x,
                dens = density(.$observation)$y,
                participant=1))

dataDensity$dens <- ifelse(dataDensity$condition == "One", .9+(dataDensity$dens * -1), 2.1+(dataDensity$dens))
my.plot + geom_polygon(data = dataDensity, aes(dens, loc, fill = condition))

Это дает мне следующий сюжет: enter image description here

Что близко к тому, что я хочу, но не совсем. Я на самом деле хочу сгруппировать каждую соответствующую пару точек между условиями «Один» и «Два». Поэтому, когда я добавляю переменную группировки (как я делаю со строкой, закомментированной в приведенном выше фрагменте), я получаю эту проблему:

enter image description here

Что интересно, но не то, что мне нужно.

Мне пришлось добавить хак / обходной путь participant=1, чтобы предотвратить сообщение об ошибке:

Ошибка в FUN (X [[i]], ...): объект «участник» не найден

Как я могу объединить разбросанные точки с группирующей переменной, но сохранить раскол скрипок независимым?

(ПРИМЕЧАНИЕ: вертикальная линия на первом графике только потому, что у меня есть geom_line)

1 Ответ

2 голосов
/ 14 июня 2019

Решение состоит в том, чтобы ограничить эстетику group только слоем geom_line.Когда вы предоставляете эстетическое отображение в родительском вызове ggplot(), все дополнительные слои наследуют эту эстетику.

my.plot2 <- ggplot(mydata, aes(x=condition, y=observation)) +
  geom_point(size=3) +
  geom_line(aes(group=participant), size=1, alpha=0.5) +
  xlab('condition') +
  ylab('Observation') 

my.plot2 + geom_polygon(data = dataDensity, aes(dens, loc, fill = condition))

enter image description here

...