R 使用ggplot2在分割小提琴图上叠加散射点

R 使用ggplot2在分割小提琴图上叠加散射点,r,ggplot2,scatter-plot,violin-plot,R,Ggplot2,Scatter Plot,Violin Plot,我按照“好答案”生成了2x2设计的分裂小提琴图 现在假设这些数据来自不同受试者的重复测量。此外,我还想在散点图中绘制单个数据(我知道该图可能会太忙,我想先看看) 我就快到了,但有一个小错误很容易修复。我提供了一个完整的工作示例,以防有更好的方法来实现这一点 第一部分我直接从上一个问题中抄袭: library(dplyr) library(ggplot2) set.seed(20160229) 我在数据框中添加了sub,因为我想绘制每个主题的平均值 my_data = data.frame(

我按照“好答案”生成了2x2设计的分裂小提琴图

现在假设这些数据来自不同受试者的重复测量。此外,我还想在散点图中绘制单个数据(我知道该图可能会太忙,我想先看看)

我就快到了,但有一个小错误很容易修复。我提供了一个完整的工作示例,以防有更好的方法来实现这一点

第一部分我直接从上一个问题中抄袭:

library(dplyr)
library(ggplot2)

set.seed(20160229)
我在数据框中添加了
sub
,因为我想绘制每个主题的平均值

my_data = data.frame(
  y=c(rnorm(1000), rnorm(1000, 0.5), rnorm(1000, 1), rnorm(1000, 1.5)),
  x=c(rep('a', 2000), rep('b', 2000)),
  m=c(rep('i', 1000), rep('j', 2000), rep('i', 1000)),
  subj=c(rep(c(rep('1',200),rep('2',200),rep('3',200),rep('4',200),rep('5',200)),4))
)

pdat <- my_data %>%
  group_by(x, m) %>%
  do(data.frame(loc = density(.$y)$x,
                dens = density(.$y)$y))

pdat$dens <- ifelse(pdat$m == 'i', pdat$dens * -1, pdat$dens)
pdat$dens <- ifelse(pdat$x == 'b', pdat$dens + 1, pdat$dens)


ggplot(pdat, aes(dens, loc, fill = m, group = interaction(m, x))) + 
  geom_polygon() +
  scale_x_continuous(breaks = 0:1, labels = c('a', 'b')) +
  ylab('density') +
  theme_minimal() +
  theme(axis.title.x = element_blank())

我得到错误:
eval(expr,envir,enclose)中的错误:未找到对象“dens”

如果我理解正确,您需要在
几何点中指定
x
y

ggplot(pdat, aes(dens, loc, fill = m, group = interaction(m, x))) + 
  geom_polygon() +
  scale_x_continuous(breaks = 0:1, labels = c('a', 'b')) +
  ylab('density') +
  theme_minimal() +
  theme(axis.title.x = element_blank()) +
  geom_point(data = meanY, aes(x = ifelse(x == "a", 0, 1), y = y, fill = m, group = interaction(m, x)), shape = 21, colour = "black", show.legend = FALSE)

在调用
geom_point()
@bouncyball-woops之后,尝试添加
+
!不是这样,但是谢谢。我来编辑这个问题。真漂亮!非常感谢。我添加了position=position\u道奇(width=0.5)以使绘图远离中间,它实现了技巧。position\u jitterdodge将(至少在常规箱线图上)将点分隔为两个填充groups@Ulrik非常有帮助,谢谢!我是通过在稍微分开的x位置上绘制它们来完成的。这个要优雅得多
ggplot(pdat, aes(dens, loc, fill = m, group = interaction(m, x))) + 
  geom_polygon() +
  scale_x_continuous(breaks = 0:1, labels = c('a', 'b')) +
  ylab('density') +
  theme_minimal() +
  theme(axis.title.x = element_blank()) +
  geom_point(data = meanY, aes(x = ifelse(x == "a", 0, 1), y = y, fill = m, group = interaction(m, x)), shape = 21, colour = "black", show.legend = FALSE)