如何为ggplot2的facet_grid分面图添加使用不同geom的边际汇总值
解决方案
该需求完全可以实现,无需通过grid包组合图形,仅需提前计算好各维度的汇总计数,配合facet_grid自带的margins参数添加边际面板,再用geom_text将汇总文本渲染到对应面板即可。
完整实现代码
library(ggplot2) library(dplyr) # 1. 计算各维度边际汇总值 ## 按cyl分组的行汇总(对应每行最右侧的am边际面板) row_margin <- mtcars %>% group_by(cyl) %>% summarise(n = n(), am = "(all)") %>% # 设定文本在面板内的显示位置,可根据需求调整 mutate(hp = quantile(mtcars$hp, 0.9), mpg = quantile(mtcars$mpg, 0.9)) ## 按am分组的列汇总(对应每列最下方的cyl边际面板) col_margin <- mtcars %>% group_by(am) %>% summarise(n = n(), cyl = "(all)") %>% mutate(hp = quantile(mtcars$hp, 0.9), mpg = quantile(mtcars$mpg, 0.9)) ## 右下角总汇总 total_margin <- tibble( cyl = "(all)", am = "(all)", n = nrow(mtcars), hp = quantile(mtcars$hp, 0.9), mpg = quantile(mtcars$mpg, 0.9) ) # 合并所有汇总数据 margin_data <- bind_rows(row_margin, col_margin, total_margin) # 2. 绘图 ggplot(mtcars, aes(hp, mpg)) + geom_point() + # 添加边际计数文本,可自定义样式 geom_text(data = margin_data, aes(label = paste0("n = ", n)), fontface = "bold", color = "#d9230f", size = 4) + facet_grid(cyl ~ am, switch = "y", margins = TRUE)
实现逻辑说明
facet_grid开启margins = TRUE后,会自动生成标记为(all)的行、列边际面板,正好对应我们需要放置汇总值的位置- 提前计算的汇总数据通过指定
cyl = "(all)/am = "(all)"与边际面板匹配,文本会自动渲染到对应位置 - 可以通过调整汇总数据里
hp、mpg的赋值修改文本在面板内的位置,也可自定义geom_text的颜色、字号、字体等样式。
内容的提问来源于stack exchange,提问作者JasonAizkalns
相关产品推荐
相关产品推荐

