You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 16:57:03