ggplot2技术问题:能否在后续图层中访问传入的数据集?
解决方案:链式操作中访问ggplot的上游数据集
你可以通过两种方式实现无需临时变量,直接在ggplot链式操作中访问上游处理好的数据集:
方法1:用大括号包裹ggplot代码块
利用大括号{}将ggplot的整个定义包裹起来,此时.会指代管道上游处理完成的数据集,在图层的data参数和labs中都能直接调用:
library(tidyverse) mtcars %>% # 模拟复杂的数据预处理步骤 filter(cyl %in% c(4,6)) %>% group_by(cyl, gear) %>% summarise( mpg_avg = mean(mpg), qsec_avg = mean(qsec), obs_count = n() ) %>% { ggplot(., aes(x = mpg_avg, y = qsec_avg)) + geom_point(size = 3) + # 仅对mpg_avg < 20的子集绘制连线 geom_line(data = . %>% filter(mpg_avg < 20), aes(group = cyl)) + # 显示上游数据集的总观测数 labs(caption = paste("N. obs =", NROW(.))) }
方法2:使用公式语法与.x代词
在ggplot的图层data参数和labs中,使用公式~配合.x指代上游数据集,写法更简洁:
library(tidyverse) mtcars %>% filter(cyl %in% c(4,6)) %>% group_by(cyl, gear) %>% summarise( mpg_avg = mean(mpg), qsec_avg = mean(qsec), obs_count = n() ) %>% ggplot(aes(x = mpg_avg, y = qsec_avg)) + geom_point(size = 3) + # 用.x指代上游数据集,过滤后绘制连线 geom_line(data = ~ .x %>% filter(mpg_avg < 20), aes(group = cyl)) + # 用.x获取总观测数 labs(caption = ~ paste("N. obs =", NROW(.x)))
为什么原来的.data无效?
ggplot2中的.data代词仅指代当前图层的数据集,而非传入ggplot()的整个上游数据集,因此无法用来访问初始的预处理结果。
内容的提问来源于stack exchange,提问作者cach1
相关产品推荐
相关产品推荐

