删除 2-way facet_grid 中未使用的 facet 组合

TJC*_*TJC 1 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)
Run Code Online (Sandbox Code Playgroud)

这产生了这个数字

有没有办法删除不绘制任何数据的方面?并且,理想情况下,将 x 和 y 轴标签向上或向右移动到其余图?如这个 GIMPed 版本所示

我已经在这里和其他地方搜索过,除非我的搜索词不够好,否则我在任何地方都找不到相同的问题。类似的问题通常是未使用的因子水平,但这里没有未使用的因子水平,只是因子水平组合。所以facet_grid(drop=TRUE)ggplot(data=droplevel(dummy))在这里没有帮助。将这些因素组合成一个单一的因素并删除新因素的未使用级别只能产生一维面网格,这不是我想要的。

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

Mau*_*ers 5

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

  1. 加载必要的库。

    library(grid);
    library(gtable);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 把你的ggplot2情节变成一个grob.

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

    确定要删除的方面以及要移动的轴的位置取决于grob. gtable_show_layout(grob)给出您的网格结构的可视化表示,其中数字(7, 4)表示 row7和 column 中的面板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();
    
    Run Code Online (Sandbox Code Playgroud)
  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);
    
    Run Code Online (Sandbox Code Playgroud)
  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);
    
    Run Code Online (Sandbox Code Playgroud)
  6. 阴谋。

    # Plot
    grid.newpage();
    grid.draw(grob);
    
    Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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

  • 冒着陈述显而易见的风险:是否没有选项可以根据某些条件自动搜索要删除的面板? (2认同)