【问题标题】:Overlay scatterpoints on split violin plot with ggplot2使用 ggplot2 在分割小提琴图上叠加散点
【发布时间】:2016-07-26 13:00:57
【问题描述】:

我按照this 很好的答案在 2x2 设计中生成分割小提琴图

现在假设这些数据来自不同主题的重复测量。另外,我想在散点图中绘制单个数据(我知道该图可能最终太忙,我想先看看它)。

我快到了,但有一个小错误可能很容易修复。如果有更好的方法可以做到这一点,我会提供一个完整的工作示例。

这第一部分是我直接从上一个问题中复制过来的:

library(dplyr)
library(ggplot2)

set.seed(20160229)

我将subj 添加到我的数据框中,因为我想绘制每个主题的平均值

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())

到目前为止,效果很好。现在我尝试为每个主题添加我的平均值

meanY = aggregate(y ~ x + m + subj, my_data, mean, drop=TRUE)


ggplot(pdat, aes(dens, loc, fill = m, group = interaction(m, x))) + 
  geom_polygon() +
  geom_point(data=meanY, aes(fill = m, group = interaction(m, x))) +
  scale_x_continuous(breaks = 0:1, labels = c('a', 'b')) +
  ylab('density') +
  theme_minimal()

我收到错误:Error in eval(expr, envir, enclos) : object 'dens' not found

【问题讨论】:

  • 尝试在调用geom_point()后添加+
  • @bouncyball 哇!不是这样,但谢谢。我将编辑问题。

标签: r ggplot2 scatter-plot violin-plot


【解决方案1】:

如果我理解正确,您需要在geom_point 中指定xy

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)

【讨论】:

  • 漂亮!谢谢你。我添加了 position = position_dodge(width=0.5) 以使图远离中间,它成功了。
  • position_jitterdodge 将(至少在常规箱线图中)将点分成两个填充组
  • @Ulrik 非常有帮助,谢谢!我是通过将它们绘制在稍微分开的 x 位置上来完成的。这更优雅
猜你喜欢
  • 2016-06-13
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
  • 2019-12-18
  • 2014-09-18
  • 2022-07-14
相关资源
最近更新 更多