ggplot2分面且Y轴自由时如何让瓦片图填满绘图区域?
问题原因
geom_tile() 默认生成的瓦片高度为固定值1,A分组Y轴相邻取值差为1,刚好和默认高度匹配,所以瓦片可以铺满分面;B分组Y轴相邻取值差为10,默认高度1的瓦片在跨度更大的Y轴上就会显示为细窄条带。
解决方案
给瓦片设置和分组Y轴间隔匹配的高度即可,不需要修改分面的自由缩放设置,下面提供两种实现方式:
通用写法(适配任意分组Y间隔)
不需要手动匹配每组的Y间隔,代码可复用性更高:
library(ggplot2) library(dplyr) X <- 1:3 Y1 <- 1:3 Y2 <- seq(10, 30, 10) Y <- c(rep(Y1,3), rep(Y2,3)) Grid <- 1:3 Group <- c("A", "B") DF <- expand.grid(Grid = Grid, X = X, Group = Group) DF$Y <- Y DF$Grid <- NULL DF$Z <- 1:18 # 按分组计算Y轴的相邻取值间隔作为瓦片高度 DF <- DF %>% group_by(Group) %>% mutate(tile_height = min(diff(sort(unique(Y))))) %>% ungroup() ggplot(data = DF, aes(x = X, y = Y, fill = Z)) + # 映射height参数为计算好的瓦片高度 geom_tile(aes(height = tile_height)) + facet_wrap(~ Group, scales = "free_y")
示例简写写法(无需额外加载包)
针对本示例的场景可以直接简化书写:
library(ggplot2) X <- 1:3 Y1 <- 1:3 Y2 <- seq(10, 30, 10) Y <- c(rep(Y1,3), rep(Y2,3)) Grid <- 1:3 Group <- c("A", "B") DF <- expand.grid(Grid = Grid, X = X, Group = Group) DF$Y <- Y DF$Grid <- NULL DF$Z <- 1:18 ggplot(data = DF, aes(x = X, y = Y, fill = Z)) + geom_tile(height = ifelse(Group == "A", 1, 10)) + facet_wrap(~ Group, scales = "free_y")
两种写法都可以让两个分面的瓦片都铺满对应区域,同时保留Y轴自由缩放的设置。
内容的提问来源于stack exchange,提问作者Daniel Valencia C.
相关产品推荐
相关产品推荐

