这是一个采用2 x 2设计的包含三个主题的data.frame:
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)
我想做的是用填充条件上的一条线连接各个主题散点(例如,cond1 A和cond2 C中的sub1将连接到cond1 A和cond2 D中的sub1)。有人知道这是否可能吗?
最佳答案
这是一种方法。首先,我在表中使用spread
,因此geom_segment
的开头和结尾可以基于不同的列。然后,我将cond1
值转换为数字(这是ggplot所做的事情),并将其输入到x字段中。 x闪避偏移量为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")