使用dplyr管道传递数据时如何在ggrepel中对继承数据取子集
问题解决方法
你遇到的报错核心原因是:在geom_text_repel中直接调用了全局环境里的原始mtcars数据集取子集,没有用到管道中mutate生成新列后的中间数据集,因此找不到eng_size字段。以下两种方案都不需要修改原始数据集即可解决问题:
方案1:使用ggplot2的lambda表达式指代继承数据集(推荐)
ggplot2 3.0.0及以上版本支持在图层的data参数中用波浪号~指代ggplot顶层传入的父数据集,直接基于该数据集取子集即可:
library(dplyr) library(ggplot2) library(ggrepel) mtcars %>% mutate(eng_size = ifelse(cyl >= 6, "large", "small")) %>% ggplot(aes(x = mpg, y = qsec, label = eng_size)) + geom_point() + # ~.x 指代顶层传入ggplot的中间处理后数据集 geom_text_repel(data = ~subset(.x, qsec >= 18))
方案2:用大括号包裹绘图流程引用中间数据集
如果需要兼容旧版本ggplot,可以用管道的大括号语法,用.指代管道处理后的中间数据集,再分别传给ggplot和子集操作:
mtcars %>% mutate(eng_size = ifelse(cyl >= 6, "large", "small")) %>% { ggplot(., aes(x = mpg, y = qsec, label = eng_size)) + geom_point() + # 用.指代经过mutate后的中间数据集取子集 geom_text_repel(data = subset(., qsec >= 18)) }
内容的提问来源于stack exchange,提问作者bkleiboeker
相关产品推荐
相关产品推荐

