You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 23:34:54