R:如何在函数中将参数传递给ggplot geom_?

时间:2017-05-19 19:41:08

标签: r ggplot2

我正在尝试创建一个结合了多个geom_的实用程序函数,就像在这个示例中一样(不起作用):

my_geom_y <- function(yy, colour){
  geom_line(aes(y=yy), col=colour) + geom_point(aes(y=yy), col=colour)
}

然后我可以这样做:

myX <- 0:90
ggplot(mapping = aes(x=myX)) + my_geom_y(dlnorm(myX), "red") + my_geom_y(dexp(myX), "blue")

这可能吗?
我尝试使用get()eval()substitute()as.name()但无济于事。 查看相关帖子:passing parameters to ggplotUse of ggplot() within another function in R没有帮助。

3 个答案:

答案 0 :(得分:3)

我喜欢MSM的方法,但如果您希望能够将my_geom_y添加到您已经制作的ggplot中,这可能是您可能适合的选择:

library(ggplot2)
x <- 1:100

my_geom_y <- function(yy, colour = "black"){
  list(
    geom_line(mapping = aes(y= yy), 
              col = colour), 
              data = data.frame(x, yy),
    geom_point(mapping = aes(y = yy), 
               col = colour, 
               data = data.frame(x, yy))
  )
 }

ggplot(mapping = aes(x))  + 
  my_geom_y(x, "red") + 
  my_geom_y(dlnorm(x), "blue") +
  my_geom_y((x^1.1), "black") +
  my_geom_y(x/2, "yellow")

enter image description here

答案 1 :(得分:1)

我没有足够的声誉来发表评论所以这是一个建议:

my_geom_y <- function(xx, yy, colour){
    ggplot() + 
    geom_line(aes(x=xx, y=yy), col=colour) + 
    geom_point(aes(x=xx, y=yy), col=colour)
}

这将创建一个图。要创建多个输入,您需要将输入作为列表传递给函数,并在函数内为每个geom循环(因为我们无法添加两个或更多ggplot对象) - 如果这是有意义的。

答案 2 :(得分:0)

基于@ luke-c的想法,这使得该功能独立,切割准备就绪。我们现在还可以为每条曲线添加标签。

my_geom_y <- function(.xx, .yy, yLabel = 1, .colour=NA ){
  if (is.na(.colour)) 
    .colour <- palette()[yLabel%%length(palette())]
  list( geom_line(mapping=aes(.xx,.yy), col=.colour,  data=data.frame(.xx, .yy)), 
        geom_point(mapping=aes(.xx,.yy), col=.colour, data=data.frame(.xx, .yy)),
        annotate(geom="text" , col = .colour, label=deparse(substitute(.yy)),
                 x=mean(.xx),y=max(.yy)-(max(.yy)-min(.yy))/20*yLabel)
        )
}
myX <- 1:10
ggplot() + my_geom_y(myX, dlnorm(myX), 1) + 
           my_geom_y(myX, dexp(myX), 2) + my_geom_y(myX, dexp(myX,0.7), 3)

当您需要在视觉上比较多个分布时,此功能会变得很方便。

enter image description here