删除双向facet_grid

时间:2018-03-27 20:26:16

标签: r ggplot2

我有两个因子和两个连续变量,我用它来创建一个使用ggplot2的双向小平面图。但是,并非所有因子组合都有数据,因此我最终得到了虚拟方面。这里有一些虚拟代码可以产生等效的输出:

library(ggplot2)
dummy<-data.frame(x=rnorm(60),y=rnorm(60),
                  col=rep(c("A","B","C","B","C","C"),each=10),
                  row=rep(c("a","a","a","b","b","c"),each=10))
ggplot(data=dummy,aes(x=x,y=y))+
       geom_point()+
       facet_grid(row~col)

这会产生this figure

有没有办法删除不能绘制任何数据的方面?理想情况下,将x轴和y轴标签向上或向右移动到剩余的图?如this GIMPed version

所示

我在这里和其他地方搜索过,除非我的搜索条件不够好,否则我无法在任何地方找到同样的问题。类似的问题通常是未使用的因子水平,但这里没有使用因子水平,只有因子水平组合。因此facet_grid(drop=TRUE)ggplot(data=droplevel(dummy))对此没有帮助。将因子组合成单个因子并丢弃新因子的未使用水平只能产生一维小平面网格,这不是我想要的。

注意:我的实际数据有第三个因子水平,我用不同的颜色代表它。因此,允许我保留图例的单一图解决方案将是理想的。

3 个答案:

答案 0 :(得分:3)

手动重新排列图形对象(grobs)以实现您所追求的目标并不困难。

  1. 加载必要的库。

    library(grid);
    library(gtable);
    
  2. ggplot2地块变为grob

    gg <- ggplot(data = dummy, aes(x = x,y = y)) +
            geom_point() +
            facet_grid(row ~ col);
    grob <- ggplotGrob(gg);
    

    确定要移除的哪个方面以及要移动到哪个轴取决于grob的网格结构。 gtable_show_layout(grob)提供了网格结构的直观表示,其中(7, 4)等数字表示行7和列4中的面板。

  3. 删除空面。

    # Remove facets
    idx <- which(grob$layout$name %in% c("panel-2-1", "panel-3-1", "panel-3-2"));
    for (i in idx) grob$grobs[[i]] <- nullGrob();
    
  4. 向上移动x轴。

    # Move x axes up
    # axis-b-1 needs to move up 4 rows
    # axis-b-2 needs to move up 2 rows
    idx <- which(grob$layout$name %in% c("axis-b-1", "axis-b-2"));
    grob$layout[idx, c("t", "b")] <- grob$layout[idx, c("t", "b")] - c(4, 2);
    
  5. 将y轴向右移动。

    # Move y axes right
    # axis-l-2 needs to move 2 columns to the right
    # axis-l-3 needs ot move 4 columns to the right
    idx <- which(grob$layout$name %in% c("axis-l-2", "axis-l-3"));
    grob$layout[idx, c("l", "r")] <- grob$layout[idx, c("l", "r")] + c(2, 4);
    
  6. 剧情。

    # Plot
    grid.newpage();
    grid.draw(grob);
    
  7. enter image description here

    将此扩展到更多方面很简单。

答案 1 :(得分:0)

当然,一种可能的解决方案是分别为每个因子组合创建一个图,然后使用grid.arrange()中的gridExtra组合它们。这可能会失去我的传奇,并且会是一种全身心的痛苦,如果有人有更好的建议,我很乐意听到。

答案 2 :(得分:0)

这个特殊情况看起来像ggpairs(link到SO示例)的工作。我自己没有使用它,但对于配对图,这似乎是这项工作的最佳工具。

在更一般的情况下,在您不寻找配对的情况下,您可以尝试使用该变量(example)创建一个具有复合(粘贴)因子和facet_grid或facet_wrap的列