在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
相关产品推荐
相关产品推荐

