如何为ggplot定义可被下游几何对象共享的自定义参数?
在ggplot堆叠组件间共享自定义参数
编辑及摘要
- 希望实现类似以下的参数共享形式:
或ggplot(my_arg="foo") + geom_my(my_arg)ggplot() + some_wrapper(my_arg = "foo") + geom_my(my_arg) - 已有回复显示该形式似乎无法实现,结合实际使用场景进一步提问。
实际使用场景:地球化学蛛网图
在地球化学领域,蛛网图属于平行坐标图的一种,绘制时需要按固定顺序排列元素,并将元素浓度除以对应参考值(如La/0.310、Ce/0.808这类计算逻辑)。
基于《ggplot2实战》的基础代码,我修改出了支持自定义归一化方案的工具函数:
spider_data<-function(df,norm){ elt <- names(norm) df %>% mutate(across(elt, ~ .x / norm[cur_column()] ) ) %>% # 添加行标识符 rowid_to_column(var = ".row") %>% # 转换为长格式 pivot_longer(cols = all_of(elt), names_to = "Element", values_to = "Normalized") %>% {.} -> df_out return(df_out) } gg_spider <- function(df=NULL){ ggplot(df, aes(x=Element, y=Normalized, group = .row))+ scale_x_discrete() }
当前代码可正常完成绘图任务:
## 模拟数据 df1 <- tibble(a=c(1,2),b=c(2,3),d=c(4,2)) df2 <- tibble(a=c(2,1),b=c(4,1),d=c(4,3)) ## 归一化方案 mynorm <- c(a=1,b=2,d=3) ## 使用示例 spider_data(df1,mynorm) %>% gg_spider()+ geom_line() gg_spider()+ geom_line(data=spider_data(df2,mynorm),col="red") spider_data(df1,mynorm) %>% gg_spider()+ geom_line()+ geom_line(data=spider_data(df2,mynorm),col="red") gg_spider()+ geom_line(data=spider_data(df2,mynorm),col="red")+ geom_point(data=spider_data(df1,mynorm))
期望优化的工作流
从逻辑上,归一化方案应该绑定到绘图本身(不同数据集使用不同归一化方案没有意义),希望实现如下更简洁的用户端代码形式:
# 无法运行的理想代码 gg_spider(norm=mynorm)+ geom_line(data=df2,col="red")+ geom_line(data=df1)
尝试修改gg_spider函数但报错:
# 无法运行的尝试代码 gg_spider <- function(df=NULL, norm){ ggplot(df, aes(x=Element, y=Normalized, group = .row), norm=norm)+ scale_x_discrete() } # 调用时错误:Problematic argument: norm (...)
尝试自定义geom函数,但由于spider_data()需要norm参数,无法从ggplot对象中获取该参数:
# 无法运行的尝试代码 geom_my_line <- function(df=NULL){ geom_line(spider_data(df)) }
*问题:是否可以为ggplot()定义一个通用的自定义参数,让下游的geom_函数能够获取到该参数?
内容的提问来源于stack exchange,提问作者jfmoyen
相关产品推荐
相关产品推荐

