如何在ggplot2的双向facet_grid中移除无数据的分面组合
移除ggplot2双向分面中的空分面
要解决facet_grid中空分面的问题,你可以根据自己想要的布局选择以下几种实用方法:
方法1:用facet_wrap()替代facet_grid()(最简单高效)
facet_wrap()默认会自动丢弃没有数据的因子组合,同时你可以通过ncol参数控制列数,模拟出类似facet_grid()的网格布局:
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_wrap(vars(row, col), ncol = 3) # ncol设为col因子的水平数,保持网格结构
这样只会显示存在数据的6个分面,空的b-A、c-A、c-B组合会被自动移除。
方法2:保留facet_grid(),启用drop和自由缩放
如果你希望保持行列的层级布局(比如每行对应一个row水平),可以给facet_grid()加上drop=TRUE(默认值,但配合自由缩放才会生效)和scales="free_x",这样每行只会显示有数据的col水平,空分面会被去掉:
ggplot(data=dummy,aes(x=x,y=y))+ geom_point()+ facet_grid(row~col, drop = TRUE, scales = "free_x")
效果是:第一行(row=a)显示A/B/C三列,第二行(row=b)只显示B/C两列,第三行(row=c)只显示C一列,完全没有空单元格。
方法3:创建组合因子(灵活自定义分面)
你可以先把row和col合并成一个新的组合因子,让这个因子只包含有数据的组合,再用分面函数:
# 创建只保留有数据的组合因子 dummy$row_col <- interaction(dummy$row, dummy$col, drop = TRUE) ggplot(data=dummy,aes(x=x,y=y))+ geom_point()+ facet_wrap(~row_col, ncol = 3)
这种方法适合需要对分面顺序、标签做自定义调整的场景。
内容的提问来源于stack exchange,提问作者TJC
相关产品推荐
相关产品推荐

