注意:在与Z. Lin讨论之后,我已经更新了这篇文章。最初,我将问题简化为两因素设计(请参阅“原始问题”部分)。但是,我的实际数据由四个因素组成,需要facet_grid。因此,我在下面提供了一个四因素设计的示例(请参见“编辑”部分)。

原始问题

假设我有一个二因子设计,其中dv是我的因变量,iv.x和iv.y是我的因数/自变量。一些快速的样本数据:

DF <- data.frame(dv = rnorm(900),
                 iv.x = sort(rep(letters[1:3], 300)),
                 iv.y = rep(sort(rep(rev(letters)[1:3], 100)), 3))


我的目标是像显示小提琴图一样单独显示每个条件:

ggplot(DF, aes(iv.x, dv, colour=iv.y)) + geom_violin()


我最近遇到过新浪地块,并希望在此做同样的事情。不幸的是,新浪地块不这样做,而是折叠数据。

ggplot(DF, aes(iv.x, dv, colour=iv.y)) + geom_sina()


显式调用位置闪避也无济于事,因为这会产生错误消息:

ggplot(DF, aes(iv.x, dv, colour=iv.y)) + geom_sina(position = position_dodge(width = 0.5))


新浪地块的作者已在2016年意识到此问题:
https://github.com/thomasp85/ggforce/issues/47

我的问题更多是在时间方面。我们很快想提交一份手稿,而新浪图将是显示我们的数据的好方法。谁能想到一个新浪乐曲的解决方法,这样我仍然可以像上面小提琴乐曲的例子一样显示两个因素?

编辑

四因素设计的样本数据:

    DF <- data.frame(dv=rnorm(400),
             iv.w=sort(rep(letters[1:2],200)),
             iv.x=rep(sort(rep(letters[3:4],100)), 2),
             iv.y=rep(sort(rep(rev(letters)[1:2],50)),4),
             iv.z=rep(sort(rep(letters[5:6],25)),8))


一个小提琴情节的例子,我想用新浪情节创作:

    ggplot(DF, aes(iv.x, dv, colour=iv.y)) +
      facet_grid(iv.w ~ iv.z) +
      geom_violin(aes(y = dv, fill = iv.y),
          position = position_dodge(width = 1))+
      stat_summary(aes(y = dv, fill = iv.y), fun.y=mean, geom="point",
          colour="black", show.legend = FALSE, size=.2,
          position=position_dodge(width=1))+
      stat_summary(aes(y = dv, fill = iv.y), fun.data=mean_cl_normal, geom="errorbar",
          position=position_dodge(width=1), width=.2, show.legend = FALSE,
          colour="black", size=.2)

最佳答案

编辑的解决方案,因为OP阐明了方面是必需的:

ggplot(DF, aes(x = interaction(iv.y, iv.x),
               y = dv, fill = iv.y, colour = iv.y)) +
  facet_grid(iv.w ~ iv.z) +
  geom_sina() +
  stat_summary(fun.y=mean, geom="point",
               colour="black", show.legend = FALSE, size=.2,
               position=position_dodge(width=1))+
  stat_summary(fun.data=mean_cl_normal, geom="errorbar",
               position=position_dodge(width=1), width=.2,
               show.legend = FALSE,
               colour="black", size=.2) +
  scale_x_discrete(name = "iv.x",
                   labels = c("c", "", "d", "")) +
  theme(panel.grid.major.x = element_blank(),
        axis.text.x = element_text(hjust = -4),
        axis.ticks.x = element_blank())


这种方法不是使用构面来模拟颜色之间的躲避,而是创建了一个新变量interaction(colour.variable, x.variable)映射到x轴。

scale_x_discrete()theme()中的其余代码可以隐藏默认的x轴标签/刻度线/网格线。

axis.text.x = element_text(hjust = -4)是一种可将x轴标签移动到大约正确位置的技巧。这很丑陋,但是考虑到用例是手稿的提交,我认为图的大小将是固定的,您只需要对其进行一次调整即可。

r - 用新浪图显示多个因素-LMLPHP

原始解决方案:

假设您的绘图不需要其他方面,则可以使用方面模拟外观:

ggplot(DF, aes(x = iv.y, y = dv, colour = iv.y)) +
  geom_sina() +
  facet_grid(~iv.x, switch = "x") +
  labs(x = "iv.x") +
  theme(axis.text.x = element_blank(),      # hide iv.y labels
        axis.ticks.x = element_blank(),     # hide iv.y ticks
        strip.background = element_blank(), # make facet strip background transparent
        panel.spacing.x = unit(0, "mm"))    # remove horizontal space between facets


r - 用新浪图显示多个因素-LMLPHP

08-19 23:07