用新浪图显示多个因素

时间:2018-05-18 11:14:13

标签: r ggplot2 ggforce

注意:在与Z. Lin讨论后,我发表了更新这篇文章。最初,我将我的问题简化为双因素设计(参见" 原始问题")。但是,我的实际数据包含四个因素,需要facet_grid。因此,我在下面提供了一个四因素设计的示例(参见" 编辑")。

原始问题

假设我有一个双因素设计,dv作为我的因变量,iv.x和iv.y作为我的因子/自变量。一些快速的样本数据:

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

对位置闪避的显式调用也没有帮助,因为这会产生错误信息:

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

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

我的问题更多的是时间。我们很快就想提交一份手稿,而新浪图则是展示我们数据的绝佳方式。任何人都可以想到新浪图的解决方法,这样我仍然可以显示两个因素,例如上面的小提琴情节?

修改

四因素设计的样本数据:

    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) 

使用新浪图绘制我想创建的小提琴图的示例:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    if(section==0){

    static NSString *simpleTableIdentifier = @"ContactDetailsHeaderTableViewCell";

    ContactDetailsHeaderTableViewCell *cell = (ContactDetailsHeaderTableViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];


    if (cell == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ContactDetailsHeaderTableViewCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];

    }

    ..................
    .................

UIImage *img = [UIImage imageWithContentsOfFile:getImagePath];

        //rounded corners
        cell.profilePicImgView.clipsToBounds = YES;

        UIGraphicsBeginImageContextWithOptions(cell.profilePicImgView.bounds.size, NO, 1.0);

        // Add a clip before drawing anything, in the shape of an rounded rect
        [[UIBezierPath bezierPathWithRoundedRect:cell.profilePicImgView.bounds
                                    cornerRadius:60.0] addClip];
        // Draw your image
        [img drawInRect:cell.profilePicImgView.bounds];

        // Get the image, here setting the UIImageView image
        cell.profilePicImgView.image = UIGraphicsGetImageFromCurrentImageContext();

        // end drawing
        UIGraphicsEndImageContext();


.............
.............
}

1 个答案:

答案 0 :(得分:3)

已编辑的解决方案,因为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()&amp;中的其余代码theme()用于隐藏默认的x轴标签/刻度/网格线。

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

edited solution

原始解决方案

假设您的情节不需要刻面,您可以使用刻面模拟外观:

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

plot