首页 文章

在双向facet_grid中删除未使用的构面组合

提问于
浏览
0

我有两个因素和两个连续变量,我用它来创建一个使用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

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

    • 加载必要的库 .
    library(grid);
    library(gtable);
    
    • 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 中的面板 .

    • 删除空面 .
    # 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();
    
    • 向上移动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);
    
    • 将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);
    
    • 剧情 .
    # Plot
    grid.newpage();
    grid.draw(grob);
    

    enter image description here

    将其扩展到更多方面非常简单 .

  • 2

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

  • 0

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

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

相关问题