R语言ggplot标题使用变量异常:显示变量值而非变量名
修复ggplot动态标题显示变量名而非取值的问题
问题描述
调用自定义的plotbmi函数并传入data$region时,绘图标题显示为BMI boxplot split up by northeast(northeast是region变量的其中一个取值),但期望标题是BMI boxplot split up by regions——也就是要显示变量名称,不是变量的具体取值。
原代码
plotbmi <- function(variable) { plot <- ggplot(data = data, aes(variable, bmi))+ geom_boxplot()+ labs(title = paste("BMI boxplot split up by", variable)) ylab('BMI')+ theme_bw()+ theme(plot.title = element_text(size=14, hjust = 0.5, face = 'bold')) return(plot) } plotbmi(data$region)
问题根源
你传入data$region时,本质是把这个变量的所有取值传递给了variable参数,paste函数会自动取变量的第一个值来拼接字符串,所以标题才会显示某个具体的区域值,不是变量名。
另外原代码里还有个小问题:ylab('BMI')前面没有+,这会导致它没有被加入到ggplot对象中,修复的时候顺便处理了这个问题。
两种修复方案
方案1:传递变量名字符串
修改函数,让参数接收变量名的字符串,用get()在函数内获取对应变量:
plotbmi <- function(var_name) { plot <- ggplot(data = data, aes(x = get(var_name), y = bmi)) + geom_boxplot() + labs(title = paste("BMI boxplot split up by", var_name), y = 'BMI') + theme_bw() + theme(plot.title = element_text(size=14, hjust = 0.5, face = 'bold')) return(plot) } # 调用时传入变量名字符串 plotbmi("region")
方案2:用非标准求值保留原调用方式
借助rlang包的ensym()捕获变量名,这样你还是可以用plotbmi(data$region)的方式调用:
library(rlang) plotbmi <- function(variable) { # 捕获变量的符号并转为字符串 var_name <- as_name(ensym(variable)) plot <- ggplot(data = data, aes(x = !!ensym(variable), y = bmi)) + geom_boxplot() + labs(title = paste("BMI boxplot split up by", var_name), y = 'BMI') + theme_bw() + theme(plot.title = element_text(size=14, hjust = 0.5, face = 'bold')) return(plot) } # 调用方式不变 plotbmi(data$region)
内容的提问来源于stack exchange,提问作者JohnFire
相关产品推荐
相关产品推荐

