如何在ggplot2中替代已弃用的aes_string实现动态美学映射?
替代ggplot2中
aes_string()的程序化美学映射方案 当你有一个由字符串构成的美学映射列表,需要替代已弃用的aes_string()时,核心是要把字符串形式的列名转换成ggplot可识别的数据引用,以下是两种可靠的实现方式:
方法一:将字符串转为符号后用!!!注入
aes()函数接受符号(而非原始字符串)作为列名引用,先把列表中的字符串转换为符号,再用!!!(非标准求值注入器)传递给aes()即可:
library(ggplot2) library(rlang) my_aes_list <- list( x = "cty", y = "hwy", col = "trans" ) # 将列表中的每个字符串转为符号 my_aes_syms <- lapply(my_aes_list, sym) # 注入到aes中构建映射 ggplot(mpg) + geom_point(aes(!!!my_aes_syms))
若不想依赖rlang包,可使用基础R的as.name()替代sym():
my_aes_syms <- lapply(my_aes_list, as.name)
方法二:结合.data代词与do.call
利用.data[[var]]明确引用数据列,再通过do.call把列表传递给aes():
library(ggplot2) my_aes_list <- list( x = "cty", y = "hwy", col = "trans" ) # 用.data代词构建每个美学映射,再通过do.call整合 my_aes <- do.call(aes, lapply(my_aes_list, function(var) .data[[var]])) ggplot(mpg) + geom_point(my_aes)
为什么你之前的!!!尝试无效?
直接用aes(!!!my_aes_list)时,传递的是原始字符串,ggplot会把这些字符串当成字面常量而非数据列名——比如col = "trans"会让所有点的颜色对应字符串"trans"的字面颜色,而非根据trans列的值映射颜色,因此绘图结果不符合预期。
内容的提问来源于stack exchange,提问作者Calimo
相关产品推荐
相关产品推荐

