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

在自定义R函数中为ggplot2洛伦兹曲线添加数据框名称标题

解决ggplot2洛伦兹曲线函数中数据框名称添加到标题的问题

我编写了一个自定义函数,传入数据框后用ggplot2绘制洛伦兹曲线并计算GINI系数。目前函数能正常生成图形,但无法将传入的数据框名称添加到图形标题中,以下是我的代码:

## func for Lorenz curve & GINI 

lorenz <- function(team){
  
  team <- team %>% arrange(PTS)
  team$Count = 1:nrow(team)
  team$PTSPERC <- ((team$PTS)/(sum(team$PTS)))
  
  team$CUMSUMPTS <- cumsum(team$PTSPERC)
  
  team <- team %>% 
    count(Count) %>% 
    mutate(Cum = cumsum(n)/sum(n)) %>% 
    select(-n) %>% 
    right_join(team) %>%
    select(names(team), everything())
  
  print(ggplot(team, aes(x = Cum, y = CUMSUMPTS))+
    geom_abline(intercept = 0, slope = 1)+
    geom_smooth() + 
    ylab("Quartiles of Points")+
    xlab("Quartiles")+
    theme_minimal()+
      labs(title = paste(print(team),"-  Lorenz Curve")))+
    annotate("text", x=.25, y=.82, label = paste("GINI coeff",signif(Gini(team$PTS),4)))
  
  Gini(team$PTS)
}

##

distplot(BUT)
lorenz(BUT)

解决方案

问题出在两个地方:

  1. 用print(team)获取数据框名称是错误的,这会直接输出整个数据框内容,而非变量名;
  2. print(ggplot(...)) + annotate(...)的写法逻辑错误,print()返回NULL,无法继续叠加图层。

修改后的完整代码:

## func for Lorenz curve & GINI 

lorenz <- function(team){
  # 获取传入的数据框的字符串名称
  team_name <- deparse(substitute(team))
  
  team <- team %>% arrange(PTS)
  team$Count = 1:nrow(team)
  team$PTSPERC <- ((team$PTS)/(sum(team$PTS)))
  
  team$CUMSUMPTS <- cumsum(team$PTSPERC)
  
  team <- team %>% 
    count(Count) %>% 
    mutate(Cum = cumsum(n)/sum(n)) %>% 
    select(-n) %>% 
    right_join(team) %>%
    select(names(team), everything())
  
  # 整合所有图层到ggplot对象后再打印
  p <- ggplot(team, aes(x = Cum, y = CUMSUMPTS))+
    geom_abline(intercept = 0, slope = 1)+
    geom_smooth() + 
    ylab("得分分位数")+
    xlab("分位数")+
    theme_minimal()+
    labs(title = paste(team_name,"- 洛伦兹曲线")) +
    annotate("text", x=.25, y=.82, label = paste("GINI系数",signif(Gini(team$PTS),4)))
  
  print(p)
  # 返回GINI系数
  Gini(team$PTS)
}

## 使用示例
# distplot(BUT)
lorenz(BUT)

关键说明:

  • deparse(substitute(team))可以提取传入参数的字符串形式名称,比如传入BUT就会得到字符串"BUT";
  • 将所有图层(包括annotate)整合到同一个ggplot对象中,再执行打印操作,确保图形元素完整;
  • 中文标签可根据需求自行改回英文。

内容的提问来源于stack exchange,提问作者Joseph cotton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:05:47