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

在R语言ggplot2的facet_wrap中为各分面添加不同信息表格

在ggplot2分面面板中添加自定义分组表格

我之前也碰到过这个困扰——annotate()是全局作用的,不管分面怎么分,它都会把同一个内容塞进所有面板。要实现每个分面对应不同的统计表格,核心思路是让表格数据和分面的分组变量关联起来,用支持分面的几何元素来渲染表格,而不是用annotate。

下面用一个具体的示例来演示怎么做,用经典的mtcars数据集,按气缸数(cyl)分面,每个面板添加对应组的油耗(mpg)描述性统计表格:

步骤1:准备数据和统计量

首先加载需要的包,然后计算每个分组的统计指标,注意要保留分面用的分组变量(这里是cyl):

library(ggplot2)
library(ggtext) # 提供geom_table函数
library(dplyr)

# 计算每个cyl组的mpg描述性统计
stat_df <- mtcars %>%
  group_by(cyl) %>%
  summarise(
    均值 = round(mean(mpg), 1),
    中位数 = round(median(mpg), 1),
    标准差 = round(sd(mpg), 1),
    .groups = "drop" # 取消分组
  )

步骤2:绘制分面图并添加对应表格

用geom_table()来添加表格,这个函数会识别数据中的分面变量,自动把对应组的表格放到对应面板里:

ggplot(mtcars, aes(x = disp, y = mpg)) +
  geom_point(color = "#2c3e50") + # 绘制主散点图
  facet_wrap(~cyl) + # 按cyl分面
  # 添加分组对应的统计表格
  geom_table(
    data = stat_df, # 用我们的统计表格数据
    aes(label = list(data.frame(
      统计指标 = c("均值", "中位数", "标准差"),
      数值 = c(均值, 中位数, 标准差)
    ))),
    x = Inf, y = Inf, # 把表格放在面板的右上角
    hjust = 1, vjust = 1, # 对齐方式:右对齐+上对齐
    size = 3, # 调整表格字体大小
    fill = "#f8f9fa", # 表格背景色
    col = "#2c3e50" # 表格文字颜色
  ) +
  theme_minimal() +
  theme(
    panel.background = element_rect(fill = "#ffffff", color = NA),
    strip.background = element_rect(fill = "#e9ecef", color = NA)
  )

关键细节解释:

  • geom_table的data参数传入我们的统计表格stat_df,里面包含分面变量cyl,ggplot会自动匹配每个面板对应的组;
  • label参数需要传入一个data.frame的列表,每个元素对应一个分组的表格内容;
  • 通过x=Inf和y=Inf把表格固定在面板的角落,配合hjust和vjust调整位置,避免遮挡主图数据。

进阶:自定义表格样式

如果需要更精致的表格样式(比如加粗表头、调整边框),可以结合gridExtra::tableGrob来定制表格:

library(gridExtra)

# 定义一个自定义表格函数
custom_table <- function(df) {
  tableGrob(
    df,
    theme = ttheme_minimal(
      core = list(fg_params = list(size = 9)), # 内容文字大小
      colhead = list(fg_params = list(size = 9, fontface = "bold")) # 表头加粗
    ),
    rows = NULL, # 去掉默认行名
    cols = c("统计指标", "数值") # 表头名称
  )
}

# 重新绘图
ggplot(mtcars, aes(x = disp, y = mpg)) +
  geom_point(color = "#2c3e50") +
  facet_wrap(~cyl) +
  geom_table(
    data = stat_df,
    aes(label = list(custom_table(data.frame(
      统计指标 = c("均值", "中位数", "标准差"),
      数值 = c(均值, 中位数, 标准差)
    )))),
    x = Inf, y = Inf, hjust = 1, vjust = 1
  ) +
  theme_minimal()

这样就能轻松实现每个分面面板对应不同的自定义统计表格啦!

内容的提问来源于stack exchange,提问作者letmetype

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:07:49