在ggplot2

时间:2019-06-13 21:23:13

标签: r ggplot2 violin-plot

这是一个最小的可重现示例:

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 个答案:

答案 0 :(得分:2)

一种解决方案是将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