我有两个因子和两个连续变量,我用它来创建一个使用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))
对此没有帮助。将因子组合成单个因子并丢弃新因子的未使用水平只能产生一维小平面网格,这不是我想要的。
注意:我的实际数据有第三个因子水平,我用不同的颜色代表它。因此,允许我保留图例的单一图解决方案将是理想的。
答案 0 :(得分:3)
手动重新排列图形对象(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);
将此扩展到更多方面很简单。
答案 1 :(得分:0)
当然,一种可能的解决方案是分别为每个因子组合创建一个图,然后使用grid.arrange()
中的gridExtra
组合它们。这可能会失去我的传奇,并且会是一种全身心的痛苦,如果有人有更好的建议,我很乐意听到。
答案 2 :(得分:0)