Сопряжение точек разброса с линиями через условие заполнения участка скрипки - PullRequest
0 голосов
/ 15 октября 2018

Вот фрейм data.frame с тремя предметами в дизайне 2 на 2:

x<-data.frame("sub" = rep(c("sub1","sub2","sub3"),times=4),
          "cond1" = rep(c("A","B"),times=c(6,6)),
          "cond2" = rep(c("C","C","C","D","D","D"),times=2),
          "score" = c(6,5,4, 5,4,3, 4,3,2, 3,2,1))

Вот график разделения скрипки (для функции, https://gist.github.com/Karel-Kroeze/746685f5613e01ba820a31e57f87ec87):

dodge <- position_dodge(width=.5)
ggplot(x, aes(x=cond1, y=score, fill=cond2))+
  geom_split_violin(trim = F)+
  geom_point(shape=16,position=dodge)

2 by 2 split violin plot

То, что я хотел бы сделать, это соединить отдельные точки рассеяния субъекта с линией поперек условия заполнения (например, sub1 в cond1 A и cond2 C соединятся с sub1 в cond1 A и cond2 D)Кто-нибудь знает, возможно ли это?

1 Ответ

0 голосов
/ 15 октября 2018

Вот подход.Во-первых, я spread таблица, поэтому начало и конец geom_segment могут основываться на разных столбцах.Затем я конвертирую значения cond1 в числовые значения (что и делает ggplot под капотом) и подаю их в поля x.Смещение x dodge, равное 0.12, было ручным, но, вероятно, есть хитрый способ (помимо моего нынешнего понимания) использовать настройки ggplot для автоматического определения этого.

library(tidyverse)
dodge <- position_dodge(width=.5)
ggplot(x, aes(x=cond1, y=score, fill=cond2))+
  geom_split_violin(trim = F)+
  geom_point(shape=16,position=dodge) +
  geom_segment(data = x %>% spread(cond2, score),
               aes(x    = as.numeric(cond1) - 0.12, 
                   xend = as.numeric(cond1) + 0.12,
                   y = C, yend = D), inherit.aes = FALSE, color = "black")

enter image description here

...