在自定义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)
解决方案
问题出在两个地方:
- 用
print(team)获取数据框名称是错误的,这会直接输出整个数据框内容,而非变量名; 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
相关产品推荐
相关产品推荐

