使用aes_str将列名作为函数参数 实现ggplot双密度图叠加
实现方案
ggplot2 目前更推荐使用整洁评估语法实现动态参数传递,完全可以覆盖两层密度图的传参需求,替换已软弃用的aes_string即可,完整实现如下:
library(ggplot2) # 自定义双密度叠加图函数 # 参数说明: # data:输入数据框 # x_col:待绘制密度的数值列,直接传列名无需加引号 # group_col:分组列,直接传列名无需加引号 # scale_factor:分组密度的缩放系数,默认0.01匹配原逻辑 plot_double_density <- function(data, x_col, group_col, scale_factor = 0.01) { ggplot(data) + # 第一层:全量数据总体密度 geom_density(aes(x = {{ x_col }})) + # 第二层:按组拆分的密度 geom_density(aes( x = {{ x_col }}, y = after_stat(count) * scale_factor, group = {{ group_col }}, fill = as.character({{ group_col }}) ), alpha = 0.2) } # 调用示例,和原效果完全一致 plot_double_density(mtcars, x_col = mpg, group_col = cyl)
如果你需要传入字符串格式的列名,可以用.data代词适配:
plot_double_density_str <- function(data, x_col_str, group_col_str, scale_factor = 0.01) { ggplot(data) + geom_density(aes(x = .data[[x_col_str]])) + geom_density(aes( x = .data[[x_col_str]], y = after_stat(count) * scale_factor, group = .data[[group_col_str]], fill = as.character(.data[[group_col_str]]) ), alpha = 0.2) } # 字符串传参调用示例 plot_double_density_str(mtcars, x_col_str = "mpg", group_col_str = "cyl")
内容的提问来源于stack exchange,提问作者keenan
相关产品推荐
相关产品推荐

