如何使用自定义函数更改geom_text()中的文本标签

时间:2017-12-18 03:22:19

标签: r ggplot2

我有一些数据,我想使用stat_count()中的一些变量来标记条形图。

这就是我想要做的事情:

library(ggplot2)
library(scales)
percent_and_count <- function(pct, cnt){
  paste0(percent(pct), ' (', cnt, ')')
}

ggplot(aes(x=Type)) + 
 stat_count(aes(y=(..prop))) + 
 geom_text(aes(y=(..prop..), label=percent_and_count(..prop.., ..count))), 
  stat='count')

然而,我得到了这个错误,因为它无法找到我假设的功能是基本包或数据框:

  

eval(expr,envir,enclos)出错:找不到函数&#34; percent_and_count&#34;

如果我percent(..prop..),我也会收到此错误,尽管scales::percent(..prop..)没问题。我没有从包中加载我的函数。

如果一切都失败了,我可以做到

geom_text(aes(y=(..prop..), label=utils::getAnywhere('percent_and_count')$objs[[1]]((..prop..),(..count..))))

但这对于应该是一项愚蠢的简单任务来说似乎是不必要的迂回。

1 个答案:

答案 0 :(得分:1)

您可以使用bquoteaes_

# Sample data
set.seed(2017);
df <- data.frame(
    Type = sample(6, 100, replace = T)
);

library(ggplot2);
library(scales);

# Your custom function
percent_and_count <- function(pct, cnt){
  paste0(percent(pct), ' (', cnt, ')')
}

ggplot(df, aes(x = Type)) +
 stat_count(aes(y = ..prop..)) +
 geom_text(
     stat = "count",
     aes_(
         y = ~(..prop..), 
         label = bquote(.(percent_and_count)((..prop..), (..count..)))))

enter image description here

说明:bquote(.(percent_and_count)(...))确保找到percent_and_count(在父环境中评估术语.(...))。然后,我们使用aes_确保正确评估带引号的表达式(~bquote)。

仍然不漂亮,但可能比使用utils::getAnywhere更直接。